1. 程式人生 > >ARM程式由於位元組對齊引起的問題深入分析

ARM程式由於位元組對齊引起的問題深入分析

今天YD在移植告警模組時遇到一個很稀罕的warning,google+baidu也沒有找到結果。

warning描述如下: Warning[Pa039]: use of address of unaligned structure member ......

對應的程式為: lstInit(&(gCurAlarmList.currentAlarmTable));

gCurAlarmList的定義為:

typedef struct curAlarmList
{
ALARM_ELEMENT *pstCurAlarmList; /*記錄的起始地址 */
LIST currentAlarmTable; /* 當前告警表的入口 */
LIST freeAlarmEntresQueue; /*空閒結點表 */
ALARM_ELEMENT *pstFirstEntryInAlarmList; /*第一個條目的地址 */
int curAlarmItems; /*當前告警的條目數*/
}CUR_ALARM_LIST;

YD先採用強制型別轉換的方式告警並未消除。在正文中加入#pragma pack(1)也無效。懷疑為資料結構宣告環境的問題。

與YD確認,系統使用的是ARM的體系結構和指令集,ARM有下面限制:

在ARM中,有ARM和Thumb兩種指令。

ARM指令:每執行一條指令,PC的值加4個位元組(32bits).一次訪問4位元組內容,該位元組的起始地址必須是4位元組對齊的位置上,即地址的低兩位為bits[0b00],也就是說地址必須是4的倍數。

Thumb指令:每執行一條指令,PC的值加2個位元組(16bits).).一次訪問2位元組內容,該位元組的起始地址必須是2位元組對齊的位置上,即地址的低兩位為bits[0b0],也就是說地址必須是2的倍數。

檢查資料結構宣告檔案中發現標頭檔案中有#pragma pack(1),遂改為#pragma pack(4),再編譯warning消失。

但是,一定要注意:這絕不是結束,還需要程式碼允許的正確性,例如結構中的小於4B的char 成員是否還可正常訪問。