Keil中取消结构体对齐的方法
我在写通讯协议的时候喜欢使用 Union 的形式将整个数据包按需处理,接收数据时使用数组形式来接收,解析数据则使用结构体形式来解析,伪代码如下。
union {
uint8_t tab[16];
struct {
uint8_t a;
uint32_t e32; /* 为了突出结构体对齐问题,将其放到这里 */
uint8_t b;
uint8_t c;
uint8_t d;
}t;
}test;
for(uint32_t i = 0; i < 16; i++)
{
tab[i] = (i << 4) | i;
}
但是,在给test.tab
赋值之后,会因为结构体对齐原因读取到 “错误” 的test.t.e32
,为了解决这个问题,我们要使用过__packed
关键字取消结构体对齐,这里面还有坑。
/* 第一次用的时候我是这样用的 */
/* 找了半天不知道错误在哪 */
union {
uint8_t tab[16];
__packed struct {
uint8_t a;
uint32_t e32;
uint8_t b;
uint8_t c;
uint8_t d;
}t;
}test;
应该把__packed
放struct
后面(GNU Compiler)。
这样就可以解析到正确结果。