新聞中心

        ARM中的對齊問題

        作者: 時(shí)間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
        ARM中,當(dāng)吧一個(gè)內(nèi)存區(qū)域初始化為某個(gè)結(jié)構(gòu)體時(shí),必須注意字節(jié)對齊情況。

        1. 簡介

        本文引用地址:http://www.104case.com/article/201611/316963.htm

        在ARM中,有ARM和Thumb兩種指令。
        ARM指令 :每執(zhí)行一條指令,PC的值加4個(gè)字節(jié)(32bits).一次訪問4字節(jié)內(nèi)容,該字節(jié)的起始地址必須是4字節(jié)對齊的位置上,

        即地址的低兩位為bits[0b00],也就是說地址必須是4的倍數(shù)。
        Thumb指令:每執(zhí)行一條指令,PC的值加2個(gè)字節(jié)(16bits).).一次訪問2字節(jié)內(nèi)容,該字節(jié)的起始地址必須是2字節(jié)對齊的位置上,

        即地址的低兩位為bits=0,也就是說地址必須是2的倍數(shù)。

        遵循以上方式叫對齊(aligned)方式,不遵守這樣方式稱為非對齊(unaligned)的存儲訪問操作。

        ARM CPU不支持未對齊雙字(8 bytes)訪問。

        雙字訪問必須是8字節(jié)/4字節(jié)對齊.

        2. ARM平臺中的字節(jié)對齊關(guān)鍵字

        (1) __align(num)

        (2) __packed

        進(jìn)行一字節(jié)對齊。

        (3) __unaligned

        用于修飾某個(gè)變量,可按照非對齊方式訪問。

        3. __packed與#pragma pack(1)的區(qū)別

        4. __attribute__((aligned))

        用于指定類型的最低對齊要求.

        5. --unaligned_access / --no_unaligned_access

        用于啟用/禁止:CPU上的未對齊數(shù)據(jù)訪問.

        ARMv6 / ARMv7-AR : 默認(rèn)值為--unaligned_access

        ARMv6之前的/ARMv7-M : 默認(rèn)值為--no_unaligned_access

        EDK中RVCT_ALL_CC_FLAGS設(shè)為:--no_unaligned_access

        ARMGCC沒有設(shè)。

        6. 內(nèi)存分配函數(shù)

        盡量保證返回的地址,都是4字節(jié)對齊的。

        7. 如何查找與字節(jié)對齊方面的問題

        (1) 編譯器的big little 設(shè)置

        EDK中ARMGCC的flag設(shè)為:-mlittle-endian

        (2) CPU是否支持非對齊訪問


        ===================

        字節(jié)對齊的故障只能出現(xiàn)在“引用”的使用過程中。當(dāng)使用“對象名”來操作對象時(shí),根本不用擔(dān)心字節(jié)對齊問題

        在ADS環(huán)境下,有“ALIGN” 、“__align(x)” 、“__packed”關(guān)鍵字用于字節(jié)對齊處理。ALIGN用于匯編語言,__align(x)用于C語言,

        __packed用于放棄字節(jié)對齊。

        單字節(jié)對齊類型的引用可以操作任何對象,雙字節(jié)對齊類型的引用可以操作雙字節(jié)、四字節(jié)、八字節(jié)對齊的對象,…………。

        只有遵守這個(gè)規(guī)則,程序才可能是健壯的。

        如果我們想使用雙字節(jié)對齊類型的引用來操作單字節(jié)對齊對象,那么你在定義該引用時(shí)必須使用__packed關(guān)鍵字!

        ============================



        關(guān)鍵詞: ARM對齊問

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 林口县| 温州市| 保山市| 平度市| 商南县| 南安市| 柳江县| 长宁县| 绥阳县| 博白县| 独山县| 怀化市| 巫溪县| 龙海市| 曲周县| 盐亭县| 汪清县| 安平县| 迭部县| 榆树市| 贡觉县| 崇仁县| 桓仁| 济源市| 天气| 广丰县| 台江县| 大庆市| 瑞丽市| 蕲春县| 西吉县| 弋阳县| 九寨沟县| 洪洞县| 厦门市| 德兴市| 金寨县| 通河县| 集安市| 藁城市| 麻栗坡县|