ARM处理器关于非对齐存储的访问规则

发布者:RadiantBreeze最新更新时间:2016-06-30 来源: eefocus关键字:ARM处理器  非对齐存储  访问规则 手机看文章 扫描二维码
随时随地手机看文章
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系统,自修改代码可能带来潜在的问题.当指令被预取后,在该指令被执行前,如果有数据访问指令修改了位于主存种的该指令,这是被预取的指令和主存种对应的指令不同,从而可能使执行的结果发生错误.


关键字:ARM处理器  非对齐存储  访问规则 引用地址:ARM处理器关于非对齐存储的访问规则

上一篇:ARM处理器寄存器和汇编指令系统
下一篇:ARM基础知识教程二:ARM处理器的寄存器

推荐阅读最新更新时间:2024-03-16 14:58

DCS控制器中采用ARM处理器的冗余设计
在自动化的许多领域,有效性的要求越来越高,因而对自动化系统的容错水平的要求也变得越来越高,尤其在设备停机代价非常大的场合。为了满足这些严格的要求,在DCS系统中通常采用冗余技术,这样才能够满足这些领域所需要的安全性、可靠性和有效性的标准。 在DCS控制系统中,分布处理单元是系统关键的部分。当前这些分布处理单元的控制器往往是基于86系列CPU建构的,这种架构目前被广泛采用。但是由于86系列分布处理单元的特点,导致现在的控制器处理单元存在很多的缺点,如放热量大等。而且在封闭的环境中,这些问题始终很难解决。随着很多低功耗技术的发展和低功耗控制器的出现,分布处理单元的CPU可以有更多的选择,尤其是低功耗的控制器产生很少的热量,且可以使系统
[工业控制]
Portland Group发布OpenCL多核ARM处理器编译器
意法半导体全资子公司Portland Group™ (PGI),发布基于ARM内核的ST-Ericsson NovaThor™移动平台专用PGI OpenCL开发框架。该开发框架包括1个把多核ARM CPU视为一个计算设备的PGI OpenCL编译器,并增强了OpenCL GPU(图形处理器)编译器功能。NovaThor是一个高集成度的完整的移动平台,整合了性能和功耗均优化的多核 ARM® Cortex™ A系列CPU、先进的图形处理器、性能强大的多媒体引擎和最新的移动宽带和通信接口技术。新框架的发布让Portland Group的产品线覆盖OpenCL和多核ARM微控制器。 OpenCL是一个异构计算机系统编程模型。异构计算机系统
[单片机]
ARM处理器模式切换(含MRS,MSR指令)
1.1.1 ARM处理器模式切换(含MRS,MSR指令) 除了用户模式和系统模式,其余模式下都有一个私有SPSR保存状态寄存器,用来保存切换到该模式之前的执行状态,之所以用户模式和系统模式没有SPSR是因为,通常CPU大部分时间执行在用户模式下,当产生异常或系统调用时会分别切换进入另外几种模式,保存用户模式下的状态,当切换回原先模式时,直接回复SPSR的值到CPSR就可以了,因此,用户模式和系统模式下不需要SPSR,其详细操作查看下节异常处理。 以上几种模式通过CPSR里的M 位进行区分,如图3-1所示: 图3-1 CPSR控制位 通过向模式位M 里写入相应的数据切换到不同的模式,在对CPSR,SPSR寄存器进行操作不能使
[单片机]
<font color='red'>ARM处理器</font>模式切换(含MRS,MSR指令)
德州仪器隆重推出30多款全新 ARM(R) 器件
  日前,德州仪器 (TI) 宣布推出 31 款全新的 ARM 处理器,可为客户提供从成本低至 1 美元到超过 1GHz的未来产品的高扩展性解决方案,显著壮大了嵌入式处理器产品的阵营。最新处理器包括 29 款 Stellaris Cortex-M3 微控制器 (MCU) 以及基于 ARM9和 Cortex-A8 技术的最新微处理器 (MPU) —— Sitara 系列旗下的头两款器件。该产品阵营的进一步壮大得益于TI 近期对 Luminary Micro 的并购,使 TI 作为单个供应商所推出的业界最丰富 ARM 技术处理器系列得到进一步加强。     TI ARM 系列产品拥有完整的信号链,其中包括的众多低功耗处理器不仅
[嵌入式]
ARM处理器架构----处理器的工作状态
之前,一直都在看arm的驱动开发,最近看了ucos,同时也开始对arm的架构有了更深入一点的了解。大学学微机原理的时候学的是x86的架构,它和arm还是有挺多区别的。下面就整理一些自己的所学和在网上转载的关于arm架构的内容。有一本很好的讲arm架构的书:《ARM System Developer's Guide》。 从编程人员的视角来看,arm核是由数据总线连接的功能单元组成,如下图所示: 数据通过数据总线流向处理器核心,这里的数据可以是将要执行的指令,也可以是数据项.上面的图是Von Neumann体系的arm核,数据项和指令共用同一总线.而哈佛结构体系的arm核就会用两个不同的总线.就像所有的RISC处理器,
[单片机]
<font color='red'>ARM处理器</font>架构----处理器的工作状态
ARM处理器中的寄存器基本知识详解
ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄器包括: ● 31个通用寄存器,包括程序计数器(PC指针),均为32位的寄存器。 ● 6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位,目前只使用了其中的一部分。 ARM微处理器支持7种运行模式,分别为: ● usr(用户模式):ARM处理器正常程序执行模式。 ● fiq(快速中断模式):用于高速数据传输或通道处理 ● irq(外部中断模式):用于通用的中断处理 ● svc(管理模式):操作系统使用的保护模式 ● abt (数据访问终止模式): 当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。 ● sys(系统模式): 运行具有特权
[单片机]
<font color='red'>ARM处理器</font>中的寄存器基本知识详解
基于ARM处理器的CAN-Ethernet通信模块实现
  近20 年来工业测控系统发展的趋势是:分散控制和集中管理、标准化和开放性。工业测控系统从传统的集中测量控制系统转向网络化的集散控制系统。随着现场总线技术高速发展和标准化程度不断提高,以现场总线技术为基础的开放型集散测控系统—现场总线测控系统得到了广泛的应用。同时,以太网的应用也迅速向工业测控系统渗透,在工业自动化应用中异军突起。   这种趋势的出现与计算机技术、信息技术、网络通信技术的高速发展相关。现代工业系统信息交换的需求也已经从管理层内部迅速覆盖到控制、现场设备等各个层次,连接上层网络和现场总线的通信设备成为工厂自动化系统中的关键设备之一。CAN-Ethernet通信模块,是一种直接连接以太网和CAN现场总线的设备,
[单片机]
基于<font color='red'>ARM处理器</font>的CAN-Ethernet通信模块实现
三星ARM处理器S3C4510B的HDLC通道使用及编程
摘要 三星16/32位ARM处理器S3C4510B是目前在国内应用非常广泛的一种性价比很高的ARM处理器,本文在介绍S3C4510B中HDLC通道结构特点的基础上,详细说明了4510中HDLC通道在DMA收发方式下的工作过程,使用方法和编程中的一些注意事项。 1:S3C4510B简介 S3C4510B(以下简称4510)是韩国三星公司开发的一款基于ARM7TDMI架构的16/32位高性能微处理器。具用丰富的外围接口,如以太网,HDLC等,可灵活配置,适用于多种应用。4510具有以下性能特点: ◆ 8K字节的内部CACHE,也可用作内部SRAM ◆ 两线IIC接口,作为IIC主器件使用 ◆ 以太网控制
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved