欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

電子發(fā)燒友App

硬聲App

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

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

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>ARM>ARM處理器位置無關(guān)的程序設(shè)計方案解析

ARM處理器位置無關(guān)的程序設(shè)計方案解析

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

資料介紹

ARM處理器支持位置無關(guān)的程序設(shè)計,這種程序加載到存儲器的任意地址空間都可以正常運行,其設(shè)計方法在嵌入式應(yīng)用系統(tǒng)開發(fā)中具有重要的作用。尤其在裸機狀態(tài)下開發(fā)Bootloader程序及進行內(nèi)核初始化設(shè)計;利用位置無關(guān)的程序設(shè)計方法還可以在具體應(yīng)用中用于構(gòu)建高效率動態(tài)鏈接庫,因而了解位置無關(guān)的程序設(shè)計方法,有助于開發(fā)人員設(shè)計出結(jié)構(gòu)簡單、清晰的應(yīng)用程序。
  應(yīng)用程序必須經(jīng)過編譯、匯編和鏈接后才變成可執(zhí)行文件,在鏈接時,要對所有目標文件進行重定位(relocatiON),建立符號引用規(guī)則,同時為變量、函數(shù)等分配運行地址。當程序執(zhí)行時,系統(tǒng)必須把代碼加載到鏈接時所指定的地址空間,以保證程序在執(zhí)行過程中對變量、函數(shù)等符號的正確引用,使程序正常運行。在具有操作系統(tǒng)的系統(tǒng)中,重定位過程由操作系統(tǒng)自動完成。
  在設(shè)計Bootloader程序時,必須在裸機環(huán)境中進行,這時Bootloader映像文件的運行地址必須由程序員設(shè)定。通常情況下,將Bootloader程序下載到ROM的0x0地址進行啟動,而在大多數(shù)應(yīng)用系統(tǒng)中,為了快速啟動,首先將Bootloader程序拷貝到SDRAM中再運行。一般情況下,這兩者的地址并不相同,程序在SDRAM中的地址重定位過程必須由程序員完成。實際上,由于Bootloader是系統(tǒng)上電后要執(zhí)行的第一段程序,Bootloader程序的拷貝和在這之前的所有工作都必須由其自身來完成,而這些指令都是在ROM中執(zhí)行的。也就是說,這些代碼即使不在鏈接時所指定的運行時地址空間,也可以正確執(zhí)行。這就是位置無關(guān)代碼,它是一段加載到任意地址空間都能正常執(zhí)行的特殊代碼。
  位置無關(guān)代碼常用于以下場合:
  程序在運行期間動態(tài)加載到內(nèi)存;
  程序在不同場合與不同程序組合后加載到內(nèi)存(如共享的動態(tài)鏈接庫);
  在運行期間不同地址相互之間的映射(如Bootloader程序)。
  雖然在用GCC編譯時,使用-fPIC選項可為C語言產(chǎn)生位置無關(guān)代碼,但這并不能修正程序設(shè)計中固有的位置相關(guān)性缺陷。特別是匯編語言代碼,必須由程序員遵循一定的程序設(shè)計準則,才能保證程序的位置無關(guān)性。
  ARM程序的位置無關(guān)可執(zhí)行文件PIE(PositionIndependent Executable)包括位置無關(guān)代碼PIC和位置無關(guān)數(shù)據(jù)PID(PositionIndependent Data)兩部分。
  PID主要針對可讀寫數(shù)據(jù)段(.data段),其中保存已賦初值的全局變量。為實現(xiàn)其位置無關(guān)性,通常使用寄存器R9作為靜態(tài)基址寄存器,使其指向該可讀寫段的首地址,并使用相對于基址寄存器的偏移量來對該段的變量進行尋址。這種方法常用于為可重入程序的多個實例產(chǎn)生多個獨立的數(shù)據(jù)段。在程序設(shè)計中,一般不必考慮可讀寫段的位置無關(guān)性,這主要是因為可讀寫數(shù)據(jù)主要分配在SDRAM中。
  PIC包括程序中的代碼和只讀數(shù)據(jù)(.text段),為保證程序能在ROM和SDRAM空間都能正確運行(如裸機狀態(tài)下的Bootloader程序),必須采用位置無關(guān)代碼程序設(shè)計。
  PIC遵循只讀段位置無關(guān)ROPI(ReadOnly Position Independence)的ATPCS(ARMThumb Procedure Call STandard)的程序設(shè)計規(guī)范:
  程序設(shè)計規(guī)范
 ?。?) 程序設(shè)計規(guī)范1
  引用同一ROPI段或相對位置固定的另一ROPI段中的符號時,必須是基于PC的符號引用,即使用相對于當前PC的偏移量來實現(xiàn)跳轉(zhuǎn)或進行常量訪問。
 ?、?位置無關(guān)的程序跳轉(zhuǎn)。在ARM匯編程序中,使用相對跳轉(zhuǎn)指令B/BL實現(xiàn)程序跳轉(zhuǎn)。指令中所跳轉(zhuǎn)的目標地址用基于當前PC的偏移量來表示,與鏈接時分配給地址標號的絕對地址值無關(guān),因而代碼可以在任何位置進行跳轉(zhuǎn),實現(xiàn)位置無關(guān)性。
  另外,還可使用ADR或ADRL偽指令將地址標號值讀取到PC中實現(xiàn)程序跳轉(zhuǎn)。這是因為ADR或ADRL等偽指令會被編譯器替換為對基于PC的地址值進行操作,但這種方式所能讀取的地址范圍較小,并且會因地址值是否為字對齊而異。
  但在ARM程序中,使用LDR等指令直接將地址標號值讀取到PC中實現(xiàn)程序跳轉(zhuǎn)不是位置無關(guān)的。例如:  LDR PC, =main
  上面的偽指令編譯后的結(jié)果為:  LDR PC, [PC, OFFSET_TO_LPOOL]
  ?   LPOOL
  DCD main
  可見,雖然LDR是把基于PC的一個存儲單元LPOOL的內(nèi)容加載到PC中,但該存儲單元中保存的卻是鏈接時所決定的main函數(shù)入口的絕對地址,所以main函數(shù)實際所在的段不是位置無關(guān)。
 ?、?位置無關(guān)的常量訪問。在應(yīng)用程序中,經(jīng)常要讀寫相關(guān)寄存器以完成必要的硬件初始化。為增強程序的可讀性,利用EQU偽指令對一些常量進行賦值,但在訪問過程中,必須實現(xiàn)位置無關(guān)性。下面以PXA270的GPIO初始化介紹位置無關(guān)的常量訪問方法。
  GPIO_BASE EQU 0x40e00000; GPIO基址寄存器地址
  GPDR0 EQU 0x00c; 相對于GPIO基址寄存器的偏移量
  init_GPDR0 EQU 0xfffbfe00; 寄存器GPDR0初值
  LDR R1, =GPIO_BASE
  LDR R0, =init_GPDR0
  STR R0, [R1, #GPDR0]
  上述匯編代碼段經(jīng)編譯后的結(jié)果為:
  LDR R1, [PC, OFFSET_TO_GPIO_BASE]
  LDR R0, [PC, OFFSET_TO_init_GPDR0]
  STR R0, [R1, #0xc]?
  GPIO_BASE
  DCD 0x40e00000
  GPDR0
  DCD 0x00c
  init_GPDR0
  DCD 0xfffbfe00
  可見,LDR偽指令實際上使用基于PC的偏移量來對符號常量GPIO_BASE和init_GPDR0進行引用,因而是位置無關(guān)的。由此可以得出如下結(jié)論:使用LDR偽指令將一個常量讀取到非PC的其他通用寄存器中可實現(xiàn)位置無關(guān)的常量訪問;但將一個地址值讀取到PC中進行程序跳轉(zhuǎn)時,跳轉(zhuǎn)目標則是位置相關(guān)的。
 ?。?) 程序設(shè)計規(guī)范2
  其他被ROPI段中的代碼引用的必須是絕對地址,或者是基于可讀寫位置無關(guān)(RWPI)段的靜態(tài)基址寄存器的可寫數(shù)據(jù)。
  使用絕對地址只能引用被重定位到特定位置的代碼段中的符號,通過在位置無關(guān)代碼中引入絕對地址,可以讓程序跳轉(zhuǎn)到指定位置。例如,假設(shè)Bootloader的階段1將其自身代碼拷貝到鏈接時所指定的SDRAM地址空間后,當要跳轉(zhuǎn)到階段2的C程序入口時,可以使用指令“LDR PC, =main”跳轉(zhuǎn)到程序在SDRAM中的main函數(shù)入口地址開始執(zhí)行。這是因為程序在編譯鏈接時給main函數(shù)分派絕對地址,系統(tǒng)通過將main函數(shù)的絕對地址直接賦給PC實現(xiàn)程序跳轉(zhuǎn)。如果使用相對跳轉(zhuǎn)指令“B main”,那么只會跳轉(zhuǎn)到啟動ROM內(nèi)部的main函數(shù)入口。
?
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1DC電源插座圖紙
  2. 0.67 MB   |  2次下載  |  免費
  3. 2AN158 GD32VW553 Wi-Fi開發(fā)指南
  4. 1.51MB   |  2次下載  |  免費
  5. 3AN148 GD32VW553射頻硬件開發(fā)指南
  6. 2.07MB   |  1次下載  |  免費
  7. 4AN111-LTC3219用戶指南
  8. 84.32KB   |  次下載  |  免費
  9. 5AN153-用于電源系統(tǒng)管理的Linduino
  10. 1.38MB   |  次下載  |  免費
  11. 6AN-283: Σ-Δ型ADC和DAC[中文版]
  12. 677.86KB   |  次下載  |  免費
  13. 7SM2018E 支持可控硅調(diào)光線性恒流控制芯片
  14. 402.24 KB  |  次下載  |  免費
  15. 8AN-1308: 電流檢測放大器共模階躍響應(yīng)
  16. 545.42KB   |  次下載  |  免費

本月

  1. 1ADI高性能電源管理解決方案
  2. 2.43 MB   |  450次下載  |  免費
  3. 2免費開源CC3D飛控資料(電路圖&PCB源文件、BOM、
  4. 5.67 MB   |  138次下載  |  1 積分
  5. 3基于STM32單片機智能手環(huán)心率計步器體溫顯示設(shè)計
  6. 0.10 MB   |  130次下載  |  免費
  7. 4使用單片機實現(xiàn)七人表決器的程序和仿真資料免費下載
  8. 2.96 MB   |  44次下載  |  免費
  9. 53314A函數(shù)發(fā)生器維修手冊
  10. 16.30 MB   |  31次下載  |  免費
  11. 6美的電磁爐維修手冊大全
  12. 1.56 MB   |  24次下載  |  5 積分
  13. 7如何正確測試電源的紋波
  14. 0.36 MB   |  17次下載  |  免費
  15. 8感應(yīng)筆電路圖
  16. 0.06 MB   |  10次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935121次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
  4. 1.48MB  |  420062次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233088次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191367次下載  |  10 積分
  9. 5十天學(xué)會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183335次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81581次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73810次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65988次下載  |  10 積分