<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > arm的工作狀態(tài)

arm的工作狀態(tài)

作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò ) 收藏
從編程角度看arm有兩種工作狀態(tài),并且可以切換:

第一種是arm狀態(tài),處理器執行32位的字對齊的arm指令

本文引用地址:http://dyxdggzs.com/article/201611/319255.htm

第二種是thumb狀態(tài),此時(shí)處理器執行16位的半字對齊thumb指令

隨時(shí)切換,不影響處理器工作模式和相應寄存器內容

-----------------------------------------------------

以下內容摘自http://www.cnblogs.com/yin-jingyu/archive/2011/10/14/2211252.html

一、啥是字對齊?為啥要字對齊?

現代計算機中內存空間都是按照byte劃分的,從理論上講似乎對任何類(lèi)型的變量的訪(fǎng)問(wèn)都可以從任何地址開(kāi)始,但實(shí)際情況是在訪(fǎng)問(wèn)特定類(lèi)型變量的時(shí)候經(jīng)常在特定的內存地址訪(fǎng)問(wèn),這就是對齊。

字節對齊的原因大致是如下兩條:

1、平臺原因(移植原因):不是所有的硬件平臺都能訪(fǎng)問(wèn)任意地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類(lèi)型的數據,否則拋出硬件異常。

2、性能原因:數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在于,為了訪(fǎng)問(wèn)未對齊的內存,處理器需要作兩次內存訪(fǎng)問(wèn);而對齊的內存訪(fǎng)問(wèn)僅需要一次訪(fǎng)問(wèn)。

二、對齊規則

每個(gè)特定平臺上的編譯器都有自己的默認“對齊系數”(也叫對齊模數)。程序員可以通過(guò)預編譯命令#pragma pack(n),n=1,2,4,8,16來(lái)改變這一系數,其中的n就是你要指定的“對齊系數”。
規則:
1. 數據成員對齊規則:結構(struct)(或聯(lián)合(union))的數據成員,第一個(gè)數據成員放在offset為0的地方,以后每個(gè)數據成員的對齊按照#pragma pack指定的數值和這個(gè)數據成員自身長(cháng)度中,比較小的那個(gè)進(jìn)行。
2. 結構(或聯(lián)合)的整體對齊規則:在數據成員完成各自對齊之后,結構(或聯(lián)合)本身也要進(jìn)行對齊,對齊將按照#pragma pack指定的數值和結構(或聯(lián)合)最大數據成員長(cháng)度中,比較小的那個(gè)進(jìn)行。
3. 結合1、2可推斷:第一、如果n大于等于該變量所占用的字節數,那么偏移量必須滿(mǎn)足默認的對齊方式,第二、如果n小于該變量的類(lèi)型所占用的字節數,那么偏移量為n的倍數,不用滿(mǎn)足默認的對齊方式。

三、X86對齊實(shí)驗
下面再簡(jiǎn)要回顧解釋一下上述的對齊規則,結合實(shí)例進(jìn)行分析:
1. 數據類(lèi)型自身的對齊值:對于char型數據,其自身對齊值為1字節,對于short型為2字節,對于int,float,double類(lèi)型,其自身對齊值為4字節。
2. 結構體的自身對齊值:其成員中自身對齊值最大的那個(gè)值。
3. 指定對齊值:#pragma pack(n)來(lái)設定變量以n字節對齊方式。n字節對齊就是說(shuō)變量存放的起始地址的偏移量有兩種情況,第一、如果n大于等于該變量所占用的字節數,那么偏移量必須滿(mǎn)足默認的對齊方式,第二、如果n小于該變量的類(lèi)型所占用的字節數,那么偏移量為n的倍數,不用滿(mǎn)足默認的對齊方式。
4. 數據成員和結構體的有效對齊值:數據成員(數據類(lèi)型)和數據結構的自身對齊值和指定對齊值中小的那個(gè)值,數據成員對齊了數據結構自然也就對齊了。
了解上述四個(gè)基本概念,我們開(kāi)始討論具體數據結構的成員和其自身的對齊方式。有效對齊值N是最終用來(lái)決定數據存放地址方式的值。有效對齊N,就是表示“對齊在N上”,也就是說(shuō)該數據的"存放起始地址%N=0"。而數據結構中的數據變量都是按定義的先后順序來(lái)排放的。第一個(gè)數據變量的起始地址就是數據結構的起始地址。結構體的成員變量要對齊排放,結構體本身也要根據自身的有效對齊值圓整(結構體成員變量占用總長(cháng)度需要是對結構體有效對齊值的整數倍)。下面結合VS2005中編譯環(huán)境的例子進(jìn)行深入了解:
例子B分析:
struct B
{
char b;
int a;
short c;
};
假設B從地址空間0x0000開(kāi)始排放。該例中沒(méi)有顯式指定對齊值N,VS2005默認值為4。
成員變量b自身對齊值是1,比指定或默認指定對齊值4小,故有效對齊值為1,其存放地址0x0000符合0x0000%1=0,滿(mǎn)足字節對齊原則。
成員變量a自身對齊值為4,和指定或默認指定對齊值4相等,故有效對齊值也為4,為了保證字節對齊,成員變量a只能存放在起始地址為0x0004到0x0007這四個(gè)連續的字節空間中,復核0x0004%4=0。
成員變量c自身對齊值為2,比指定或默認指定對齊值4小,故有效對齊值為2,可順序存放在0x0008至0x0009兩個(gè)字節空間中,符合0x0008%2=0。
至此滿(mǎn)足了數據成員的字節對齊,接著(zhù)看數據結構B的對齊。數據結構B的自身對齊值為其變量中最大對齊值(也就是成員變量b)4,故結構體B的有效對齊值也是4。根據結構體圓整的要求, 0x0009到0x0000=10字節,(10+2)%4=0。所以0x0000A到0x000B也為結構體B所占用。故B從0x0000到0x000B 共有12個(gè)字節,sizeof(struct B)=12。
之所以在變量C補充2字節,是因為要實(shí)現編譯器快速有效的存取結構數組,試想如果定義B結構數組,第一個(gè)結構起始地址是0沒(méi)有問(wèn)題,但是第二個(gè)結構呢?按照數組的定義,數組中所有元素都是緊挨著(zhù)的,如果不把結構的大小補充為對齊值(4)的整數倍,那下一個(gè)結構的起始地址將是0x0000A,這顯然不能滿(mǎn)足結構的地址對齊了。
例子C分析:

__align(2) struct C
{
char b;
int a;
short c;
};
同理,例子C中成員變量b自身對齊值為1,指定對齊值為2,故效對齊值為1,假設C從0x0000開(kāi)始,那么b存放在0x0000,符合0x0000%1= 0,滿(mǎn)足字節對齊原則。
成員變量a自身對齊值為4,指定對齊值為2,故有效對齊值為2,順序存放在0x0002、0x0003、0x0004、0x0005四個(gè)連續字節中,符合0x0002%2=0,滿(mǎn)足字節對齊原則。
成員變量c的自身對齊值為2,與指定對齊值相等,故有效對齊值為2,順序存放在0x0006、0x0007中,符合 0x0006%2=0,滿(mǎn)足字節對齊原則。
從0x0000到0x00007共八字節存放的是結構體C的變量。結構體C自身對齊值為4,比指定對齊值2大,故C的有效對齊值為2,因8%2=0,C只占用0x0000到0x0007的八個(gè)字節。所以sizeof(struct C)=8,完全滿(mǎn)足字節對齊原則。
除了指定的對齊值不同能導致數據結構的地址存放不同外,編譯器不同存放結構體方式也可能不同。

四、ARM平臺的對齊問(wèn)題

在A(yíng)RM中,有ARM和Thumb兩種指令。

ARM指令:每執行一條指令,PC的值加4個(gè)字節(32bits).一次訪(fǎng)問(wèn)4字節內容,該字節的起始地址必須是4字節對齊的位置上,即地址的低兩位為bits[0b00],也就是說(shuō)地址必須是4的倍數。

Thumb指令:每執行一條指令,PC的值加2個(gè)字節(16bits).).一次訪(fǎng)問(wèn)2字節內容,該字節的起始地址必須是2字節對齊的位置上,即地址的低兩位為bits[0b0],也就是說(shuō)地址必須是2的倍數。

遵循以上方式叫對齊(aligned)方式,不遵守這樣方式稱(chēng)為非對齊(unaligned)的存儲訪(fǎng)問(wèn)操作。

五、ARM平臺字節對齊關(guān)鍵字
1. __align(num)
用于修改最高級別對象的字節邊界。
A、在匯編中使用LDRD或者STRD時(shí),就用到此命令__align(8)進(jìn)行修飾限制。來(lái)保證數據對象是相應對齊。
B、該修飾對象的命令最大是8個(gè)字節限制,可讓2字節的對象進(jìn)行4字節
對齊,但是不能讓4字節的對象2字節對齊。
C、 __align是存儲類(lèi)修改,他只修飾最高級類(lèi)型對象不能用于結構或者函數對象。

2. __packed
__packed是進(jìn)行一字節對齊。
A、不能對packed的對象進(jìn)行對齊;
B、所有對象的讀寫(xiě)訪(fǎng)問(wèn)都進(jìn)行非對齊訪(fǎng)問(wèn);
C、float及包含float的結構聯(lián)合及未用__packed的對象將不能字節對齊;
D、__packed對局部整形變量無(wú)影響;
D、強制由unpacked對象向packed對象轉化是未定義,整形指針可以合法定
義為packed __packed int* p; //__packed int 則沒(méi)有意義。

3. __unaligned
用于修飾該變量可按照非對齊訪(fǎng)問(wèn)。


六、如何查找與字節對齊方面的問(wèn)題
如果出現對齊或者賦值問(wèn)題首先查看:
1. 編譯器的big little端設置;
2. 看這種體系本身是否支持非對齊訪(fǎng)問(wèn);
3. 如果支持看設置了對齊與否,如果沒(méi)有則看訪(fǎng)問(wèn)時(shí)需要加某些特殊的修飾來(lái)標志其特殊訪(fǎng)問(wèn)操作。
七、結論
針對于32位處理器對于本地使用的數據結構,為提高內存訪(fǎng)問(wèn)效率,采用四字節對齊方式;同時(shí)為了減少內存的開(kāi)銷(xiāo),合理安排結構成員的位置,減少四字節對齊導致的成員之間的空隙,降低內存開(kāi)銷(xiāo)。
對于處理器之間的數據結構,需要保證消息的長(cháng)度不因為在不同編譯平臺和不同處理器導致消息結構的長(cháng)度發(fā)生變化,使用一字節對齊方式對消息結構進(jìn)行緊縮;為保證處理器之間的消息的數據結構的內存訪(fǎng)問(wèn)效率,采用字節填充的方式自己對消息中成員進(jìn)行四字節對齊。
數據結構的成員位置要兼顧成員之間的關(guān)系、數據訪(fǎng)問(wèn)效率和空間利用率。順序安排的原則是:四字節的放在最前面,兩字節的緊接最后一個(gè)四字節成員,一字節緊接最后一個(gè)兩字節成員,填充字節放在最后。舉例如下:
typedef struct tag_T_MSG{
long ParaA;
long ParaB;
short ParaC;
char ParaD;
char Pad;
} T_MSG;




關(guān)鍵詞: arm工作狀

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>