|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
#define PACK_STRUCT_FIELD(x) x __attribute__((packed)) |
| 作者:modaming 欄目:嵌入式系統(tǒng) |
#define PACK_STRUCT_FIELD(x) x __attribute__((packed)) 無意中看到的,這個(gè)宏怎么解釋阿?望大俠指教。 |
| 2樓: | >>參與討論 |
| 作者: gdtyy 于 2005/2/19 22:37:00 發(fā)布:
定義編譯器字節(jié)對(duì)齊方式 gcc中,在某個(gè)變量x后使用“__attribute__((packed))”可以通知編譯器保證字節(jié)對(duì)齊。 在lwip中包是存儲(chǔ)在結(jié)構(gòu)體里,而結(jié)構(gòu)體及其成員可能存在字節(jié)不對(duì)齊現(xiàn)象,32位/16位CPU不能正確讀寫這類數(shù)據(jù),導(dǎo)致數(shù)據(jù)包操作錯(cuò)誤。 如下圖:32位系統(tǒng)中,x為3字節(jié),y為4字節(jié),z為1字節(jié)。系統(tǒng)將不能正確讀寫y。 31 8 7 0 ---------------------- | x | y | ---------------------- | y | z | ---------------------- 改成下圖才可以正確訪問: 31 8 7 0 ---------------------- | | x | ---------------------- | y | ---------------------- | | z | ---------------------- 可見空間被浪費(fèi)了,但只有這樣x、y、z才可以直接訪問,否則,你必須讀兩次內(nèi)存(每次32位),再移位操作跨邊界的y,才能正確讀出y。 編譯器缺省時(shí)為了節(jié)約內(nèi)存耗費(fèi),將按字節(jié)緊湊排列變量,用attribute關(guān)鍵字指出packed,就是通知編譯器按字獨(dú)立分配每個(gè)變量的內(nèi)存空間。 編譯器加優(yōu)化可以將上圖改變?nèi)缦拢?br> 31 8 7 0 ---------------------- | z | x | ---------------------- | y | ---------------------- 這樣既保證字節(jié)對(duì)齊,又保證節(jié)約內(nèi)存。 不同編譯器的語(yǔ)法不同,你需要根據(jù)特定情況修改PACK_STRUCT_FIELD(x)宏。 例如:(gcc編譯器) struct eth_addr { u8_t addr[6] __attribute__((packed)); } __attribute__((packed)); 確保eth_addr結(jié)構(gòu)體及其成員addr字節(jié)對(duì)齊。 |
|
| 3樓: | >>參與討論 |
| 作者: modaming 于 2005/2/21 10:46:00 發(fā)布:
其中的x意思是什么阿? 多些耐心地講了這么多,但是其中的x意思是什么阿? |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |