資料介紹
RM 系列處理器是 RISC (Reducded InSTructiON Set Computing)處理器。很多基于ARM的高效代碼的程序設計策略都源于RISC 處理器。和很多 RISC 處理器一樣,ARM 系列處理器的內存訪問,也要求數據對齊,即存取“字(Word)”數據時要求四字節對齊,地址的bits[1:0]==0b00;存取“半字(Halfwords)”時要求兩字節對齊,地址的bit[0]==0b0;存取“字節(Byte)”數據時要求該數據按其自然尺寸邊界(Natural Size Boundary)定位。
ARM 編譯程序通常將全局變量對齊到自然尺寸邊界上,以便通過使用 LDR和 STR 指令有效地存取這些變量。這種內存訪問方式與多數 CISC (Complex Instruction Set Computing)體系結構不同,在CISC體系結構下,指令直接存取未對齊的數據。因而,當需要將代碼從CISC 體系結構向 ARM 處理器移植時,內存訪問的地址對齊問題必須予以注意。在RISC體系結構下,存取未對齊數據無論在代碼尺寸或是程序執行效率上,都將付出非常大的代價。
本文將從以下幾個方面討論在ARM體系結構下的程序設計問題。
未對齊的數據指針
C和C++編程標準規定,指向某一數據類型的指針,必須和該類型的數據地址對齊方式一致,所以ARM 編譯器期望程序中的 C 指針指向存儲器中字對齊地址,因為這可使編譯器生成更高效的代碼。
比如,如果定義一個指向 int 數據類型的指針,用該指針讀取一個字,ARM 編譯器將使用LDR 指令來完成此操作。如果讀取的地址為四的倍數(即在一個字的邊界)即能正確讀取。但是,如果該地址不是四的倍數,那么,一條 LDR 指令返回一個循環移位結果,而不是執行真正的未對齊字載入。循環移位結果取決于該地址向對于字的邊界的偏移量和系統所使用的端序(Endianness)。例如,如果代碼要求從指針指向的地址 0x8006 載入數據,即要載入 0x8006、0x8007、0x8008 和 0x8009 四字節的內容。但是,在 ARM 處理器上,這個存取操作載入了0x8004、0x8005、0x8006 和 0x8007 字節的內容。這就是在未對齊的地址上使用指針存取所得到的循環移位結果。
因而,如果想將指針定義到一個指定地址(即該地址為非自然邊界對齊),那么在定義該指針時,必須使用 __packed 限定符來定義指針: 例如,
__packed int *pi; // 指針指向一個非字對其內存地址
使用了_packed限定符限定之后,ARM 編譯器將產生字節存取命令(LDRB或STRB指令)來存取內存,這樣就不必考慮指針對齊問題。所生成的代碼是字節存取的一個序列,或者取決于編譯選項、跟變量對齊相關的移位和屏蔽。但這會導致系統性能和代碼密度的損失。
值得注意的是,不能使用 __packed 限定的指針來存取存儲器映射的外圍寄存器,因為 ARM 編譯程序可使用多個存儲器存取來獲取數據。因而,可能對實際存取地址附近的位置進行存取,而這些附近的位置可能對應于其它外部寄存器。當使用了位字段(Bitfield)時, ARM 程序將訪問整個結構體,而非指定字段。
編譯器的缺省行為
多數嵌入式應用程序最初都是在原型環境下開發的。無論什么樣的原型環境的資源與最終產品環境都是有差異的。因此,考慮如何將嵌入式應用程序從其所依賴的開發工具或調試環境中移植到在目標硬件上獨立運行是非常重要的。
開始編寫嵌入式應用程序時,開發者可能并不清楚目標硬件的具體規格。如,目標系統使用了什么樣的外圍設備、存儲器映射情況甚至不能確定處理器的型號。 為在了解這些詳細信息前能夠繼續軟件的開發,RVCT 工具提供了很多默認的操作,使用戶能編譯和調試與目標系統無關的應用程序代碼。下面詳細介紹介紹這些編譯選項,只有深入了解這些編譯選項設置,才能使開發更順利的進行。
調整 C 庫使其適應目標硬件
默認情況下,C 庫利用semihostig機制來提供設備驅動級的功能,使得主機主機能夠用作輸入和輸出設備。這種機制對于嵌入式開發十分有用,因為用于開發的硬件系統通常沒有最終系統的輸入和輸出設備。
最簡單的函數重定向的例子就是用戶希望fputc()函數能夠將字符從目標系統的串口輸出而不是在調試時,將字符從調試器的控制臺輸出。這時就需要重新實現該函數。下面的例子將fputc() 的輸入字符參數重新指向一連續輸出函數 sendchar(),將定該例在一個獨立的源文件中實現的。這樣,fputc() 在依目標而定的輸出和 C 庫標準輸出函數之間充當一個抽象層。

圖1 C庫函數重定向
ARM 編譯程序通常將全局變量對齊到自然尺寸邊界上,以便通過使用 LDR和 STR 指令有效地存取這些變量。這種內存訪問方式與多數 CISC (Complex Instruction Set Computing)體系結構不同,在CISC體系結構下,指令直接存取未對齊的數據。因而,當需要將代碼從CISC 體系結構向 ARM 處理器移植時,內存訪問的地址對齊問題必須予以注意。在RISC體系結構下,存取未對齊數據無論在代碼尺寸或是程序執行效率上,都將付出非常大的代價。
本文將從以下幾個方面討論在ARM體系結構下的程序設計問題。
未對齊的數據指針
C和C++編程標準規定,指向某一數據類型的指針,必須和該類型的數據地址對齊方式一致,所以ARM 編譯器期望程序中的 C 指針指向存儲器中字對齊地址,因為這可使編譯器生成更高效的代碼。
比如,如果定義一個指向 int 數據類型的指針,用該指針讀取一個字,ARM 編譯器將使用LDR 指令來完成此操作。如果讀取的地址為四的倍數(即在一個字的邊界)即能正確讀取。但是,如果該地址不是四的倍數,那么,一條 LDR 指令返回一個循環移位結果,而不是執行真正的未對齊字載入。循環移位結果取決于該地址向對于字的邊界的偏移量和系統所使用的端序(Endianness)。例如,如果代碼要求從指針指向的地址 0x8006 載入數據,即要載入 0x8006、0x8007、0x8008 和 0x8009 四字節的內容。但是,在 ARM 處理器上,這個存取操作載入了0x8004、0x8005、0x8006 和 0x8007 字節的內容。這就是在未對齊的地址上使用指針存取所得到的循環移位結果。
因而,如果想將指針定義到一個指定地址(即該地址為非自然邊界對齊),那么在定義該指針時,必須使用 __packed 限定符來定義指針: 例如,
__packed int *pi; // 指針指向一個非字對其內存地址
使用了_packed限定符限定之后,ARM 編譯器將產生字節存取命令(LDRB或STRB指令)來存取內存,這樣就不必考慮指針對齊問題。所生成的代碼是字節存取的一個序列,或者取決于編譯選項、跟變量對齊相關的移位和屏蔽。但這會導致系統性能和代碼密度的損失。
值得注意的是,不能使用 __packed 限定的指針來存取存儲器映射的外圍寄存器,因為 ARM 編譯程序可使用多個存儲器存取來獲取數據。因而,可能對實際存取地址附近的位置進行存取,而這些附近的位置可能對應于其它外部寄存器。當使用了位字段(Bitfield)時, ARM 程序將訪問整個結構體,而非指定字段。
編譯器的缺省行為
多數嵌入式應用程序最初都是在原型環境下開發的。無論什么樣的原型環境的資源與最終產品環境都是有差異的。因此,考慮如何將嵌入式應用程序從其所依賴的開發工具或調試環境中移植到在目標硬件上獨立運行是非常重要的。
開始編寫嵌入式應用程序時,開發者可能并不清楚目標硬件的具體規格。如,目標系統使用了什么樣的外圍設備、存儲器映射情況甚至不能確定處理器的型號。 為在了解這些詳細信息前能夠繼續軟件的開發,RVCT 工具提供了很多默認的操作,使用戶能編譯和調試與目標系統無關的應用程序代碼。下面詳細介紹介紹這些編譯選項,只有深入了解這些編譯選項設置,才能使開發更順利的進行。
調整 C 庫使其適應目標硬件
默認情況下,C 庫利用semihostig機制來提供設備驅動級的功能,使得主機主機能夠用作輸入和輸出設備。這種機制對于嵌入式開發十分有用,因為用于開發的硬件系統通常沒有最終系統的輸入和輸出設備。
最簡單的函數重定向的例子就是用戶希望fputc()函數能夠將字符從目標系統的串口輸出而不是在調試時,將字符從調試器的控制臺輸出。這時就需要重新實現該函數。下面的例子將fputc() 的輸入字符參數重新指向一連續輸出函數 sendchar(),將定該例在一個獨立的源文件中實現的。這樣,fputc() 在依目標而定的輸出和 C 庫標準輸出函數之間充當一個抽象層。

圖1 C庫函數重定向
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- ARM體系結構與編程PDF電子書教材 34次下載
- ARM體系結構和應用系統設計示例 4次下載
- 解讀ARM體系結構命名規則 4次下載
- ARM7體系結構 29次下載
- 第2章 多核ARM體系結構 0次下載
- ARM體系結構講解 3次下載
- ARM_SoC體系結構講解 3次下載
- ARM體系結構(2).PPT課件 9次下載
- ARM體系結構(1)PPT課件 0次下載
- 105ARM體系結構-編程模型_EXTI 7次下載
- ARM體系結構入門 492次下載
- ARM體系結構與編程_杜春雷 0次下載
- ARM體系結構與編程
- ARM SoC體系結構(中文版) 0次下載
- ARM微處理器體系結構
- GPGPU體系結構優化方向(1) 313次閱讀
- 嵌入式微處理器的體系結構 1010次閱讀
- 淺談項目中的程序設計思路與步驟 1338次閱讀
- 一手掌握計算機體系結構核心內容 1919次閱讀
- 米爾科技ARM體系結構與編程介紹 2057次閱讀
- 米爾科技ARM處理器體系架構介紹 5020次閱讀
- 基于OpenMP的電磁場FDTD并行方法的程序設計 1255次閱讀
- 淺析自然語言處理知識體系結構 5082次閱讀
- 51單片機的中斷體系結構_中斷的響應過程 2w次閱讀
- 一個簡化的PCIe總線體系結構 5541次閱讀
- 淺談ARM處理器的特點和體系結構 1.7w次閱讀
- 學習ARM + Linux之前要講解用ADS或RealViewMDK去調試ARM開發板的原因 5923次閱讀
- 51單片機體系結構初步分析 2778次閱讀
- 新手必看,關于ARM的22個常用概念 6354次閱讀
- 一種基于B/S結構與C/S結構結合的新體系結構 1292次閱讀
下載排行
本周
- 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次下載 | 免費
評論