×
单片机 > 单片机程序设计 > 详情

ARM中的对齐问题

发布时间:2020-06-02 发布时间:
|
在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关键字!

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

关键字:ARM  对齐问题 

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

热门文章 更多
AVR M16实验之六 DS18B20测温