<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          ARM分散加載文件

          作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
          (一)原理

          ARM的連接器提供了一種分散加載機(jī)制,在連接時(shí)可以根據(jù)分散加載文件(.scf文件)中指定的存儲(chǔ)器分配方案,將可執(zhí)行鏡像文件分成指定的分區(qū)并定位于指定的存儲(chǔ)器物理地址。這樣,當(dāng)嵌入式系統(tǒng)在復(fù)位或重新上電時(shí),在對(duì)CPU相應(yīng)寄存器進(jìn)行初始化后,首先執(zhí)行ROM存儲(chǔ)器的Bootloader代碼,根據(jù)連接時(shí)的存儲(chǔ)器分配方案,將相應(yīng)代碼和數(shù)據(jù)由加載地址拷貝到運(yùn)行地址,這樣,定位在RAM存儲(chǔ)器的代碼和數(shù)據(jù)就在RAM存儲(chǔ)器中運(yùn)行,而不再?gòu)腞OM存儲(chǔ)器中取數(shù)據(jù)或取指令,從而大大提高了CPU的運(yùn)行速率和效率。

          本文引用地址:http://www.ex-cimer.com/article/201611/317889.htm

          (二)結(jié)構(gòu)

          Scatlertoading的存儲(chǔ)區(qū)塊可以分成二種類型:

          裝載區(qū):當(dāng)系統(tǒng)啟動(dòng)或加載時(shí)應(yīng)用程序的存放區(qū)。
          執(zhí)行區(qū):系統(tǒng)啟動(dòng)后,應(yīng)用程序進(jìn)行執(zhí)行和數(shù)據(jù)訪問(wèn)的存儲(chǔ)器區(qū)域,系統(tǒng)在實(shí)時(shí)運(yùn)行時(shí)可以有一個(gè)或多個(gè)執(zhí)行塊。

          (三)分散加載時(shí)連接器生成的預(yù)定義符號(hào)

          在編譯連接時(shí)如果指定了分散加載文件(.scf文件),在連接后會(huì)自動(dòng)生成如下變量:


          (四)具體例子說(shuō)明

          ;ROM_LOAD為加載區(qū)的名稱,其后面的0x00000000表示加載區(qū)的起始地址(存放程序代碼的起始地址)
          ROM_LOAD 0x0
          {
          ;ROM_EXEC描述了執(zhí)行區(qū)的地址,放在第一塊位置定義
          ROM_EXEC 0x00000000
          {
          ;從起始地址開始放置向量表(即Startup.o(vectors, +First),其中Startup.o為Startup.s的目標(biāo)文件)

          ;+First表示Vector段放在最前面

          ;AREAvectors, CODE, READONLY
          Startup.o (vectors, +First)
          ;接著放置其它代碼(即* (+RO)),* 是通配符,類似WINDOW下搜索用的通配符
          * (+RO)
          }
          ;變量區(qū)IRAM的起始地址為0x40000000
          IRAM 0x40000000
          {
          ;放置Startup.o (MyStacks)
          Startup.o (MyStacks)
          }
          ;+0表示接著上一段,UNINIT表示不初始化
          STACKS_BOTTOM +0 UNINIT
          {
          ;放置AREA StackBottom, DATA, NOINIT
          Startup.o (StackBottom)
          }
          ;接著從0x40004000開始,放置AREAStacks, DATA, NOINIT,UNINIT表示不初始化
          STACKS 0x40004000 UNINIT
          {
          Startup.o (Stacks)
          }
          ;外部RAM從0x80000000開始為變量區(qū)

          ;如果片外RAM起始地址不為0x8000 0000,則需要修改mem_.scf文件
          ERAM 0x80000000
          {
          * (+RW,+ZI)
          }
          ;+0表示接著上一段,UNINIT表示不初始化
          HEAP +0 UNINIT
          {
          ;放置堆底,AREA Heap, DATA, NOINIT
          Startup.o (Heap)
          }
          ;接著在外部0x80080000放置堆頂

          ;這個(gè)地址是片外RAM 的結(jié)束地址,根據(jù)實(shí)際情況修改
          HEAP_BOTTOM 0x80080000 UNINIT
          {
          Startup.o (HeapTop)
          }
          }

          以上分散文件的可引用的段名

          |Image$$ROM_LOAD $$Limit|

          |Image$$ROM_EXEC $$Limit|

          。。。。。。。。。。。。。。。。

          ;重定向__user_initial_stackheap 函數(shù)

          ;分配新的bottom_of_heap地址等,R0-R3是函數(shù)必須的返回值,返回bottom_of_heap的值

          ;通過(guò)分散加載描述文件,重定向其位置,bottom_of_heap等已經(jīng)在Startup.s中定義為DATA類型

          __user_initial_stackheap
          LDR r0,=bottom_of_heap
          ; LDR r1,=StackUsr
          LDR r2,=top_of_heap
          LDR r3,=bottom_of_Stacks
          MOV pc,lr



          關(guān)鍵詞: ARM分散加載文

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();