色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示
電子發燒友網>電子資料下載>嵌入式開發>Cortex-M3 棧的8字節對齊資料下載

Cortex-M3 棧的8字節對齊資料下載

2021-04-11 | pdf | 118.22KB | 次下載 | 2積分

資料介紹

一、什么是棧對齊? 棧的字節對齊,實際是指棧頂指針須是某字節的整數倍。因此下邊對系統棧與MSP,任務棧與PSP,棧對齊與SP對齊 這三對概念不做區分。另外下文提到編譯器的時候,實際上是對編譯器匯編連接器的統稱。 之前對棧的8字節對齊理解的不透,就在網上查了好多有關棧字節對齊、還有一些ARM對齊偽指令的資料信息,又做了一些實驗,把這些零碎的信息拼接在一起,總覺得理解透這個問題的話得長篇大論了。結果昨天看了AAPCS手冊、然后查到了沒有使用PRESERVE8偽指令出現錯誤的實例,突然覺得長篇大論不存在了,半篇小論這問題就能理順了。 二、AAPCS棧使用規約 在ARM上編程,但凡涉及到調用,就需要遵循一套規約AAPCS:《Procedure Call Standard for the ARM Architecture》。這套規約里面對棧使用的約定如下: 5.2.1.1 Universal stack constraints At all times the following basic constraints must hold: Stack-limit SP mod 4 = 0. The stack must at all times be aligned to a word boundary. A process may only access (for reading or writing) the closed interval of the entire stack delimited by [SP, stack-base – 1] (where SP is the value of register r13). Note This implies that instructions of the following form can fail to satisfy the stack discipline constraints, even when reg points within the extent of the stack. ldmxx reg, {..., sp, ...} // reg != sp If execution of the instruction is interrupted after sp has been loaded, the stack extent will not be restored, so restarting the instruction might violate the third constraint. 5.2.1.2 Stack constraints at a public interface The stack must also conform to the following constraint at a public interface: SP mod 8 = 0. The stack must be double-word aligned. 可以看到,規約規定,棧任何時候都得4字節對齊,在調用入口得8字節對齊。 在這個約定里,棧的4字節對齊確實得任何時候都遵守,而且你想不遵守都難,因為SP的最后兩位是硬件上保持0的。而對于8字節對齊,這就需要碼農和編譯器配合著來。需要說明的一點是,8字節對齊即使不遵守,一些情況下也沒問題,只要主調和被調用例程兩邊把堆棧使用,傳參,返回等處理好就行,也就是說兩邊有自己的一套約定就行。但是有時候,主調這邊在調用嚴格遵守AAPCS的函數時,沒有將棧保持在8字節對齊上,那就會出問題。 三、如何編程? 在Cortex-M3上編程時,對于AAPCS棧使用約定的遵守,總的來說就兩條: 1. 匯編文件中需要我們親自動手來保證遵守AAPCS棧使用約定。 (特別注意每次從匯編進入C的世界時,要保證匯編部分的編碼在調用c接口時棧是8字節對齊的,不要疏忽了,因為c編譯器可不負責調整。c編譯器說你得送給我的SP就是8字節對齊的,我才能保證接下來的C部分沒有結束之前,遵守AAPCS棧使用約定) 2. 在C文件中,由編譯器來處理。 四、補充: 1. 由于程序的入口點為復位中斷響應函數,一般我們都寫在啟動代碼里,通常是一個匯編文件,然后經由匯編進入到C程序的main入口處,在調用main的時刻,為遵循AAPCS,就得在此時保持8字節對齊。 2. 對于MSP,Keil MDK為我們提供了一個用來初始化C運行庫環境的函數_main,這個函數會調用_user_setup_stackheap函數,該函數將MSP的低三位清零,然后在進入main之前不對其進行更改,這樣在進入main的時刻,MSP保證為8字節對齊的。 3. 對于PSP,一般在上多任務OS時會用它,對于PSP我們要比MSP更為操心點,因為MSP起碼還可以通過調用_main來跳進main的方式保證進入C世界的時候是遵守約定的。而PSP全靠自己來保證每次進入C世界時是8字節對齊。 4. 另外只要是匯編文件,可配合使用匯編命令armasm --diag_warning 1546,這樣匯編器就會對一些SP沒有8字節對齊的地方給出警告,但是我發現匯編器并不能保證檢測到所有對SP造成8字節不對齊的操作,例如直接給SP載入一個立即數這種,匯編器就發現不了。我并沒有對所有會影響SP的指令進行測試(原因是不熟悉。。。),不知道1546這個警告能覆蓋多少指令,所以總的來講,對匯編文件就是睜大自己的鈦合金眼,爭取大部分工作都放到C中去。 五. Cortex-M3 中斷控制器的棧對齊調整功能(該功能在r2p0版本以后的內核中均默認開啟,STKALIGN位默認為1) Cortex M3 NVIC CCR寄存器(控制與配置寄存器)的STKALIGN位置1,那么在發生中斷時,進入中斷響應函數前,內核會首先檢查當前正在使用的棧指針是否8字節對齊,如果是,則正常將xPSR,PC,LR,SP,R0-R3入棧,如果不是,則先把SP-4,調整為8字節對齊,然后將xPSR第九位置1,接著把xPSR,PC,LR,SP,R0-R3入棧,再然后才進入中斷響應函數。這樣可以保證程序在運行過程中,如果在棧沒有發生4字節對齊的地方發生中斷了,進入到中斷響應函數的時候也是遵守AAPCS棧使用約定的。如果中斷服務程序是做任務切換的,那么前面的情況就是將任務棧調整為對齊,然后進入異常服務程序后使用系統棧,那如果系統棧本來就是不對齊的呢?通過中斷來做任務切換的情況下,中斷控制器并不會對系統棧進行調整,怎么辦?其實這也不用擔心,以μC/OS-II為例,在cortex-m3上通常使用PendSV異常來做任務切換,即將OSCtxSw以及OSIntCtxSw都設為僅完成PendSV異常觸發功能,然后在PendSV異常服務程序中進行任務切換。由于上電時刻系統處于特權級模式,只要我們保證從上電開始到第一次系統調用,使用的棧都是系統棧MSP就可以了,這樣即使第一次要進入任務切換時MSP不對齊,中斷向量控制器也會給調整為8字節對齊狀態,雖然這個第一次任務切換后除了中斷再也不會使用MSP,但只要我們同時保證所有匯編部分都不會破壞8字節對齊規約,那么從此以后MSP都會是8字節對齊的。 六、關于ALIGN屬性 與 PRESERVE8偽指令 在CORTEX M3芯片的啟動代碼中,這兩個偽指令并非必不可少,可以不要這兩個偽指令。但是有了這兩個偽指令,可以在確保遵守AAPCS的道路上加一道保險,使得AAPCS棧使用約定的遵守在實際編程時變得稍微容易點。 當在段定義頭(即AREA偽指令的相關代碼)當中使用ALIGN=?時,ALIGN屬性的作用為設定該代碼段或數據段的首址的對齊位置,例如ALIGN=3就表示,該段首址將被安排在2^3=8字節對齊處。需要注意的是,除了AREA的ALIGN屬性,還有一個同名的ALIGN指令,ALIGN指令使用在段內部的,用來調整ALIGN指令下一條命令或數據的對齊位置。 而PRESERVE8偽指令并不會對棧進行任何修改。PRESERVE8偽指令的使用有四種方法,分別如下,其中1、2的用法是等價的: 1. PRESERVE8 2. PRESERVE8 {TRUE} 3. PRESERVE8 {FALSE} 如果不寫,那么由編譯器來決定在編譯過程中將匯編文件標識為PRES8屬性還是~PRES8屬性(也即加還是不加該偽指令),但經過實驗,發現編譯器在加不加這條偽指令上表現的并不完全可靠。。。所以最好明確的加上是 PRESERVE8 {TRUE}還是PRESERVE8 {FALSE}。那么這條偽指令起什么作用呢? 如果你想要告訴匯編器說:“在我這個匯編文件中保證棧的8字節對齊,我這個文件對棧的任何時刻的任何操作都是8字節對齊的”,那么你就把PRESERVE8偽指令用在匯編文件中,用以向匯編器通知前面你的保證內容。匯編器就知道你這個匯編文件是8字節對齊靠譜選手,將該文件標識為PRES8屬性,然后如果在你這個匯編中調用了標示了需要8字節對齊屬性的文件中的函數,連接的時候就不會報錯。但是假如你把這個匯編文件標示為PRESERVE8 {FALSE},然后你又在這個文件中調用了標示了需要8字節對齊屬性的文件中的函數,連接時就會給出錯誤信息。 那么什么是標示了需要8字節對齊屬性的文件呢?如果你的某個匯編文件,某些操作一定要棧8字節對齊才行,那么你就需要使用REQUIRE8偽指令來通知匯編器將該文件標識為REQ8屬性,然后這個文件就是所謂的“標示了需要8字節對齊屬性的文件”。 在文件較多,文件之間調用由繁多的情況下,通過PRESERVE8和REQUIRE8的配合,就能夠在連接期間由編譯器檢查出我們寫代碼時不小心造成的破壞8字節對齊模塊對需要8字節對齊模塊的調用(經過實驗發現,匯編之間是給出警告,匯編調用C則是給出錯誤,由于C文件中并不能直接用REQUIRE8,所以我猜編譯器將C文件都通通標識為REQ8屬性了,所以才會出錯)。 REQUIRE8的用法同PRESERVE8。 文章來源:(mbbeetchina)
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

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

本月

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

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537796次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191185次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183278次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
主站蜘蛛池模板: 呜呜别塞了啊抽插| 中文字幕无线观看不卡网站| 国产无遮挡又黄又爽在线视频 | 国产精品久久久久久久久99热| 亚洲成年男人的天堂网| 久久草这里全是精品香蕉频线观| 538prom国产在线视频一区| 欧美亚洲高清国产| 国内2018年午夜福利5678| 伊人久久影院| 日韩一卡二卡三卡四卡免费观在线| 国产午夜精品理论片免费观看| 国产精品久久vr专区| 国产成人AV永久免费观看| 伊人影院蕉久| 在线视频中文字幕| 亚洲国产韩国欧美在线不卡| 性色欲情网站IWWW| 日本少妇无码精品12P| 久久亚洲这里只有精品18| 国产精品亚欧美一区二区三区| a级成人免费毛片完整版| 亚洲欧美一区二区三区久久 | 国产精品永久免费视频观看| 国产成人在线观看网站| 国产免费怕怕免费视频观看| 白嫩美女直冒白浆| 综合亚洲桃色第一影院| 亚洲色图激情文学| 挺弄抽插喷射HH| 日本漫画母亲口工子全彩| 肉动漫3D卡通无修在线播放| 免费精品国产人妻国语| 国内精品视频在线播放一区| 久草精品在线| 国产精品A8198V久久A片| 草草久久久无码国产专区全集观看| 中文在线中文资源| av色天堂2018在线观看| 国产成人免费高清在线观看| 国产午夜亚洲精品理论片八戒|