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