<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          ARM中的對(duì)齊問題

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

          1. 簡(jiǎn)介

          本文引用地址:http://www.ex-cimer.com/article/201611/316963.htm

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

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

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

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

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

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

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

          (1) __align(num)

          (2) __packed

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

          (3) __unaligned

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

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

          4. __attribute__((aligned))

          用于指定類型的最低對(duì)齊要求.

          5. --unaligned_access / --no_unaligned_access

          用于啟用/禁止:CPU上的未對(duì)齊數(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é)對(duì)齊的。

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

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

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

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


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

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

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

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

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

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

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

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



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

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();