資料介紹
ARM處理器支持位置無關的程序設計,這種程序加載到存儲器的任意地址空間都可以正常運行,其設計方法在嵌入式應用系統開發中具有重要的作用。尤其在裸機狀態下開發Bootloader程序及進行內核初始化設計;利用位置無關的程序設計方法還可以在具體應用中用于構建高效率動態鏈接庫,因而了解位置無關的程序設計方法,有助于開發人員設計出結構簡單、清晰的應用程序。
應用程序必須經過編譯、匯編和鏈接后才變成可執行文件,在鏈接時,要對所有目標文件進行重定位(relocatiON),建立符號引用規則,同時為變量、函數等分配運行地址。當程序執行時,系統必須把代碼加載到鏈接時所指定的地址空間,以保證程序在執行過程中對變量、函數等符號的正確引用,使程序正常運行。在具有操作系統的系統中,重定位過程由操作系統自動完成。
在設計Bootloader程序時,必須在裸機環境中進行,這時Bootloader映像文件的運行地址必須由程序員設定。通常情況下,將Bootloader程序下載到ROM的0x0地址進行啟動,而在大多數應用系統中,為了快速啟動,首先將Bootloader程序拷貝到SDRAM中再運行。一般情況下,這兩者的地址并不相同,程序在SDRAM中的地址重定位過程必須由程序員完成。實際上,由于Bootloader是系統上電后要執行的第一段程序,Bootloader程序的拷貝和在這之前的所有工作都必須由其自身來完成,而這些指令都是在ROM中執行的。也就是說,這些代碼即使不在鏈接時所指定的運行時地址空間,也可以正確執行。這就是位置無關代碼,它是一段加載到任意地址空間都能正常執行的特殊代碼。
位置無關代碼常用于以下場合:
程序在運行期間動態加載到內存;
程序在不同場合與不同程序組合后加載到內存(如共享的動態鏈接庫);
在運行期間不同地址相互之間的映射(如Bootloader程序)。
雖然在用GCC編譯時,使用-fPIC選項可為C語言產生位置無關代碼,但這并不能修正程序設計中固有的位置相關性缺陷。特別是匯編語言代碼,必須由程序員遵循一定的程序設計準則,才能保證程序的位置無關性。
ARM程序的位置無關可執行文件PIE(PositionIndependent Executable)包括位置無關代碼PIC和位置無關數據PID(PositionIndependent Data)兩部分。
PID主要針對可讀寫數據段(.data段),其中保存已賦初值的全局變量。為實現其位置無關性,通常使用寄存器R9作為靜態基址寄存器,使其指向該可讀寫段的首地址,并使用相對于基址寄存器的偏移量來對該段的變量進行尋址。這種方法常用于為可重入程序的多個實例產生多個獨立的數據段。在程序設計中,一般不必考慮可讀寫段的位置無關性,這主要是因為可讀寫數據主要分配在SDRAM中。
PIC包括程序中的代碼和只讀數據(.text段),為保證程序能在ROM和SDRAM空間都能正確運行(如裸機狀態下的Bootloader程序),必須采用位置無關代碼程序設計。
PIC遵循只讀段位置無關ROPI(ReadOnly Position Independence)的ATPCS(ARMThumb Procedure Call STandard)的程序設計規范:
程序設計規范
(1) 程序設計規范1
引用同一ROPI段或相對位置固定的另一ROPI段中的符號時,必須是基于PC的符號引用,即使用相對于當前PC的偏移量來實現跳轉或進行常量訪問。
① 位置無關的程序跳轉。在ARM匯編程序中,使用相對跳轉指令B/BL實現程序跳轉。指令中所跳轉的目標地址用基于當前PC的偏移量來表示,與鏈接時分配給地址標號的絕對地址值無關,因而代碼可以在任何位置進行跳轉,實現位置無關性。
另外,還可使用ADR或ADRL偽指令將地址標號值讀取到PC中實現程序跳轉。這是因為ADR或ADRL等偽指令會被編譯器替換為對基于PC的地址值進行操作,但這種方式所能讀取的地址范圍較小,并且會因地址值是否為字對齊而異。
但在ARM程序中,使用LDR等指令直接將地址標號值讀取到PC中實現程序跳轉不是位置無關的。例如: LDR PC, =main
上面的偽指令編譯后的結果為: LDR PC, [PC, OFFSET_TO_LPOOL]
? LPOOL
DCD main
可見,雖然LDR是把基于PC的一個存儲單元LPOOL的內容加載到PC中,但該存儲單元中保存的卻是鏈接時所決定的main函數入口的絕對地址,所以main函數實際所在的段不是位置無關。
② 位置無關的常量訪問。在應用程序中,經常要讀寫相關寄存器以完成必要的硬件初始化。為增強程序的可讀性,利用EQU偽指令對一些常量進行賦值,但在訪問過程中,必須實現位置無關性。下面以PXA270的GPIO初始化介紹位置無關的常量訪問方法。
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]
上述匯編代碼段經編譯后的結果為:
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進行引用,因而是位置無關的。由此可以得出如下結論:使用LDR偽指令將一個常量讀取到非PC的其他通用寄存器中可實現位置無關的常量訪問;但將一個地址值讀取到PC中進行程序跳轉時,跳轉目標則是位置相關的。
(2) 程序設計規范2
其他被ROPI段中的代碼引用的必須是絕對地址,或者是基于可讀寫位置無關(RWPI)段的靜態基址寄存器的可寫數據。
使用絕對地址只能引用被重定位到特定位置的代碼段中的符號,通過在位置無關代碼中引入絕對地址,可以讓程序跳轉到指定位置。例如,假設Bootloader的階段1將其自身代碼拷貝到鏈接時所指定的SDRAM地址空間后,當要跳轉到階段2的C程序入口時,可以使用指令“LDR PC, =main”跳轉到程序在SDRAM中的main函數入口地址開始執行。這是因為程序在編譯鏈接時給main函數分派絕對地址,系統通過將main函數的絕對地址直接賦給PC實現程序跳轉。如果使用相對跳轉指令“B main”,那么只會跳轉到啟動ROM內部的main函數入口。
?
應用程序必須經過編譯、匯編和鏈接后才變成可執行文件,在鏈接時,要對所有目標文件進行重定位(relocatiON),建立符號引用規則,同時為變量、函數等分配運行地址。當程序執行時,系統必須把代碼加載到鏈接時所指定的地址空間,以保證程序在執行過程中對變量、函數等符號的正確引用,使程序正常運行。在具有操作系統的系統中,重定位過程由操作系統自動完成。
在設計Bootloader程序時,必須在裸機環境中進行,這時Bootloader映像文件的運行地址必須由程序員設定。通常情況下,將Bootloader程序下載到ROM的0x0地址進行啟動,而在大多數應用系統中,為了快速啟動,首先將Bootloader程序拷貝到SDRAM中再運行。一般情況下,這兩者的地址并不相同,程序在SDRAM中的地址重定位過程必須由程序員完成。實際上,由于Bootloader是系統上電后要執行的第一段程序,Bootloader程序的拷貝和在這之前的所有工作都必須由其自身來完成,而這些指令都是在ROM中執行的。也就是說,這些代碼即使不在鏈接時所指定的運行時地址空間,也可以正確執行。這就是位置無關代碼,它是一段加載到任意地址空間都能正常執行的特殊代碼。
位置無關代碼常用于以下場合:
程序在運行期間動態加載到內存;
程序在不同場合與不同程序組合后加載到內存(如共享的動態鏈接庫);
在運行期間不同地址相互之間的映射(如Bootloader程序)。
雖然在用GCC編譯時,使用-fPIC選項可為C語言產生位置無關代碼,但這并不能修正程序設計中固有的位置相關性缺陷。特別是匯編語言代碼,必須由程序員遵循一定的程序設計準則,才能保證程序的位置無關性。
ARM程序的位置無關可執行文件PIE(PositionIndependent Executable)包括位置無關代碼PIC和位置無關數據PID(PositionIndependent Data)兩部分。
PID主要針對可讀寫數據段(.data段),其中保存已賦初值的全局變量。為實現其位置無關性,通常使用寄存器R9作為靜態基址寄存器,使其指向該可讀寫段的首地址,并使用相對于基址寄存器的偏移量來對該段的變量進行尋址。這種方法常用于為可重入程序的多個實例產生多個獨立的數據段。在程序設計中,一般不必考慮可讀寫段的位置無關性,這主要是因為可讀寫數據主要分配在SDRAM中。
PIC包括程序中的代碼和只讀數據(.text段),為保證程序能在ROM和SDRAM空間都能正確運行(如裸機狀態下的Bootloader程序),必須采用位置無關代碼程序設計。
PIC遵循只讀段位置無關ROPI(ReadOnly Position Independence)的ATPCS(ARMThumb Procedure Call STandard)的程序設計規范:
程序設計規范
(1) 程序設計規范1
引用同一ROPI段或相對位置固定的另一ROPI段中的符號時,必須是基于PC的符號引用,即使用相對于當前PC的偏移量來實現跳轉或進行常量訪問。
① 位置無關的程序跳轉。在ARM匯編程序中,使用相對跳轉指令B/BL實現程序跳轉。指令中所跳轉的目標地址用基于當前PC的偏移量來表示,與鏈接時分配給地址標號的絕對地址值無關,因而代碼可以在任何位置進行跳轉,實現位置無關性。
另外,還可使用ADR或ADRL偽指令將地址標號值讀取到PC中實現程序跳轉。這是因為ADR或ADRL等偽指令會被編譯器替換為對基于PC的地址值進行操作,但這種方式所能讀取的地址范圍較小,并且會因地址值是否為字對齊而異。
但在ARM程序中,使用LDR等指令直接將地址標號值讀取到PC中實現程序跳轉不是位置無關的。例如: LDR PC, =main
上面的偽指令編譯后的結果為: LDR PC, [PC, OFFSET_TO_LPOOL]
? LPOOL
DCD main
可見,雖然LDR是把基于PC的一個存儲單元LPOOL的內容加載到PC中,但該存儲單元中保存的卻是鏈接時所決定的main函數入口的絕對地址,所以main函數實際所在的段不是位置無關。
② 位置無關的常量訪問。在應用程序中,經常要讀寫相關寄存器以完成必要的硬件初始化。為增強程序的可讀性,利用EQU偽指令對一些常量進行賦值,但在訪問過程中,必須實現位置無關性。下面以PXA270的GPIO初始化介紹位置無關的常量訪問方法。
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]
上述匯編代碼段經編譯后的結果為:
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進行引用,因而是位置無關的。由此可以得出如下結論:使用LDR偽指令將一個常量讀取到非PC的其他通用寄存器中可實現位置無關的常量訪問;但將一個地址值讀取到PC中進行程序跳轉時,跳轉目標則是位置相關的。
(2) 程序設計規范2
其他被ROPI段中的代碼引用的必須是絕對地址,或者是基于可讀寫位置無關(RWPI)段的靜態基址寄存器的可寫數據。
使用絕對地址只能引用被重定位到特定位置的代碼段中的符號,通過在位置無關代碼中引入絕對地址,可以讓程序跳轉到指定位置。例如,假設Bootloader的階段1將其自身代碼拷貝到鏈接時所指定的SDRAM地址空間后,當要跳轉到階段2的C程序入口時,可以使用指令“LDR PC, =main”跳轉到程序在SDRAM中的main函數入口地址開始執行。這是因為程序在編譯鏈接時給main函數分派絕對地址,系統通過將main函數的絕對地址直接賦給PC實現程序跳轉。如果使用相對跳轉指令“B main”,那么只會跳轉到啟動ROM內部的main函數入口。
?
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 基于ARM處理器的TFT-LCD顯示系統 34次下載
- 基于ARM處理器的禽舍環境監控系統 31次下載
- 增量式PID控制算法程序設計方案下載 7次下載
- 使用ARM處理器設計電子式互感器數據采集系統的論文說明 7次下載
- ARM嵌入式處理器的GNU工具應用程序免費下載 7次下載
- 基于ARM7核處理器VxWorks系統BSP設計方案解析 35次下載
- ARM體系結構下的程序設計經驗 5次下載
- 嵌入式軟件開發之基于ARM處理器的嵌入式系統設計方案解析 1次下載
- 嵌入式系統開發基礎_基于ARM9微處理器C語言程序設計(第二版) 0次下載
- ARM嵌入式處理器結構與應用基礎_免費下載 324次下載
- 基于ARM 微處理器的故障記錄系統 57次下載
- 基于ARM的BSP程序設計方案
- ARM程序設計基礎教材
- ARM程序設計基礎
- ARM微處理器的編程模型
- 解析PLC梯形圖程序設計 1402次閱讀
- 基于pSOS和TM1300媒體處理器實現多媒體通信系統的應用方案 2081次閱讀
- 采用ARM EP9315處理器實現P0104總線的應用方案 2895次閱讀
- ARM協處理器接口 1420次閱讀
- 各類ARM處理器的區別及應用 6045次閱讀
- 基于嵌入式處理器PowerPC7447的設計方案 1128次閱讀
- 解答arm處理器的七種工作模式 1.6w次閱讀
- 淺談arm處理器的優勢 1.2w次閱讀
- 解答arm是什么/arm處理器采用什么技術 8078次閱讀
- 運用ARM處理器軟件工具出錯,會帶來什么樣的結果? 705次閱讀
- 液晶顯示屏設計方案:基于Nios嵌入式軟核處理器 1081次閱讀
- arm的協處理器有幾個?ARM協處理器詳解 8823次閱讀
- 淺談ARM處理器的特點和體系結構 1.7w次閱讀
- 基于ARM處理器的高效異常處理解決方案 1286次閱讀
- PicoBlaze處理器IP Core的原理與應用 851次閱讀
下載排行
本周
- 1電子電路原理第七版PDF電子教材免費下載
- 0.00 MB | 1490次下載 | 免費
- 2單片機典型實例介紹
- 18.19 MB | 92次下載 | 1 積分
- 3S7-200PLC編程實例詳細資料
- 1.17 MB | 27次下載 | 1 積分
- 4筆記本電腦主板的元件識別和講解說明
- 4.28 MB | 18次下載 | 4 積分
- 5開關電源原理及各功能電路詳解
- 0.38 MB | 10次下載 | 免費
- 6基于AT89C2051/4051單片機編程器的實驗
- 0.11 MB | 4次下載 | 免費
- 7藍牙設備在嵌入式領域的廣泛應用
- 0.63 MB | 3次下載 | 免費
- 89天練會電子電路識圖
- 5.91 MB | 3次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費
- 2PADS 9.0 2009最新版 -下載
- 0.00 MB | 66304次下載 | 免費
- 3protel99下載protel99軟件下載(中文版)
- 0.00 MB | 51209次下載 | 免費
- 4LabView 8.0 專業版下載 (3CD完整版)
- 0.00 MB | 51043次下載 | 免費
- 5555集成電路應用800例(新編版)
- 0.00 MB | 33562次下載 | 免費
- 6接口電路圖大全
- 未知 | 30320次下載 | 免費
- 7Multisim 10下載Multisim 10 中文版
- 0.00 MB | 28588次下載 | 免費
- 8開關電源設計實例指南
- 未知 | 21539次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935053次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537791次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233045次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191183次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183277次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138039次下載 | 免費
評論
查看更多