《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > ARM嵌入式軟件編程經驗談
ARM嵌入式軟件編程經驗談
摘要: ARM系列處理器是 RISC (Reducded InSTructiON Set Computing)處理器。很多基于ARM的高效代碼的程序設計策略都源于RISC 處理器。和很多 RISC 處理器一樣,ARM 系列處理器的內存訪問,也要求數據對齊,即存取“字(Word)”數據時要求四字節對齊,地址的bits[1:0]==0b00;存取“半字(Halfwords)”時要求兩字節對齊,地址的bit[0]==0b0;存取“字節(Byte)”數據時要求該數據按其自然尺寸邊界(Natural Size Boundary)定位。
關鍵詞: ARM 嵌入式軟件
Abstract:
Key words :

ARM系列處理器是 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庫函數重定向

例子程序的代碼如下所示。

extern void sendchar(char *ch);

int fputc(int ch, FILE *f)

{?? /* e.g. write a character to an UART */

char tempch = ch;

sendchar(&tempch);

return ch;

}

映象文件存儲器映射調整

映像由域(Regions)和輸出段(Output Sections)組成。每個域可以有不同的加載地址和執行地址。

分散加載可以更加方便準確的指定映像存儲器映射,為映像組件分組和布局提供了全面控制。它能夠描述由載入時和執行時分散在存儲器映射中的多個區組成的復雜映像映射。雖然,分散加載可以用于簡單映像,但它通常僅用于具有復雜存儲器映射的映像。

要構建映像的存儲器映射,必須向armlink 提供以下信息:

·? 分組信息? 決定如何將各輸入段組織成相應的輸出段和域;

·? 定位信息? 決定各域在存儲空間的起始地址。

有兩種方法可以實現指定映像文件的分組和定位信息:如果映像文件中地址映射關系比較簡單,可以使用命令行選項;如果映像文件中地址映射關系比較復雜的情況,可以使用一個配置文件。使用該配置文件可以高速鏈接器相關的地址映射關系。配置文件又叫Scatter文件,是一個文本文件,通過下面的鏈接選項來實現。

-scatter? filename

復位和初始化

ARM嵌入式系統的初始化序列如圖2所示。系統啟動時立即執行復位處理程序,然后進入$Sub$main()的代碼執行。

復位處理程序是用匯編語言編寫的代碼塊,它在系統復位時執行,完成系統必須初始化操作。對于具有局部存儲器的內核,如Caches、緊密藕荷存儲器 (TCM)、存儲管理單元 (MMU) 和存儲器保護單元 (MPU) 等,在初始化過程這一階段完成必要的配置。復位處理程序在執行之后,通常跳轉到 __main 以開始 C 庫的初始化序列。

一般情況下,系統初始化代碼和主應用程序是分開的。系統初始化要在主應用程序啟動前完成。但部分與硬件相關的系統初始化過程,如啟用Cache和中斷,必須在C庫初始化代碼執行完成后才能執行。

為了在進入主應用程序之前,完成系統初始化,可以使用$sub和$super函數標識符在進入主程序之前插入一個例程。這一機制可以在不改變源代碼的情況下擴展函數的功能。

下面的例子說明了如何使用$sub和$super函數標識。鏈接程序通過調用$sub$$main()函數取代對main()的調用。所以用戶可以在自己編寫的$sub$$main()例程中啟用Cache或使能中斷。

extern void $Super$$main(void);

void $Sub$$main(void)

{

cache_enable();??? // enables caches

int_enable();????? // enables interrupts

$Super$$main();??? // calls original main()

}

在$Sub$$main(void)函數中,鏈接程序通過調用$Super$$main(),是代碼跳轉到實際的main()函數。

在完成硬件初始化之后,必須考慮主應用程序運行在何種模式。如果應用程序運行在特權模式(Privileged mode),只需在退出復位處理程序前切換到適當的模式;如果應用程序運行在用戶模式下,要在完成系統初始化之后,再切換到用戶模式。模式的切換工作,一般在$Sub$$main(void)函數中完成。

 

 

圖2 ARM嵌入式系統的初始化序列

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          在线成人小视频| 宅男噜噜噜66一区二区66| 国产女主播一区二区三区| 一区二区不卡在线视频 午夜欧美不卡'| 一区二区三区不卡视频在线观看| 国产真实乱偷精品视频免| 国产精品女同互慰在线看| 亚洲国产天堂久久国产91| 国产欧美二区| 亚洲三级免费| 女生裸体视频一区二区三区| 久久一区亚洲| 欧美精品一区在线发布| 国语精品中文字幕| 欧美日韩国产91| 亚洲视频香蕉人妖| 国产精品久久久久久av下载红粉| 尤妮丝一区二区裸体视频| 欧美福利专区| 夜夜嗨av色一区二区不卡| 欧美日韩在线电影| 国产一区久久久| 国产日韩欧美综合精品| 国产免费成人| 亚洲欧美另类在线观看| 国产精品丝袜久久久久久app| 亚洲午夜小视频| 午夜一区不卡| 红杏aⅴ成人免费视频| 国产丝袜一区二区三区| 激情欧美国产欧美| 国产亚洲一级高清| 久久久国产精彩视频美女艺术照福利| 久久久久久久国产| 国产精品www网站| 国产亚洲美州欧州综合国| 在线成人免费视频| 亚洲靠逼com| 免费一级欧美在线大片| 在线综合亚洲| 激情综合在线| 亚洲一区二区黄色| 久久aⅴ乱码一区二区三区| 亚洲欧美国产精品桃花| 国产精品五区| 亚洲国产成人精品女人久久久| 国产精品一区在线观看| 欧美在线一区二区三区| 国产精品自拍小视频| 在线观看欧美精品| 巨胸喷奶水www久久久免费动漫| 国产精品日韩精品欧美在线| 国产精品一区2区| 欧美在线综合视频| 亚洲二区三区四区| 久久婷婷国产综合尤物精品| 国产一区二区三区直播精品电影| 欧美三级在线视频| 欧美经典一区二区三区| 亚洲一区美女视频在线观看免费| 一区二区三区 在线观看视频| 欧美中文日韩| 禁断一区二区三区在线| 欧美日韩成人在线播放| 一区二区三欧美| 亚洲国产精品悠悠久久琪琪| 欧美一乱一性一交一视频| 欧美激情国产日韩精品一区18| 一本色道久久加勒比精品| 国产精品男人爽免费视频1| 国产精品丝袜xxxxxxx| 国产日产欧美a一级在线| 久久久免费精品| 欧美午夜a级限制福利片| 亚洲视频播放| 久久福利视频导航| 欧美在线观看网址综合| 精品99一区二区三区| 黄色亚洲网站| 精品av久久久久电影| 亚洲一级电影| 欧美色欧美亚洲另类七区| 欧美日本国产在线| 亚洲电影第三页| 欧美裸体一区二区三区| 欧美日韩一区视频| 亚洲欧美综合v| 欧美阿v一级看视频| 欧美精品免费在线| 亚洲国产日韩欧美在线动漫| 美日韩免费视频| 欧美亚洲午夜视频在线观看| 欧美日韩视频在线第一区| 亚洲毛片网站| 久久成人国产| 欧美一区成人| 欧美有码视频| 欧美大片一区二区| 欧美激情精品久久久久久变态| 国产精品视频一区二区三区| 午夜精品影院在线观看| 欧美在线视频观看免费网站| 在线电影国产精品| 久久久久综合一区二区三区| 欧美精品18| 欧美另类极品videosbest最新版本| 亚洲一区二区久久| 亚洲一区二区在线免费观看| 国产欧美日韩不卡免费| 欧美日韩免费看| 欧美一区二区成人| 日韩一级在线观看| 欧美影院在线播放| 99在线精品免费视频九九视| 亚洲第一在线综合在线| 91久久香蕉国产日韩欧美9色| 久久精品天堂| 亚洲国产成人精品久久| 亚洲成色www久久网站| 午夜日韩av| 国产精品一区二区久久久| 国产精品高精视频免费| 欧美午夜一区二区| 欧美激情91| 好吊妞**欧美| 亚洲欧美日韩在线| 久久免费精品日本久久中文字幕| 欧美高清视频免费观看| 国内外成人免费激情在线视频网站| 性做久久久久久免费观看欧美| 噜噜噜躁狠狠躁狠狠精品视频| 欧美视频在线观看免费网址| 亚洲激情一区| 国产精品嫩草99av在线| 亚洲一区中文字幕在线观看| 亚洲一区bb| 亚洲精品国产品国语在线app| 欧美国产在线观看| 亚洲精品一区二区三区不| 久久www成人_看片免费不卡| 久久久美女艺术照精彩视频福利播放| 午夜精品成人在线视频| 99国产成+人+综合+亚洲欧美| 亚洲免费伊人电影在线观看av| 欧美国产日韩精品| 裸体一区二区| 久久久久天天天天| 国产午夜精品全部视频在线播放| 亚洲国产日韩综合一区| 国产精品jvid在线观看蜜臀| 一区二区三区视频在线观看| 久久久久久婷| 久久黄色小说| 国产婷婷成人久久av免费高清| 一区二区三区产品免费精品久久75| 国产视频一区二区在线观看| 欧美一区二区三区免费观看| 欧美视频在线看| 国产精品久久久久999| 一区二区三区偷拍| 韩日欧美一区| 欧美日韩国产三级| 一区二区三区国产在线观看| 欧美精品一区二区三区很污很色的| 亚洲伦理在线观看| 欧美日韩色综合| 一区在线电影| 国内精品免费午夜毛片| 久久免费视频这里只有精品| 欧美在线日韩精品| 亚洲精品乱码久久久久久久久| 久久国产精品久久国产精品| 一区在线观看视频| 在线亚洲欧美视频| 国产女主播一区| 亚洲欧美日韩一区二区三区在线观看| 亚洲天堂网站在线观看视频| 欧美黄色片免费观看| 一区二区欧美国产| 可以免费看不卡的av网站| 久久精视频免费在线久久完整在线看| 亚洲视频国产视频| 欧美日韩在线视频观看| 黄色综合网站| 亚洲精品一区在线观看| 国产日韩欧美一区二区三区四区| 亚洲校园激情| 欧美日韩一区二区高清| 久久精品99无色码中文字幕| 国产精品永久免费观看| 欧美午夜大胆人体| 欧美金8天国| 亚洲国产欧美日韩另类综合| 国产精品白丝jk黑袜喷水| 亚洲天堂免费观看| 韩国成人福利片在线播放| 黄色工厂这里只有精品| 欧美福利小视频| 欧美少妇一区| 一本到12不卡视频在线dvd| 亚洲精品永久免费| 欧美日韩免费观看一区=区三区| 国产午夜精品视频| 国产欧美精品一区| 久久男人资源视频| 国产视频欧美视频| 国产精品夜夜夜| 国产精品私拍pans大尺度在线| 欧美激情视频一区二区三区不卡| 国产精品高精视频免费| 免费观看一区| 在线免费观看日韩欧美| 99在线精品视频在线观看| 欧美一区二区三区精品电影| 久久精品亚洲一区二区三区浴池| 欧美成人dvd在线视频| 男女av一区三区二区色多| 欧美电影免费观看大全| 亚洲色图制服丝袜| 久久av一区二区三区| 一本色道久久综合亚洲精品按摩| 国产精品欧美激情| 正在播放日韩| 国产一区二区三区在线观看网站| 久热爱精品视频线路一| 久久久精品一品道一区| 午夜精品视频网站| 午夜在线视频一区二区区别| 久久精品国产一区二区电影| 久久亚洲精品中文字幕冲田杏梨| 午夜精品久久久久久久蜜桃app| 亚洲视频高清| 久久夜色精品国产欧美乱极品| 久久国产精彩视频| 国产欧美在线视频| 亚洲欧美综合国产精品一区| 亚洲日本成人女熟在线观看| 亚洲一区在线直播| 中文日韩欧美| 久久精品91久久香蕉加勒比| 欧美自拍丝袜亚洲| 国产精品成人一区二区三区夜夜夜| 国产精品日产欧美久久久久| 欧美日韩美女一区二区| 国产综合香蕉五月婷在线| 国产精品入口日韩视频大尺度| 在线播放豆国产99亚洲| 欧美韩日一区二区| 欧美日韩在线大尺度| 国内精品久久久久久久影视蜜臀| 欧美视频一区二区三区…| 亚洲精品网站在线播放gif| 欧美+日本+国产+在线a∨观看| 久久久噜噜噜久久久| 久久国产精品久久久久久| 国产精品久久久| 欧美一级视频| 国产麻豆日韩| 欧美1区2区视频| 日韩视频在线观看| 亚洲国产精品综合| 午夜精品福利一区二区三区av| 一区在线观看| 国产欧美激情| 欧美激情第10页| 欧美色道久久88综合亚洲精品| 欧美视频一区二区三区…| 久久久久久久性| 亚洲精品久久久久久一区二区| 国产一区二区在线免费观看| 亚洲自啪免费| 国产真实精品久久二三区| 亚洲靠逼com| 欧美成人一区二区三区片免费| 欧美极品在线视频| 欧美午夜精品久久久久久人妖| 欧美精品 日韩| 欧美精品免费在线观看| 欧美人交a欧美精品| 中日韩在线视频| 欧美日韩国产精品一区| 欧美激情1区| 亚洲人成久久| 久久久久久久久岛国免费| 国产精品久久久久久av福利软件| 国产精品vip| 国产久一道中文一区| 欧美69视频| 中文网丁香综合网| 午夜视频在线观看一区二区三区| 亚洲成人在线网| 久久久久久黄| 好吊日精品视频| 久久天堂成人| 欧美日本在线| 亚洲免费在线看| 日韩亚洲欧美中文三级| 91久久在线观看| 日韩一区二区精品视频| 欧美日韩一区二区在线播放| 91久久精品www人人做人人爽| 亚洲乱码国产乱码精品精98午夜| 国产视频欧美| 欧美日韩国产免费观看| 国内精品免费在线观看| 欧美体内she精视频| 一区二区在线观看av| 中国亚洲黄色| 亚洲精品久久7777| 久久国产精品一区二区| 好看的日韩视频| 精品动漫一区| 国产精品videosex极品| 国产精品第一区| 久久久久久亚洲综合影院红桃| 91久久国产自产拍夜夜嗨| 欧美性视频网站| 欧美日韩精品一二三区| 亚洲精品国产品国语在线app| 午夜影视日本亚洲欧洲精品| 欧美一区二区视频在线观看2020| 亚洲视频大全| 国产精品亚洲激情| 欧美在线视频导航| 欧美天堂在线观看| 欧美福利影院| 一区二区三区在线视频免费观看| 亚洲午夜成aⅴ人片|