一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>嵌入式開發(fā)>嵌入式軟件開發(fā)之進(jìn)一步存儲(chǔ)器映射考慮事項(xiàng)

嵌入式軟件開發(fā)之進(jìn)一步存儲(chǔ)器映射考慮事項(xiàng)

2017-10-19 | rar | 0.4 MB | 次下載 | 1積分

資料介紹

上一節(jié)介紹了如何使用Scatter文件對(duì)程序的代碼和數(shù)據(jù)進(jìn)行放置。但這些方法只有在外設(shè)和堆棧限制在源文件或頭文件中定義好的前提下才能使用。為了增加程序的靈活性,最好在Scatter文件中設(shè)置這些信息,本節(jié)將介紹這些方法。
  13.6.1 在Scatter文件中定位目標(biāo)外設(shè)
  通常情況下,外設(shè)寄存器的內(nèi)存映射地址是在源文件或頭文件中定義的“硬編碼(hard-code)”。但為了增加代碼的可移植性,可以在源文件中聲明一個(gè)映射到外設(shè)寄存器的結(jié)構(gòu),并在這個(gè)結(jié)構(gòu)在Scatter文件中定位。
  下面的例子定義了映射32位寄存器的定時(shí)器的C結(jié)構(gòu)。
  struct {
  volatile unsigned ctrl; /* timer 控制寄存器 */
  volatile unsigned tmr; /* timer值 */
  } timer_regs;
  要把該結(jié)構(gòu)放在存儲(chǔ)器映射的特定地址,需創(chuàng)建一個(gè)新的執(zhí)行區(qū)來裝入該結(jié)構(gòu)。
  下面的例子說明了在Scatter文件中將timer_regs結(jié)構(gòu)定位在0x40000000地址處。
  ROM_LOAD 0x24000000 0x04000000
  {
  ; 。..
  TIMER 0x40000000 UNINIT
  {
  timer_regs.o (+ZI)
  }
  ; 。..
  }
  需要特別注意的是,在應(yīng)用程序啟動(dòng)過程中不將這些寄存器的內(nèi)容初始化為零,因?yàn)檫@些地址對(duì)應(yīng)的是外設(shè)寄存器,如果將其初始化為0,很可能改變系統(tǒng)的狀態(tài)。必須將執(zhí)行域的屬性標(biāo)記為UNINIT,這樣可避免該區(qū)中的ZI數(shù)據(jù)初始化為零。
  13.6.2 在Scatter文件中放置堆和棧
  ARM公司建議,在Scatter文件中指定堆和棧的位置。這主要有兩個(gè)主要優(yōu)點(diǎn):
  · 有關(guān)存儲(chǔ)器映射的所有信息保存在一個(gè)文件中;
  · 改變堆和棧只要求重新鏈接,而不需要重新編譯。
  1.顯示放置標(biāo)號(hào)
  為了在Scatter文件中放置堆棧,必須在源文件中定義Scatter文件的參照符號(hào)。下面的例子在名為stackheap.s的匯編文件中創(chuàng)建標(biāo)有stack_base和heap_base的符號(hào)。這樣就可以在Scatter文件的執(zhí)行域中定位每個(gè)符號(hào)。
  AREA stacks, DATA, NOINIT
  EXPORT stack_base
  stack_base SPACE 1
  AREA heap, DATA, NOINIT
  EXPORT heap_base
  heap_base SPACE 1
  END
  下面的Scatter文件說明了如何在地址0x20000放置堆基址,如何在地址0x40000放置?;?。堆基址和棧基址的位置可通過分別編輯其執(zhí)行區(qū)予以改變。但該方法的缺點(diǎn)是在該棧區(qū)的上部占用一個(gè)字的內(nèi)存區(qū)域放置SPACE(stack_base)變量。
  LOAD_FLASH 0x24000000 0x04000000
  {
  ; 。..
  HEAP 0x20000 UNINIT
  {
  stackheap.o (heap)
  }
  STACKS 0x40000 UNINIT
  {
  stackheap.o (stacks)
  }
  ; 。..
  圖13.17顯示了堆和棧在內(nèi)存中的放置情況。
  嵌入式軟件開發(fā)之進(jìn)一步存儲(chǔ)器映射考慮事項(xiàng)
  圖13.17 顯示設(shè)置符號(hào)放置堆棧
  2.使用鏈接程序生成符號(hào)
  該方法需要在目標(biāo)文件中指定堆和棧的大小。首先,在一個(gè)匯編源文件中為堆和棧定義一個(gè)適當(dāng)大小的區(qū)域。使用SPACE命令保留一個(gè)清零的存儲(chǔ)器塊。然后,為該區(qū)域設(shè)置NOINIT屬性,避免在鏈接時(shí)被修改。這樣避免了顯示放置堆棧標(biāo)號(hào)而浪費(fèi)內(nèi)存空間。
  下面的例子顯示了如何在匯編源文件中預(yù)留出堆棧區(qū)域。
  AREA stack, DATA, NOINIT
  SPACE 0x3000 ;為棧預(yù)留的空間
  AREA heap, DATA, NOINIT
  SPACE 0x3000 ;為堆預(yù)留的空間
  END
  最后,可以在Scatter文件中定義執(zhí)行域放置系統(tǒng)堆棧。
  下面的例子顯示了如何在Scatter文件中使用由聯(lián)接器生成的符號(hào)放置堆棧。
  LOAD_FLASH 0x24000000 0x04000000
  {
 ?。?br />   STACK 0x1000 UNINIT ;length = 0x3000
  {
  stackheap.o (stack) ;stack = 0x4000 to 0x1000
  }
  HEAP 0x15000 UNINIT ;length = 0x3000
  {
  stackheap.o (heap) ;heap = 0x15000 to 0x18000
  }
  }
  鏈接程序生成了指向每個(gè)執(zhí)行區(qū)基址和限制的符號(hào),可將其引入目標(biāo)代碼,供__user_initial_stackheap()函數(shù)使用:
  Image$$STACK$$ZI$$Limit = 0x4000
  Image$$STACK$$ZI$$Base = 0x1000
  Image$$HEAP$$ZI$$Base = 0x15000
  Image$$HEAP$$ZI$$Limit = 0x18000
  下面的例子通過使用DCD偽操作賦予這些鏈接符號(hào)更有意義的名稱,可使該代碼可讀性更高。
  IMPORT ||Image$$STACKS$$ZI$$Base||
  IMPORT ||Image$$STACKS$$ZI$$Limit||
  IMPORT ||Image$$HEAP$$ZI$$Base||
  IMPORT ||Image$$HEAP$$ZI$$Limit||
  stack_base DCD ||Image$$STACKS$$ZI$$Limit|| ; = 0x4000
  stack_limit DCD ||Image$$STACKS$$ZI$$Base|| ; = 0x1000
  heap_base DCD ||Image$$HEAP$$ZI$$Base|| ; = 0x15000
  heap_limit DCD ||Image$$HEAP$$ZI$$Limit|| ; = 0x18000
  這樣如果需要改變系統(tǒng)堆棧的設(shè)置,可以通過編輯Scatter文件中的執(zhí)行域很容易地改變,而不需要重新編譯源文件。
  3.使用Scatter文件的EMPTY屬性
  該方法使用了Scatter文件執(zhí)行域的EMPTY屬性。該屬性使得定義的區(qū)域不包括目標(biāo)代碼或數(shù)據(jù)。這是定義堆和棧的一個(gè)方便方法。區(qū)域的長度在EMPTY屬性后指定。對(duì)于存儲(chǔ)器中向上增長的堆,其區(qū)域的長度為正。對(duì)于棧,其長度被標(biāo)為負(fù)數(shù),說明其在存儲(chǔ)器中是向下增長的。
  下面的例子顯示了如何在Scatter文件中使用EMPTY屬性定義堆棧。
  ROM_LOAD 0x24000000 0x04000000
  {
  。..
  HEAP 0x30000 EMPTY 0x3000
  {
  }
  STACKS 0x40000 EMPTY -0x3000
  {
  }
  。..
  }
  該方法的優(yōu)點(diǎn)是堆和棧的大小和位置是在一個(gè)地方定義的,即在Scatter文件中,而不必為堆棧創(chuàng)建stackheap.s源文件。
  鏈接時(shí),鏈接程序生成代表這些EMPTY區(qū)的符號(hào)。
  Image$$HEAP$$ZI$$Base = 0x30000
  Image$$HEAP$$ZI$$Limit = 0x33000
  Image$$STACKS$$ZI$$Base = 0x3D000
  Image$$STACKS$$ZI$$Limit = 0x40000
  應(yīng)用程序代碼可處理這些符號(hào),如下例所示。
  IMPORT ||Image$$HEAP$$ZI$$Base||
  IMPORT ||Image$$HEAP$$ZI$$Limit||
  heap_base DCD ||Image$$HEAP$$ZI$$Base||
  heap_limit DCD ||Image$$HEAP$$ZI$$Limit||
  IMPORT ||Image$$STACKS$$ZI$$Base||
  IMPORT ||Image$$STACKS$$ZI$$Limit||
  stack_base DCD ||Image$$STACKS$$ZI$$Limit||
  stack_limit DCD
?
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1TC358743XBG評(píng)估板參考手冊(cè)
  2. 1.36 MB  |  330次下載  |  免費(fèi)
  3. 2開關(guān)電源基礎(chǔ)知識(shí)
  4. 5.73 MB  |  6次下載  |  免費(fèi)
  5. 3100W短波放大電路圖
  6. 0.05 MB  |  4次下載  |  3 積分
  7. 4嵌入式linux-聊天程序設(shè)計(jì)
  8. 0.60 MB  |  3次下載  |  免費(fèi)
  9. 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
  10. 0.61 MB  |  2次下載  |  免費(fèi)
  11. 6基于FPGA的C8051F單片機(jī)開發(fā)板設(shè)計(jì)
  12. 0.70 MB  |  2次下載  |  免費(fèi)
  13. 751單片機(jī)窗簾控制器仿真程序
  14. 1.93 MB  |  2次下載  |  免費(fèi)
  15. 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
  16. 0.86 MB  |  2次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21548次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6653次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537796次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191185次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183278次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)