MSP430之共用體中結構體字節對齊問題
先上代碼:
我所用的平臺的字節對齊默認是2字節,下面////////之間的變量定義爲7個字節,爲了保證2字節對齊,Power變量就會自動擴展一個字節,但是變量類型又是一個字節,所以發生了字節偏移的情況。
typedef union _PARARW{
struct{
UINT8 Name[24];
///////////////////////////////
UINT8 Read;
UINT8 Start;
UINT8 Stop;
UINT8 Alarm;
UINT8 Unit;
// UINT8 Nothing;//字節對齊填充
UINT8 Display;
UINT8 Power;
////////////////////////////////
UINT16 Sample;
UINT32 Record;
UINT32 Delay;
SINT16 Limit1H;
SINT16 Limit1L;
SINT16 Limit2H;
SINT16 Limit2L;
SINT16 Shift1;
SINT16 Shift2;
UINT16 Verify;
UINT8 Blank[9];
}Item;
UINT8 Array[64];
}PARARW;
#pragma location = "INFOC"
const UINT8 ParaRWSec[64] = {
'A','B','C','C','D','E','F','G',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', // 24 User Name
' ',' ',' ',' ',
READ_HOLD, // 01 Read
START_IMME, // 01 Start
STOP_FIFO, // 01 Stop
BUZZER_OFF, // 01 Alarm
CENTIGRADE, // 01 Unit
// 0x00, //字節對齊填充
DISPLAY_NORMAL, // 01 Display
POWER_NORMAL, // 01 Power
0x0a,0x00, // 02 Sample Interval
0x3c,0x00,0x00,0x00, // 04 Record Interval
0x00,0x00,0x00,0x00, // 04 Start Delay
0xb0,0x04, // 02 Ch1 Limit (1200)
0x70,0xfe, // 02 Ch1 Limit (-400)
0xe8,0x03, // 02 Ch2 Limit (1000)
0x00,0x00, // 02 Ch2 Limit (0)
0x00,0x00, // 02 Ch1 Shift (0)
0x00,0x00, // 02 Ch2 Shift (0)
0x00,0x00, // 02 Check Sum
0,0,0,0,0,0,0,0,0}; // 9 Reserved
可以看到,共用體中Array地址在0x24E和0x24F分別爲0x00和ox0a(假設對應一個u16變量temp16),MSP430爲小端模式,高位字節存在高地址,
Power後面擴展出的一個字節就是存儲在 0x24F(高地址)上對應的0x0a,也就是temp16的高位。
而Power類型是UINT8,強制轉換後,Power變量就是temp16的低位0x00;
同理,後面的變量依次偏移,所以造成了數據混亂;
解決辦法很簡單,就是增加一個變量完成對齊,不要讓編譯器去自動對齊。
另外,和共用體一起使用並初始化賦值纔會出現這種問題,就是說你定義的變量和自定義的數據區域沒有對應起來,單獨使用結構體的自動對齊只會有結構體大小的差異,不會造成混亂。
至於強制對齊,
#pragma pack (1) //成對使用
#pragma pack ()
不建議使用,因爲會佔用特別大的存儲空間:
使用前:
使用後: