×
嵌入式 > 嵌入式开发 > 详情

ARM中的对齐问题

发布时间:2020-08-27 发布时间:
|
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关键字!

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



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
NXP推出Wi-Fi 6E三频段SOC 充分释放6GHz频谱潜力