Cortex-M0中的内存对齐

文章讨论了在C语言中使用__packed属性来消除结构体的默认内存对齐,使得存储更紧凑,这对于协议解析尤其有用。在示例中,展示了如何处理非对齐访问,特别是在Cortex-M0这样的处理器上,不正确的对齐访问可能导致异常。文章还提到了如何定义指针以允许访问未对齐的数据。
摘要由CSDN通过智能技术生成
__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,任意地址都可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值