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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式軟件開(kāi)發(fā)之: 映像文件存儲(chǔ)器映射調(diào)整

          嵌入式軟件開(kāi)發(fā)之: 映像文件存儲(chǔ)器映射調(diào)整

          作者: 時(shí)間:2013-09-30 來(lái)源:網(wǎng)絡(luò) 收藏

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

          2.為執(zhí)行域確定固定地址

          可以在執(zhí)行區(qū)描述中使用FIXED屬性來(lái)創(chuàng)建根區(qū),該根區(qū)在固定地址載入和執(zhí)行。

          FIXED可以用于在單一加載域內(nèi)(因此通常用于單個(gè)ROM設(shè)備)創(chuàng)建多個(gè)根區(qū)。

          例如,使用FIXED屬性將函數(shù)或數(shù)據(jù)塊(如常數(shù)表或校驗(yàn)和)放在ROM中的固定地址,這樣就可以使用指針很方便的對(duì)其進(jìn)行訪問(wèn)。

          下面的例子顯示了如何放置單個(gè)目標(biāo)內(nèi)容。

          LOADREG1 0x0 0x10000

          {

          EXECREG1 0x0 0x1000 ;啟動(dòng)域,包含初始化代碼

          { ;將初始化代碼放在0x0地址

          init.o (Init, +FIRST)

          * (+RO) ;隨后排放余下的只讀數(shù)據(jù)

          }

          RAM 0x400000 0x2000 ;將可讀可寫(xiě)數(shù)據(jù)放在0x400000地址

          {

          * (+RW +ZI)

          }

          DATABLOCK 0x4FF00 FIXED 0xFF ;執(zhí)行域放在 0x4FF00地址

          { ;限制該域的最大長(zhǎng)度為 0xFF

          data.o(+RO-DATA) ;將只讀數(shù)據(jù)放在0x1FF00 和 0x1FFFF之間

          }

          }

          通過(guò)上面的Scatter文件,可以將初始化代碼放在0x0處,其后是其他RO代碼和除了data.o對(duì)象中的RO數(shù)據(jù)之外的所有RO數(shù)據(jù);所有全局的RW變量放在RAM中0x400000處;最好將data.o的RO-DATA只讀數(shù)據(jù)表放在地址0x4FF00處,并指定其最大長(zhǎng)度為0xFF。

          上例將代碼或數(shù)據(jù)對(duì)象放在其各自的源文件中,然后放置目標(biāo)文件域,這些操作方式是ARM公司建議的標(biāo)準(zhǔn)編碼方式。為方便起見(jiàn),可以使用編譯指示#pragma和分散載入描述文件放置已命名的域。下面的例子創(chuàng)建模塊dump.c并顯式命名域。

          // file dump.c

          int a = 10; // 放入數(shù)據(jù)域

          short b[100]; // 放入bss段

          int const c[3] = {1,2,3}; // 放入.constdata段

          int func1(int a) {return a*1;} // 放入.text段

          #pragma arm section rwdata = foo, code =foo

          int x = 5; // 在foo的數(shù)據(jù)域

          char *s = abc; // s3在code段, abc 在 .constdata

          int func2(int x) {return x+1;} // 放入foo的.text段

          #pragma arm section code, rwdata // 返回

          使用下面的Scatter文件指定上面的代碼在內(nèi)存中的放置位置。如果代碼和數(shù)據(jù)段的名稱相同,則首先放置代碼段。

          FLASH 0x10000000 0x2000000

          {

          FLASH 0x10000000 0x2000000

          {

          init.o (Init, +First) ; 放置初始化代碼

          * (+RO) ;

          }

          RAM 0x0000

          {

          vectors.o (Vect, +First) ; 放置向量表

          * (+RW,+ZI) ;

          }

          DUMP 0x08000000

          {

          dump.o (foo) ;

          }

          }

          通過(guò)上面的Scatter文件,將init中的初始化段放在0x10000000地址,并將除foo外的只讀數(shù)據(jù)func1和c[]放在該初始段的后面;接下來(lái)的執(zhí)行域RAM放置向量表;最后的DUMP域放置由#pragma指定的段dump。

          存儲(chǔ)器相關(guān)文章:存儲(chǔ)器原理




          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(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); })();