您的位置 首页 ADAS

ARM中的对齐问题

在ARM中,当吧一个内存区域初始化为某个结构体时,必须注意字节对齐情况。1.简介在ARM中,有ARM和Thumb两种指令。ARM指令:每执行一条…

ARM中,当吧一个内存区域初始化为某个结构体时,有必要留意字节对齐状况。

1. 简介

在ARM中,有ARM和Thumb两种指令。
ARM指令 :每履行一条指令,PC的值加4个字节(32bits).一次拜访4字节内容,该字节的开始地址有必要是4字节对齐的方位上,

即地址的低两位为bits[0b00],也就是说地址有必要是4的倍数。
Thumb指令:每履行一条指令,PC的值加2个字节(16bits).).一次拜访2字节内容,该字节的开始地址有必要是2字节对齐的方位上,

即地址的低两位为bits=0,也就是说地址有必要是2的倍数。

遵从以上方法叫对齐(aligned)方法,不恪守这样方法称为非对齐(unaligned)的存储拜访操作。

ARM CPU不支撑未对齐双字(8 bytes)拜访。

双字拜访有必要是8字节/4字节对齐.

2. ARM平台中的字节对齐关键字

(1) __align(num)

(2) __packed

进行一字节对齐。

(3) __unaligned

用于润饰某个变量,可依照非对齐方法拜访。

3. __packed与#pragma pack(1)的差异

4. __attribute__((aligned))

用于指定类型的最低对齐要求.

5. –unaligned_access / –no_unaligned_access

用于启用/制止:CPU上的未对齐数据拜访.

ARMv6 / ARMv7-AR : 默认值为–unaligned_access

ARMv6之前的/ARMv7-M : 默认值为–no_unaligned_access

EDK中RVCT_ALL_CC_FLAGS设为:–no_unaligned_access

ARMGCC没有设。

6. 内存分配函数

尽量确保回来的地址,都是4字节对齐的。

7. 怎么查找与字节对齐方面的问题

(1) 编译器的big little 设置

EDK中ARMGCC的flag设为:-mlittle-endian

(2) CPU是否支撑非对齐拜访

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

字节对齐的毛病只能出现在“引证”的运用过程中。当运用“目标名”来操作目标时,底子不必忧虑字节对齐问题

在ADS环境下,有“ALIGN” 、“__align(x)” 、“__packed”关键字用于字节对齐处理。ALIGN用于汇编言语,__align(x)用于C言语,

__packed用于抛弃字节对齐。

单字节对齐类型的引证能够操作任何目标,双字节对齐类型的引证能够操作双字节、四字节、八字节对齐的目标,…………。

只要恪守这个规矩,程序才可能是强健的。

假如咱们想运用双字节对齐类型的引证来操作单字节对齐目标,那么你在界说该引证时有必要运用__packed关键字!

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/adas/275066.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部