那是 1981 年(是的——將近 40 年前!),我們正在構(gòu)建一個(gè)系統(tǒng),其中包含一個(gè) DEC PDP-11 小型計(jì)算機(jī),該小型計(jì)算機(jī)通過(guò)共享內(nèi)存與德克薩斯 TMS990 微處理器接口。這些都是 16 位處理器,所以我們將數(shù)據(jù)作為字傳遞。但是發(fā)生了一些奇怪的事情:一個(gè) CPU 會(huì)將一個(gè)值寫(xiě)入共享內(nèi)存的一個(gè)字中,但是當(dāng)另一個(gè) CPU 讀出它時(shí),字節(jié)被交換了。解決這個(gè)問(wèn)題很簡(jiǎn)單:只需在一側(cè)編寫(xiě)一個(gè)簡(jiǎn)單的訪(fǎng)問(wèn)例程來(lái)交換字節(jié)并確保它始終用于訪(fǎng)問(wèn)共享內(nèi)存。直到后來(lái)才知道為什么會(huì)出現(xiàn)這個(gè)問(wèn)題。
在幾乎所有現(xiàn)代嵌入式系統(tǒng)中,內(nèi)存都是按字節(jié)組織的。但是,CPU 也可以將數(shù)據(jù)處理為 16 位或 32 位字。在這種情況下,需要決定如何將字中的字節(jié)存儲(chǔ)在內(nèi)存中。有兩個(gè)明顯的選項(xiàng)和許多其他變體。描述此字節(jié)順序的屬性稱(chēng)為“字節(jié)順序”(或有時(shí)稱(chēng)為“字節(jié)順序”)。
兩種常見(jiàn)的字節(jié)序形式是:最低有效字節(jié)存儲(chǔ)在最低地址(“l(fā)ittle-endian”)和最高有效字節(jié)存儲(chǔ)在最低地址(“big-endian”)。字節(jié)順序還有其他變化,甚至還有存儲(chǔ)位的可能性。
廣義上講,使用的字節(jié)序是由 CPU 決定的。由于有多種選擇,因此不同的半導(dǎo)體供應(yīng)商為其 CPU 選擇不同的字節(jié)序也就不足為奇了。英特爾 CPU 傳統(tǒng)上是小端的。飛思卡爾傾向于支持大端。大多數(shù)現(xiàn)代 CPU 的字節(jié)序可以在軟件中交換。
從嵌入式軟件工程師的角度來(lái)看,問(wèn)題是“字節(jié)序重要嗎?” 并且,“如果有,多少錢(qián)?”
當(dāng)軟件開(kāi)發(fā)人員需要考慮字節(jié)順序時(shí),大致有兩種情況:
通過(guò)通信鏈路或網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)
在軟件中以多種表示形式處理的數(shù)據(jù)
前一種情況非常簡(jiǎn)單——只需遵循或定義協(xié)議即可。后者更棘手,需要一些思考。
考慮這段代碼:
unsigned int n = 0x0a0b0c0d;
unsigned char c, d, *p;
c = (unsigned char) n;
p = (unsigned char *) &n;
d = *p;
c和d最后會(huì)包含什么值?無(wú)論字節(jié)順序如何,c 都應(yīng)該包含值 0x0 d。但是,d的值將取決于字節(jié)序。在小端系統(tǒng)上d 將包含 0x0 d;在 big-endian 上,它將具有值0x0a。如果要在n 和unsigned char a之間進(jìn)行聯(lián)合,則會(huì)觀(guān)察到同樣的效果。
那么,這有關(guān)系嗎?這么多年前,這對(duì)我很重要!但是,請(qǐng)注意,大多數(shù)代碼可能會(huì)獨(dú)立于字節(jié)順序而編寫(xiě),我認(rèn)為幾乎所有編寫(xiě)良好的代碼都是這樣的。但是,如果您確實(shí)像我需要的那樣構(gòu)建了字節(jié)順序依賴(lài)項(xiàng),那么良好的文檔和注釋是必不可少的。
審核編輯:郭婷
-
處理器
+關(guān)注
關(guān)注
68文章
19103瀏覽量
228825 -
cpu
+關(guān)注
關(guān)注
68文章
10807瀏覽量
210852
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論