在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关键字!
============================