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

 

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