__packed struct foo
{
char one;
short two;
char three;
int four;
} c;
上面的结构体,增加了__packed
属性后,内存中的结构体变量回紧凑存储,占两个word。在对协议解析时,用到的指针、结构体、联合体中,增加__packed
属性,可以方便协议解析。
__packed struct foobar
{
char x;
short y[10];
}; //注意该结构体前面有__packed属性,故该结构体大小为21个字节
short get_y0(struct foobar *s)
{
// Unaligned-capable load
return *s->y;
}
uint32_t *p = NULL;
uint32_t val = 0;
int main(void)
{
struct foobar fTest = {.x = 10, .y[0] = 0xA5A5, .y[1] = 0xB7B7};
p = (uint32_t *)&fTest.y[0]; //此处指针变量P得到的是一个奇数地址
val = *p; //在Cortex-M0的芯片中,对奇数地址,进行word/half-word方式访问时,系统进入hardfault异常
}
指针变量__packed uint32_t *p; // pointer to unaligned int
这样定义时,指针变量p
访问的地址将不需要aligned,任意地址都可以。