![[工學(xué)]嵌入式系統(tǒng)概論_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/16/52dd34fc-c78a-425e-8530-ccdca8ee79c8/52dd34fc-c78a-425e-8530-ccdca8ee79c81.gif)
![[工學(xué)]嵌入式系統(tǒng)概論_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/16/52dd34fc-c78a-425e-8530-ccdca8ee79c8/52dd34fc-c78a-425e-8530-ccdca8ee79c82.gif)
![[工學(xué)]嵌入式系統(tǒng)概論_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/16/52dd34fc-c78a-425e-8530-ccdca8ee79c8/52dd34fc-c78a-425e-8530-ccdca8ee79c83.gif)
![[工學(xué)]嵌入式系統(tǒng)概論_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/16/52dd34fc-c78a-425e-8530-ccdca8ee79c8/52dd34fc-c78a-425e-8530-ccdca8ee79c84.gif)
![[工學(xué)]嵌入式系統(tǒng)概論_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/16/52dd34fc-c78a-425e-8530-ccdca8ee79c8/52dd34fc-c78a-425e-8530-ccdca8ee79c85.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、.ARM的字對齊問題總結(jié) 一、啥是字對齊?為啥要字對齊? 現(xiàn)代計算機中內(nèi)存空間都是按照byte劃分的,從理論上講似乎對任何類型的變量的訪問都可以從任何地址開始,但實際情況是在訪問特定類型變量的時候經(jīng)常在特定的內(nèi)存地址訪問,這就是對齊。字節(jié)對齊的原因大致是如下兩條:1、平臺原因(移植原因):不是所有的硬件平臺都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺只能在某些地址處取某些特定類型的數(shù)據(jù),否則拋出硬件異常。2、性能原因:數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對齊。原因在于,為了訪問未對齊的內(nèi)存,處理器需要作兩次內(nèi)存訪問;而對齊的內(nèi)
2、存訪問僅需要一次訪問。二、對齊規(guī)則 每個特定平臺上的編譯器都有自己的默認“對齊系數(shù)”(也叫對齊模數(shù))。程序員可以通過預(yù)編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一系數(shù),其中的n就是你要指定的“對齊系數(shù)”。規(guī)則:1. 數(shù)據(jù)成員對齊規(guī)則:結(jié)構(gòu)(struct)(或聯(lián)合(union)的數(shù)據(jù)成員,第一個數(shù)據(jù)成員放在offset為0的地方,以后每個數(shù)據(jù)成員的對齊按照#pragma pack指定的數(shù)值和這個數(shù)據(jù)成員自身長度中,比較小的那個進行。2. 結(jié)構(gòu)(或聯(lián)合)的整體對齊規(guī)則:在數(shù)據(jù)成員完成各自對齊之后,
3、結(jié)構(gòu)(或聯(lián)合)本身也要進行對齊,對齊將按照#pragma pack指定的數(shù)值和結(jié)構(gòu)(或聯(lián)合)最大數(shù)據(jù)成員長度中,比較小的那個進行。3. 結(jié)合1、2可推斷:第一、如果n大于等于該變量所占用的字節(jié)數(shù),那么偏移量必須滿足默認的對齊方式,第二、如果n小于該變量的類型所占用的字節(jié)數(shù),那么偏移量為n的倍數(shù),不用滿足默認的對齊方式。三、X86對齊實驗 下面再簡要回顧解釋一下上述的對齊規(guī)則,結(jié)合實例進行分析:1. 數(shù)據(jù)類型自身的對齊值:對于char型數(shù)據(jù),其自身對齊值為1字節(jié),對于short型為2字節(jié),對于int,float,double
4、類型,其自身對齊值為4字節(jié)。2. 結(jié)構(gòu)體的自身對齊值:其成員中自身對齊值最大的那個值。3. 指定對齊值:#pragma pack(n)來設(shè)定變量以n字節(jié)對齊方式。n字節(jié)對齊就是說變量存放的起始地址的偏移量有兩種情況,第一、如果n大于等于該變量所占用的字節(jié)數(shù),那么偏移量必須滿足默認的對齊方式,第二、如果n小于該變量的類型所占用的字節(jié)數(shù),那么偏移量為n的倍數(shù),不用滿足默認的對齊方式。4. 數(shù)據(jù)成員和結(jié)構(gòu)體的有效對齊值:數(shù)據(jù)成員(數(shù)據(jù)類型)和數(shù)據(jù)結(jié)構(gòu)的自身對齊值和指定對齊值中小的那個值,數(shù)據(jù)成員對齊了數(shù)據(jù)結(jié)構(gòu)自然也就對齊了。了解上述四個基本概念,我們開始討論具體數(shù)據(jù)結(jié)構(gòu)的成員
5、和其自身的對齊方式。有效對齊值N是最終用來決定數(shù)據(jù)存放地址方式的值。有效對齊N,就是表示“對齊在N上”,也就是說該數(shù)據(jù)的"存放起始地址%N=0"。而數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)變量都是按定義的先后順序來排放的。第一個數(shù)據(jù)變量的起始地址就是數(shù)據(jù)結(jié)構(gòu)的起始地址。結(jié)構(gòu)體的成員變量要對齊排放,結(jié)構(gòu)體本身也要根據(jù)自身的有效對齊值圓整(結(jié)構(gòu)體成員變量占用總長度需要是對結(jié)構(gòu)體有效對齊值的整數(shù)倍)。下面結(jié)合VS2005中編譯環(huán)境的例子進行深入了解:例子B分析:struct Bchar b;int a;short c;假設(shè)B從地址空間0x0000開始排放。該例中沒有顯式指定對齊值N,VS2005默認值為
6、4。成員變量b自身對齊值是1,比指定或默認指定對齊值4小,故有效對齊值為1,其存放地址0x0000符合0x0000%1=0,滿足字節(jié)對齊原則。成員變量a自身對齊值為4,和指定或默認指定對齊值4相等,故有效對齊值也為4,為了保證字節(jié)對齊,成員變量a只能存放在起始地址為0x0004到0x0007這四個連續(xù)的字節(jié)空間中,復(fù)核0x0004%4=0。成員變量c自身對齊值為2,比指定或默認指定對齊值4小,故有效對齊值為2,可順序存放在0x0008至0x0009兩個字節(jié)空間中,符合0x0008%2=0。至此滿足了數(shù)據(jù)成員的字節(jié)對齊,接著看數(shù)據(jù)結(jié)構(gòu)B的對齊。數(shù)據(jù)結(jié)構(gòu)B的自身對齊值為其變量中最大對齊值(也就是成
7、員變量b)4,故結(jié)構(gòu)體B的有效對齊值也是4。根據(jù)結(jié)構(gòu)體圓整的要求, 0x0009到0x0000=10字節(jié),(102)40。所以0x0000A到0x000B也為結(jié)構(gòu)體B所占用。故B從0x0000到0x000B 共有12個字節(jié),sizeof(struct B)=12。之所以在變量C補充2字節(jié),是因為要實現(xiàn)編譯器快速有效的存取結(jié)構(gòu)數(shù)組,試想如果定義B結(jié)構(gòu)數(shù)組,第一個結(jié)構(gòu)起始地址是0沒有問題,但是第二個結(jié)構(gòu)呢?按照數(shù)組的定義,數(shù)組中所有元素都是緊挨著的,如果不把結(jié)構(gòu)的大小補充為對齊值(4)的整數(shù)倍,那下一個結(jié)構(gòu)的起始地址將是0x0000A,這顯然不能滿足結(jié)構(gòu)的地址對齊了。例子C分析:/*指定按2字節(jié)對
8、齊*/_align(2) struct Cchar b;int a;short c;/*取消指定對齊,恢復(fù)缺省對齊*/ 同理,例子C中成員變量b自身對齊值為1,指定對齊值為2,故效對齊值為1,假設(shè)C從0x0000開始,那么b存放在0x0000,符合0x0000%1= 0,滿足字節(jié)對齊原則。 成員變量a自身對齊值為4,指定對齊值為2,故有效對齊值為2,順序存放在0x0002、0x0003、0x0004、0x0005四個連續(xù)字節(jié)中,符合0x0002%2=0,滿足字節(jié)對齊原則。 成員變量c的自身對齊值為2,與指定對齊值相等,故有
9、效對齊值為2,順序存放在0x0006、0x0007中,符合 0x0006%2=0,滿足字節(jié)對齊原則。 從0x0000到0x00007共八字節(jié)存放的是結(jié)構(gòu)體C的變量。結(jié)構(gòu)體C自身對齊值為4,比指定對齊值2大,故C的有效對齊值為2,因8%2=0,C只占用0x0000到0x0007的八個字節(jié)。所以sizeof(struct C)=8,完全滿足字節(jié)對齊原則。 除了指定的對齊值不同能導(dǎo)致數(shù)據(jù)結(jié)構(gòu)的地址存放不同外, 編譯器不同存放結(jié)構(gòu)體方式也可能不同。四、ARM平臺的對齊問題在ARM中,有ARM和Thumb兩種指令。ARM指令:每執(zhí)行一條指令,PC的值加4個
10、字節(jié)(32bits).一次訪問4字節(jié)內(nèi)容,該字節(jié)的起始地址必須是4字節(jié)對齊的位置上,即地址的低兩位為bits0b00,也就是說地址必須是4的倍數(shù)。Thumb指令:每執(zhí)行一條指令,PC的值加2個字節(jié)(16bits).).一次訪問2字節(jié)內(nèi)容,該字節(jié)的起始地址必須是2字節(jié)對齊的位置上,即地址的低兩位為bits0b0,也就是說地址必須是2的倍數(shù)。 遵循以上方式叫對齊(aligned)方式,不遵守這樣方式稱為非對齊(unaligned)的存儲訪問操作。五、ARM平臺字節(jié)對齊關(guān)鍵字1. _align(num) 用于修改最高級別對象的字
11、節(jié)邊界。A、在匯編中使用LDRD或者STRD時,就用到此命令_align(8)進行修飾限制。來保證數(shù)據(jù)對象是相應(yīng)對齊。B、該修飾對象的命令最大是8個字節(jié)限制,可讓2字節(jié)的對象進行4字節(jié) 對齊,但是不能讓4字節(jié)的對象2字節(jié)對齊。C、 _align是存儲類修改,他只修飾最高級類型對象不能用于結(jié)構(gòu)或者函數(shù)對象。 2. _packed _packed是進行一字節(jié)對齊。A、不能對packed的對象進行對齊;B、所有對象的讀寫訪問都進行非對齊訪問;C、float及包含float的結(jié)構(gòu)聯(lián)合及未用_packed的對象將不能字節(jié)對齊;D、_packed對局部整形變
12、量無影響;D、強制由unpacked對象向packed對象轉(zhuǎn)化是未定義,整形指針可以合法定義為packed _packed int* p; /_packed int 則沒有意義。3. _unaligned 用于修飾該變量可按照非對齊訪問。六、如何查找與字節(jié)對齊方面的問題如果出現(xiàn)對齊或者賦值問題首先查看:1. 編譯器的big little端設(shè)置;2. 看這種體系本身是否支持非對齊訪問;3. 如果支持看設(shè)置了對齊與否,如果沒有則看訪問時需要加某些特殊的修飾來標志其特殊訪問操作。七、結(jié)論 針對于32位處理器對于本地使用的數(shù)據(jù)結(jié)構(gòu),為提高內(nèi)存訪問效率,采
13、用四字節(jié)對齊方式;同時為了減少內(nèi)存的開銷,合理安排結(jié)構(gòu)成員的位置,減少四字節(jié)對齊導(dǎo)致的成員之間的空隙,降低內(nèi)存開銷。 對于處理器之間的數(shù)據(jù)結(jié)構(gòu),需要保證消息的長度不因為在不同編譯平臺和不同處理器導(dǎo)致消息結(jié)構(gòu)的長度發(fā)生變化,使用一字節(jié)對齊方式對消息結(jié)構(gòu)進行緊縮;為保證處理器之間的消息的數(shù)據(jù)結(jié)構(gòu)的內(nèi)存訪問效率,采用字節(jié)填充的方式自己對消息中成員進行四字節(jié)對齊。 數(shù)據(jù)結(jié)構(gòu)的成員位置要兼顧成員之間的關(guān)系、數(shù)據(jù)訪問效率和空間利用率。順序安排的原則是:四字節(jié)的放在最前面,兩字節(jié)的緊接最后一個四字節(jié)成員,一字節(jié)緊接最后一個兩字節(jié)成員,填充字節(jié)放在最后。舉例如下
14、:typedef struct tag_T_MSGlong ParaA;long ParaB;short ParaC;char ParaD;char Pad; /* 填充字節(jié) */ T_MSG; ARM處理器CPSR標志位和條件符之間的關(guān)系類別:嵌入式系統(tǒng) 閱讀:862 本文目的是要理清ARM處理器的CPSR狀態(tài)標志和ARM指令的條件符之間的關(guān)系。 一、CPSR寄存器 ARM V4的CPSR寄存器(和保存它的SPSR寄存器)中的位分配如下圖1所示。圖1 程序狀態(tài)寄存器格式 狀態(tài)標志位含義:(其它位的含義和本文主題無關(guān),此處不多介紹) N N=1 表示運算的結(jié)果為負數(shù);N
15、=0 表示運算的結(jié)果為正數(shù)或零; Z Z=1 表示運算的結(jié)果為零;Z=0表示運算的結(jié)果為非零; C 可以有4種方法設(shè)置C的值: 加法運算(包括比較指令CMN):當運算結(jié)果產(chǎn)生了進位時(無符號數(shù)溢出),C=1,否則C=0。 減法運算(包括比較指令CMP):當運算時產(chǎn)生了借位,C=0,否則C=1。 對于包含移位操作的非加/減運算指令,C為移出值的最后一位。 對于其他的非加/減運算指令,C的值通常不改變。V 可以有2種方法設(shè)置V的值: 對于加/減法運算指令,當操作數(shù)和運算結(jié)果為二進制的補碼表示的帶符號數(shù)時,V=1表示符號位溢出。 對于其他的非加/減運算指令,V的值通常不改變 二、條件符及對應(yīng)的標志位
16、 表1 條件符描述表三、關(guān)于C、V值更多的解釋 處理器內(nèi)部以補碼表示有符號數(shù),8個二制位能夠表達的整數(shù)范圍是:+127 -128,16位表達的范圍是:+32767 -32768。如果運算結(jié)果超出了這個范圍,就是產(chǎn)生了溢出,有溢出,說明有符號數(shù)的運算結(jié)果需要考慮溢出情況。溢出標志V和進位標志C是兩個意義不同的標志。進位標志表示無符號數(shù)運算結(jié)果是否超出范圍;溢出標志表示有符號數(shù)運算結(jié)果是否超出范圍。處理器對兩個操作數(shù)進行運算時,按照無符號數(shù)求得結(jié)果,并相應(yīng)設(shè)置進位標志C;同時,根據(jù)是否超出有符號數(shù)的范圍設(shè)置溢出標志V。應(yīng)該利用哪個標志,則由程序員來決定。也就是說,如果將參加運算的操作數(shù)認為是無符號
17、數(shù),就應(yīng)該關(guān)心進位;認為是有符號數(shù),則要注意是否溢出。判斷運算結(jié)果是否溢出有一個簡單的規(guī)則:只有當兩個相同符號數(shù)相加,而運算結(jié)果的符號與原數(shù)據(jù)符號相反時,產(chǎn)生溢出;其他情況下,則不會產(chǎn)生溢出。代碼舉例1: LDR r0, =0x7fffffff LDR r1, =0x70000000; ADDS r0, r0, r1; /結(jié)果=0xefffffff 對于無符號數(shù)運算來說,沒有進位。對于有符號數(shù)運算來說,溢出。此時C=0 V=1; 代碼舉例2: LDR r0, =0xffffffff LDR r1, =0x70000000; ADDS r0, r0, r1; /結(jié)果=0x6fffffff 對于無
18、符號數(shù)運算來說,有進位。對于有符號數(shù)運算來說,無溢出。此時C=1 V=0; 代碼舉例3: LDR r0, =0x8fffffff LDR r1, =0xf0000000 ; ADDS r0, r0, r1; /結(jié)果=0x7fffffff 此時C=? V=?;(思考一下,然后在ARM模擬器中驗證下) 代碼舉例4:/思考減法時,C值的影響 LDR r0, =0x3 LDR r1, =0x2 SUBS r0, r0, r1 對比: LDR r0, =0x3 LDR r1, =-2;(-2的補碼0xfffffffe會送到r1) ADDS r0, r0, r1 四、CPSR狀態(tài)標志和ARM指令的條件符之間的關(guān)系 有了上面的背景知識以后,接下來思考表1中CPSR狀態(tài)標志和ARM指令的條件符之間的關(guān)系,下面選取其中的一項來分析。如:GE:(有符號數(shù)大于等于) N=0 V=0:結(jié)果是大于等于0的數(shù),且無符合溢出,所以大于等于關(guān)系成立 N=1 V=1:結(jié)果小于0,但有符號溢出 考慮以下情況:c
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 西方政治制度的現(xiàn)狀與未來試題及答案
- 軟件設(shè)計師考試不斷創(chuàng)新的學(xué)習(xí)方式試題及答案
- 深度解析軟件設(shè)計師考試試題及答案的策略
- 逐步推進的學(xué)習(xí)計劃如何實施2025年信息系統(tǒng)項目管理師試題及答案
- 公共政策改革中的參與性與透明性探討試題及答案
- 解答2025年西方政治的核心試題及答案
- 公共政策與藥品監(jiān)督管理試題及答案
- 技術(shù)創(chuàng)新對公共政策設(shè)計的影響試題及答案
- 機電工程文化與價值觀試題
- 深入理解2025年機電工程考試試題及答案
- 麻醉期間反流誤吸的預(yù)防與處理
- 結(jié)構(gòu)膠灌注施工方案
- 《中醫(yī)體重管理臨床指南》
- 銀行業(yè)務(wù)專家競聘述職模板
- 電子商務(wù)案例分析
- 外研版九年級上冊英語Module 1 Wonders of the world大單元教學(xué)設(shè)計
- 2024年度影視劇本購買合同:制片公司與編劇之間關(guān)于劇本購買的協(xié)議3篇
- JGJ 58-2008電影院建筑設(shè)計規(guī)范
- 甘肅省蘭州市2022年中考英語真題試卷(含答案)
- 220kVGIS安裝施工方案
- 2024年湖南省高考化學(xué)試卷真題(含答案解析)
評論
0/150
提交評論