您的位置 首页 IOT

ARM处理器关于非对齐存储的拜访规矩

ARM系列处理器是RISC(ReducdedInstructionSetComputing)处理器。很多基于ARM的高效代码的程序设计策略都源于RISC处理器。

ARM 系列处理器是 RISC (Reducded Instruction Set Computing)处理器。许多根据ARM的高效代码的程序设计战略都源于RISC 处理器。和许多 RISC 处理器相同,ARM 系列处理器的内存拜访,也要求数据对齐,即存取“字(Word)”数据时要求四字节对齐,地址的bits[1:0]==0b00;存取“半字(Halfwords)”时要求两字节对齐,地址的bit[0]==0b0;存取“字节(Byte)”数据时要求该数据按其天然尺度鸿沟(Natural Size Boundary)定位。

  ARM 编译程序一般将全局变量对齐到天然尺度鸿沟上,以便经过运用 LDR和 STR 指令有效地存取这些变量。这种内存拜访办法与大都 CISC (Complex Instruction Set Computing)体系结构不同,在CISC体系结构下,指令直接存取未对齐的数据。因此,当需要将代码从CISC 体系结构向 ARM 处理器移植时,内存拜访的地址对齐问题有必要予以留意。在RISC体系结构下,存取未对齐数据不管在代码尺度或是程序履行功率上,都将支付非常大的价值。
  本文将从以下几个方面评论在ARM体系结构下的程序设计问题。
  未对齐的数据指针
  C和C++编程规范规矩,指向某一数据类型的指针,有必要和该类型的数据地址对齐办法共同,所以ARM 编译器期望程序中的 C 指针指向存储器中字对齐地址,由于这可使编译器生成更高效的代码。
  比方,假如界说一个指向 int 数据类型的指针,用该指针读取一个字,ARM 编译器将运用LDR 指令来完结此操作。假如读取的地址为四的倍数(即在一个字的鸿沟)即能正确读取。可是,假如该地址不是四的倍数,那么,一条 LDR 指令回来一个循环移位成果,而不是履行真实的未对齐字载入。循环移位成果取决于该地址向关于字的鸿沟的偏移量和体系所运用的端序(Endianness)。例如,假如代码要求从指针指向的地址 0x8006 载入数据,即要载入 0x8006、0x8007、0x8008 和 0x8009 四字节的内容。可是,在 ARM 处理器上,这个存取操作载入了0x8004、0x8005、0x8006 和 0x8007 字节的内容。这就是在未对齐的地址上运用指针存取所得到的循环移位成果。
  因此,假如想将指针界说到一个指定地址(即该地址为非天然鸿沟对齐),那么在界说该指针时,有必要运用 __packed 限制符来界说指针: 例如,
  __packed int *pi; // 指针指向一个非字对其内存地址
  运用了_packed限制符限制之后,ARM 编译器将产生字节存取指令(LDRB或STRB指令)来存取内存,这样就不必考虑指针对齐问题。所生成的代码是字节存取的一个序列,或许取决于编译选项、跟变量对齐相关的移位和屏蔽。但这会导致体系功能和代码密度的丢失。
  值得留意的是,不能运用 __packed 限制的指针来存取存储器映射的外围寄存器,由于 ARM 编译程序可运用多个存储器存取来获取数据。因此,或许对实践存取地址邻近的方位进行存取,而这些邻近的方位或许对应于其它外部寄存器。当运用了位字段(Bitfield)时, ARM 程序将拜访整个结构体,而非指定字段。

在ARM中,一般期望字单元的地址是字对齐的(地址的低两位为0b00),半字单元的地址是半字对齐的(地址的最低为0b0).在存储拜访操作中,假如存储单元的地址没有恪守上述的对齐规矩,则称为非对齐(unaligned)的存储拜访操作.

转载自:ARM开发板|嵌入式开发http://armdmc.woku.com/article/5018028.html

———————————————— END ————————————————

1.非对齐指令的预取操作
当处理器处于ARM状况器材,假如写入到寄存器PC中的值对错字对齐的(低两位不为0b00),要么指令履行的成果不行预知,要么地址值中最低两位被疏忽;
当处理器处于Thumb状况器材,假如写入到寄存器PC中的值对错半字对齐的(最低位不为0b0),要么指令履行的成果不行预知,要么的重地值中最低位被疏忽.
假如体系中指定,当产生非对齐的指令预取操作时,疏忽地址值中相应的位,则有存储体系完成这种”疏忽”.也就是说,这时该地址值原封不动的送到存储体系.
2.非对齐的数据拜访操作
关于Load/Store操作,假如对错对齐的数据拜访操作,体系界说了下面3种或许的成果.
<1>履行的成果不行预知.
<2>疏忽字单元地址的低两位,即拜访地址为(address _and 0xffffffc)的字单元;疏忽半字单元地址的最低位的值,即拜访地址位(address _and 0xffffffe)的半字单元.
<3>疏忽字单元地址值种的低两位的值;疏忽半字单元地址的最低位的值.有存储体统完成这种”疏忽”.也就是说,这时该地址值原封不动的送到存储体系.arm开发板
当产生非对齐的数据拜访时,究竟选用上述3种处理办法种的哪一种,是有各指令指定的.
arm指令预取和自修正代码
在ARM中答应指令预取.在CPU履行当时指令的一起,能够从存储器种预取出若干条指令,详细预取多少条指令,不同的ARM完成种有不同的数值.
预取的指令并不一定能得到履行。比方当时指令完结后,假如产生了异常中断,程序将会跳转到异常中断处理程序处履行,当时预取的指令将被扔掉.或许假如履行了跳转指令,则当时预取的指令也将被扔掉.
正如在不同的ARM嵌入式开发完成预取的指令条数或许不同,当产生程序跳转是,不同的ARM完成种选用的跳转猜测算法也或许不同.

自修正代码指的是代码在履行进程种或许修正本身.关于支撑指令预取的ARM体系,自修正代码或许带来潜在的问题.当指令被预取后,在该指令被履行前,假如有数据拜访指令修正了坐落主存种的该指令,这是被预取的指令和主存种对应的指令不同,然后或许使履行的成果产生过错.

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部