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

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小。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章