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 ()
不建议使用,因为会占用特别大的存储空间:
使用前:
使用后: