ARM C程序 数据对齐访问问题

探讨了C/C++中内存对齐的重要性及其对数据访问效率的影响,通过实例解析了非对齐访问可能导致的问题及解决方案,强调了不同ARM内核对此的处理差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C或者C++等语言中会涉及到内存操作,嵌入式处理器中对数据的访问,需要遵循对齐原则,要求对齐的目的是为了提高数据的获取效率,举个例子,如果也给32位数字是4字节对的,cpu一条指令即可完成数据复制,如果一个32位数字是非4字节对齐的,那么cpu需要至少3条指令完成一个4字节数据的复制,如此一来降低了内存数据访问的效率。

以实际遇到的问题为例

char a[10] = {0};

定义一个int16_t *ptr

mcmcpy(ptr, &a[5], sizeof(int16_t));

这里会存在非对齐访问的问题,查看反汇编会被翻译成 STRH R0, Rn

STRH要求Rn中的地址要是按照Half Word对齐如果Rn指向的地址不是2字节对齐的,就会触发非对齐访问异常。

导致程序崩溃。

解决办法:

(1)将ptr改成单字节,逐个去复制。

(2)定义一个pack的基本数据类型:

typedef struct __attritute__ ((packed))

{

        int16_t data;

}INT16_T;

INT16_t *ptr;

mcmcpy(ptr, &a[5], sizeof(INT16_T));

 

注意:

(1)arm coretex m0 如果出现非对其内存访问就会触发 usage exception,无法关闭。

arm coretex m3 4 7可以把此异常关闭,如此一来就不会存在出发非对齐访问异常。

(2)packed(n) 指的是对于结构体/共用体中的数据,要求的最大字节对齐要求,结构体/共用体中的每一个数据类型的地址不能超过n,但是可以比n小。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值