ARM7嵌入式系统设计与仿真:基于Proteus、Keil 与IAR(无赠送光盘)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-08 02:41:17

点击下载

作者:周润景

出版社:清华大学出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

ARM7嵌入式系统设计与仿真:基于Proteus、Keil 与IAR(无赠送光盘)

ARM7嵌入式系统设计与仿真:基于Proteus、Keil 与IAR(无赠送光盘)试读:

版权信息书名:ARM7嵌入式系统设计与仿真:基于Proteus、Keil 与IAR(无赠送光盘)作者:周润景排版:昀赛出版社:清华大学出版社出版时间:2012-01-01ISBN:9787302277415本书由清华大学出版社有限公司 授权北京当当科文电子商务有限公司制作与发行。—·版权所有 侵权必究·—前 言

当代生活的每一个角落都有嵌入式设备的存在,如数码相机、移动电话、TV机顶盒和掌上电脑等,这些设备多采用32位RISC嵌入式处理器作为核心部件,其中基于ARM核的嵌入式处理器独占鳌头,在32位RISC处理器中占据超过75%的市场份额。

在传统的嵌入式系统学习中,嵌入式开发平台是必不可少的,而资源少的开发平台价格便宜,但功能较少;资源多的开发平台,价格又不菲。英国Labcenter公司推出了适合嵌入式设计仿真与开发平台的软件Proteus,在该软件中可以根据需要搭建开发平台,将编译好的目标代码加载到芯片中。使用Proteus软件可以完全脱离硬件平台来学习嵌入式系统,可以说是嵌入式系统学习的一次革命。

本书以Philips公司的LPC2138微控制器为例,结合Keil for ARM和IAR开发工具,以大量实例介绍如何在Proteus中搭建硬件开发平台进行源代码级调试。全书共分6章,在内容安排上依照循序渐进的原则。

第1章是概述篇。读者可以初步了解嵌入式系统的概况,从不同的角度认识ARM嵌入式处理器,包括嵌入式微处理器、嵌入式微控制器、嵌入式DSP处理器和嵌入式片上系统等。

第2章重点介绍ARM体系结构,从不同方面介绍ARM微处理器体系结构,详细阐述了存储器、处理器、内部寄存器和程序状态寄存器的内容,对异常、中断延迟、复位、存储器映射及存储器映射I/O做了深入讲解。以直观的方法介绍了寻址方式、ARM7指令集等,并针对不同的接口——协处理器接口、调试接口、ETM接口进行了说明。

第3章讲解了LPC2138的硬件结构,阐述了系统控制模块、存储器加速模块的相关功能,介绍了微处理器引脚配置以及引脚连接典型2模块——GPIO、UART、IC接口、SPI、定时器、脉宽调制PWM、A/D转换器、实时时钟RTC和看门狗定时器(WDT)。以方便、直观、形象的方式进行了清晰而详尽的讲解。

第4章集中介绍了动态仿真软件Proteus,通过一个简单的案例阐述了该软件的使用方法,突出了该软件对复杂电路仿真的应用,Proteus基于界面友好且功能齐全的Windows操作平台,为用户提供了一个嵌入式微处理器LPC2138的设计和开发环境。

第5章以一个实际的例子详细阐述了Keil for ARM软件的使用方法,针对LPC2138不同模块的相关功能,运用大量案例直观说明ARM控制系统的设计和仿真,并在每个案例后结合Proteus仿真软件进行仿真,将理论和实际紧密结合在一起,更加深入理解设计的应用。

第6章着重讲解了IAR Embedded Workbench for ARM version软件的使用方法,同第4章一样通过一个实际案例讲解了软件的使用方法,包括相关参数的配置及程序的下载,并结合LPC2138不同模块的相关功能,运用大量实例介绍了LPC2138控制系统的设计和仿真,并在每个案例后结合Proteus仿真软件进行仿真。

在编写过程中参考了许多书籍、文章和标准等,这些参考文献使作者深受启发,在此向各位作者表示感谢。

本书共分6章,刘梦男编写了第1章,其余由周润景编写,全书由周润景定稿。

由于作者水平有限,书中错误与不妥之处在所难免,敬请广大读者批评指正。作者2011.8第1章 嵌入式系统概述1.1 嵌入式系统简介

根据IEEE(国际电气和电子工程师协会)的定义,嵌入式系统是“控制、监视或者辅助设备、机器和车间运行的装置”(全称为devices used to control,monitor,or assist the operation of equipment,machinery)。这主要是从应用上加以定义的,由此可以看出嵌入式系统是软件和硬件的综合体,可以涵盖机械等附属装置。

目前国内一个普遍的定义:以应用为中心、以计算机技术为基础,软硬件可裁减,适于应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。还有另一种定义:嵌入式系统是设计完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算机系统。术语“嵌入式”反映了这些系统通常是更大系统中的一个完整部分,称为嵌入的系统。两种定义的出发角度不同,前者是从技术角度来定义的,后者是从系统角度来定义的。由于嵌入式系统本身是一个外延很广的名词,凡是与产品结合在一起的具有嵌入式特点的控制系统都可以叫嵌入式系统,很难给它下一个准确的定义。因此,目前通常把嵌入式系统概念的重心放在“系统”(即操作系统)上,指能够运行操作系统的软硬件综合体。总体上嵌入式系统可以划分成硬件和软件两部分,硬件一般由高性能的微处理器和外围接口电路组成,软件一般由实时操作系统和其上运行的应用软件构成,软件和硬件之间由所谓的中间层(BSP层,板级支持包)连接。

一般而言,嵌入式系统的架构可以分成4个部分:处理器、存储器、输入/输出(I/O)和软件,如图1.1所示。图1.1 嵌入式系统的架构1.2 嵌入式处理器1.2.1 嵌入式处理器简介

从硬件方面讲,嵌入式系统的核心是嵌入式处理器,据不完全统计,全世界嵌入式处理器的品种数量已经超过1000多种,流行体系结构有30多个,其中8051体系占大多数。生产8051单片机的半导体厂家有20多个,共350多种衍生产品,仅Philips就有近100种。近年来,嵌入式微处理器的主要发展方向是小体积、高性能、低功耗,专业分工也越来越明显,出现了专业的IP(Intellectual Property Core,知识产权核)供应商,如ARM、MIPS等,它们提供优质、高性能的嵌入式微处理器内核,由各半导体厂商生产面向各个应用领域的芯片。

嵌入式微处理器有许多种流行的处理器核,芯片制造商一般都基于这些处理器核生产不同型号的芯片。一般可以将嵌入式处理器分成4类,即嵌入式微处理器(MicroProcessor Unit,MPU)、嵌入式微控制器(MocroController Unit,MCU)、嵌入式DSP处理器(Digital Signal Processor,DSP)和嵌入式片上系统(System on Chip,SoC)。

❑ 嵌入式微处理器

嵌入式微处理器的基础是通用计算机中的CPU,它的特征是32位以上的处理器,具有较高的性能,当然其价格也相当高。为了满足嵌入式应用的特殊要求,虽然嵌入式微处理器在功能上和标准微处理器基本上是一样的,但一般在工作温度、抗电磁干扰及可靠性等方面都做了各种增强。

与工业控制计算机相比,嵌入式微处理器具有体积小、重量轻、成本低、可靠性高等优点。嵌入式微处理器目前主要有Am186/88、386EX、SC-400、Power PC、68000、MIPS和ARM/StrongARM系列等。

❑ 嵌入式微控制器

嵌入式微控制器最典型的代表是单片机,单片机芯片内部集成了ROM/EPROM、RAM、总线、总线逻辑、定时/计数器、看门狗、I/O、串行口、脉宽调制输出、A/D、D/A、Flash、EEPROM等各种必要功能和外设。与嵌入式微处理器相比,微控制器的最大特点是单片机,体积大大减小,从而使功耗和成本下降、可靠性提高。微控制器是目前嵌入式系统工业的主流。微控制器的片上外设资源一般比较丰富,适合于控制,因此称为微控制器。

嵌入式微控制器目前的品种和数量最多,比较有代表性的包括8051、P51XA、MCS-251、MCS96/196/296、C166/167、MC68HC05/11/12/16、68300和数目众多的ARM芯片。目前,MCU占嵌入式系统约70%的市场份额。

❑ 嵌入式DSP处理器

DSP处理器是专门用于信号处理方面的处理器,其在系统结构和指令上进行了特殊设计,具有很高的编译效率和指令执行速度。在数字滤波、FFT、频谱分析等仪器上,DSP获得了大规模的应用。

嵌入式DSP处理器比较有代表性的产品是TI的TMS320系列和Motorola的DSP56000系列。

❑ 嵌入式片上系统

片上系统(SoC)最大的特点是成功实现了软硬件无缝结合,直接在处理器片内嵌入操作系统的代码模块。各种通用处理器内核将作为SoC设计公司的标准库,和许多其他嵌入式系统外设一样,成为VLSI设计中一种标准的器件,用标准的VHDL等语言描述,存储在器件库中。用户只需定义出其整个应用系统,仿真通过后就可以将设计图交给半导体工厂制作样品。这样除个别无法集成的器件以外,整个嵌入式系统大部分均可集成到一块或几块芯片中去,应用系统电路板将变得很简洁,对于减小体积和功耗、提高可靠性非常有利。

SoC可以分为通用和专用两类。通用系列包括Infineon的TriCore、Motorola的M-Core、某些ARM系列器件、Echelon和Motorola联合研制的Neuron芯片等。专用SoC一般专用于某个或某些系统中,不为一般用户所知。一个有代表性的产品是Philips的Smart XA,它将XA单片机内核和支持超过2048位复杂RSA算法的CCU单元制作在一块硅片上,形成一个可加载Java或C语言的专用SoC,可用于公众互联网(如Internet)安全方面。1.2.2 ARM处理器简介

ARM(Advanced RISC Machines)是全球领先的16/32位RISC微处理器的知识产权设计供应商,ARM公司通过转让高性能、低成本、低功耗的RISC微处理器、外围和系统芯片设计技术给合作伙伴,使他们能用这些技术来生产各具特色的芯片。ARM处理器小体积、低功耗、低成本。

目前,应用比较多的是ARM7系列、ARM9系列、ARM9E系列、ARM10系列、ARM11系列、SecurCore系列和Intel的StrongARM、XScale系列。

ARM7TDMI基于ARM体系结构V4版本,是目前低端的ARM核,具有广泛的应用,其最显著的应用为数字移动电话。ARM7TDMI使用流水线以提高处理器指令的流动速度。流水线允许几个操作同时进行,以及处理和存储系统连续操作。ARM7TDMI使用三级流水线,因此,指令的执行分成三个阶段——取指、译码和执行。ARM7TDMI核是冯·诺依曼体系结构,使用单一32位数据总线传送指令和数据,只有加载、存储和交换指令可以访问存储器中的数据。

ARM7TDMI-S是ARM7TDMI的可综合版本(软核)。对应用工程师来说,除非芯片生产商对ARM7TDMI-S进行了裁减,否则在逻辑上ARM7TDMI-S与ARM7TDMI没有太大区别,其编程模型与ARM7TDMI一致。第2章 ARM体系结构2.1 ARM处理器结构2.1.1 ARM处理器结构概述

ARM是一种精简指令集计算机,它具有外形非常小但性能高的结构,它的数据处理操作只针对寄存器的内容,而不直接对存储器进行操作。由寄存器内容和指令域决定简单的寻址模式,每一条数据处理指令都对算术逻辑单元(ALU)和移位器控制,以实现对ALU和移位器的最大利用,地址自动增加和自动减少的寻址模式实现了程序循环的优化。所有指令的条件执行实现最快速的代码执行,使ARM处理器在高性能、低代码规模、低功耗和小的硅片尺寸方面取得良好的平衡。

ARM处理器具有优异的性能且功耗很低,使用很少数量的门,基于精简指令集计算机原理设计,指令集和相关的译码机制比复杂指令集计算机要简单得多。2.1.2 流水线结构

ARM处理器通过使用流水线结构来增加处理器指令流的速度,这样可使几个操作同时进行,并使处理和存储器系统连续操作,提供0.9 MIPS/MHz的指令执行速度。

流水线使用3个阶段执行:(1)取指;(2)译码;(3)执行。

程序计数器(PC)指向被取指的指令,在执行一条指令的同时,对下一条指令进行译码,并将第3条指令从存储器中取出。2.2 存储器

ARM处理器的指令和数据共用一条32位总线。只有装载、存储和交换指令可以对存储器中的数据进行访问。数据可以是8位字节、16位半字或者32位字。字必须分配为占用4字节,而半字必须分配为占用2字节。ARM处理器的存储器接口设计可以使潜在的性能得到实现,这样减少了存储器使用。对速度有严格要求的控制信号使用流水线,这些控制信号使许多片内和片外存储器技术所支持的“快速突发访问模式”得到利用。

ARM处理器的存储器周期有4种基本类型:(1)内部周期;(2)非连续的周期;(3)连续的周期;(4)协处理器寄存器传输周期。2.3 处理器

ARM处理器支持8位字节、16位半字、32位字的数据类型。其内核结构包含32位ARM指令集和16位Thumb指令集,有两种操作状态:ARM状态和Thumb状态,在Thumb状态中,程序计数器使用bitl来选择切换半字。使用BX指令内核的操作状态在ARM状态和Thumb状态之间进行行切换,

LPC2138结构支持7种处理器模式:用户模式、快中断模式、中断模式、管理模式、中止模式、未定义模式和系统模式。除用户模式外,其他模式均为特权模式。ARM内部寄存器和一些片内外设在硬件设计上只允许特权模式下访问。特权模式可自由地切换处理器模式,而用户模式不能直接切换到别的模式。具体处理器模式说明如表2.1所示。表2.1 处理器模式

有5种处理器模式称为异常模式,它们是:(1)快中断模式;(2)中断模式;(3)管理模式;(4)中止模式;(5)未定义模式。

以上模式除了可通过程序切换进入外,也可由特定的异常进入。当特定的异常出现时,处理器进入相应的模式。每种模式都有某些附加的寄存器,以避免异常退出时,用户模式的状态不可靠。

系统模式与用户模式一样不能由异常进入,使用与用户模式完全相同的寄存器。由于它是特权模式,因而不受用户模式的限制。运用这个模式,操作系统访问用户模式的寄存器比较方便。另外,操作系统的一些特权任务也可使用这个模式,以访问一些受控资源,而需要考虑异常出现时任务状态变得不可靠。2.4 内部寄存器

ARM处理器内部有37个用户可见的寄存器:(1)31个通用32位寄存器,在ARM公司文件中它们的名称分别为R0~R15、R13_svc、R14_svc、R13_abt、R14_abt、R13_und、R14_und、R13_irq、R14_irq和R8_fiq~R14_fiq。(2)6个状态寄存器,在ARM公司文件中,它们的名称分别为CPSR、SPSR_svc、SPSR_abt、SPSR_und、SPSR_irq和SPSR_fiq。

这些寄存器并不是全都可以在同一时间被访问,处理器状态和操作模式决定了访问哪些寄存器。2.4.1 各模式可访问寄存器

在ARM状态中,16个通用寄存器和1个或2个状态寄存器可在任何时候同时被访问。在特权模式中,与模式相关的分组寄存器可以被访问。表2.2所示为所能访问的寄存器。表2.2 ARM状态各模式下的寄存器2.4.2 通用寄存器

1.数据或地址保存寄存器

寄存器R0~R13为保存数据或地址的通用寄存器,其中寄存器R0~R7为未分组的寄存器。这意味着对于任何处理器模式,它们中的每一个都对应于相同的32位物理寄存器。它们是完全通用的寄存器,不会被体系结构作为特殊的用途,并且可用于任何使用通用寄存器的指令。

2.分组寄存器

寄存器R8~R14为分组寄存器。它们所对应的物理寄存器取决于当前的处理器模式。几乎所有允许使用通用寄存器的指令都允许使用分组寄存器。寄存器R8~R12有两个分组的物理寄存器。一个用于除FIQ模式之外的所有寄存器模式(R8~R12),另一个用于FIQ模式(R8_fiq~R12_fiq)。寄存器R8~R12在ARM体系结构中没有特定的用途。FIQ所单独使用的这些寄存器可实现快速的中断处理。寄存器R13和R14分别有6个分组的物理寄存器。一个用于用户和系统模式,其余5个分别用于5种异常模式。

3.堆栈指针R13

寄存器R13通常作为堆栈指针SP。在ARM指令集中,没有以特殊方式使用R13的指令或其他功能,而在Thumb指令集中存在使用R13指令的情况。

每个异常模式都有其自身的R13分组版本,它通常指向由异常模式所专用的堆栈。在入口处,异常处理程序通常将其他要使用的寄存器值保存到这个堆栈。通过返回时将这些值重装到寄存器中,异常处理程序可确保异常发生时的程序状态不会被破坏。

4.链接寄存器R14

寄存器R14(也称为链接寄存器或LR)在结构上有两个特殊功能:

在每种模式下,模式自身的R14版本用于保存子程序返回地址。当使用BL或BLX指令调用子程序时,R14设置为子程序返回地址。子程序返回通过将R14复制到程序计数器来实现。

通常通过执行下列指令的两种方式:

在子程序入口,使用下列形式的指令将R14存入堆栈:

并使用匹配的指令返回:

发生异常后将R14对应的异常模式版本设置为异常返回地址(有些异常有一个小常量的偏移)。异常返回的执行类似于子程序返回,只是使用稍微不同的指令来确保被异常中断的程序状态能够完全恢复。

寄存器R14在其他任何时候都可作为一个通用寄存器。当嵌套异常发生时,这两个异常可能会发生冲突。例如,如果用户在用户模式下执行程序时发生了IRQ中断,则用户模式寄存器不会被破坏。但如果运行在IRQ模式下中断处理程序重新使能IRQ中断,并且发生了嵌套的IRQ中断时,外部中断处理程序中R14_irq的任何值都将被嵌套中断的返回地址所覆盖。通常处理方法是确保R14的对应版本在发生嵌套中断时不再保存任何有意义的值(可行的方法是将R14入栈)。当使用直接的方法冲突时,最好在进入异常处理程序后,重新使能中断或允许嵌套异常发生之前,切换到其他处理器模式。

5.程序计数器R15

寄存器R15保存程序计数器PC总是用于特殊用途。它经常用于通用寄存器R0~R14所使用的位置(即在指令编码中R15与R0~R14的地位一样,只是指令执行的结果不同),因此,可以认为它是一个通用寄存器。但是对于其使用还有许多与指令相关的限制或特殊情况。这些将在具体的指令描述中提到。通常,如果R15使用的方式超出了这些限制,那么指令是不可预测的。

1)读取程序计数器的一般限制

当指令对R15的读取没有超过任何对R15使用的限制时,读取的值是指令的地址加上8字节。由于ARM指令总是以字为单位,结果的bit[l:0]总是为0。

这种读取PC的方式主要用于对附近的指令和数据进行快速、与位置无关的寻址,包括程序中与位置无关的转移。

当使用STR或STM指令保存R15时,出现了上述规则的一个例外。这些指令可将指令地址加8字节保存(和其他指令读取R15一样)或将指令自身地址加12字节(将来还可能出现别的数据)。偏移量是8还是12(或是其他数值)取决于ARM的实现(即与芯片有关),对于某个具体的芯片,它是个常量,这样使用STR和STM指令是不可移植的。

由于这个例外,最好避免使用STR和STM指令来保存R15。如果很难做到,那么应当在该程序中使用合适的指令序列确定当前使用芯片所使用的偏移量。

2)写程序计数器的一般限制

当执行一条写R15的指令没有超出任何对它使用的限制时,写入R15的正常结果值被当成一个指令地址,程序从这个地址处继续执行(相当于执行一次无条件跳转)。

由于ARM指令以字为边界,因此写入R15值的bit[l:1]通常为0b00。具体的规则取决于所使用的结构版本:(1)在ARM结构v3版及以下版本中,写入R15值的bit[l:0]被忽略,因此指令的实际目标地址(写入R15的值)和0xFFFFFFFC相“与”。(2)在ARM结构v4版(ARM7TDMI基于v4版)及以上版本中,写入R15值的bit[l:O]必须为0b00;如果不是,则结果将不可预测。2.5 程序状态寄存器CPSR

所有模式共享一个程序状态寄存器。在异常模式中,另外一个寄存器程序状态保存寄存器SPSR可以被访问。每种异常具有自己的SPSR,在进入异常时,它保存CPSR的当前值;在异常退出时,可通过它恢复CPSR。2.5.1 各模式可访问的寄存器

Thumb状态寄存器集是ARM状态集的子集,程序员可直接访问,如表2.3所示。表2.3 Thumb状态各模式下的寄存器(1)8个通用寄存器R0~R7;(2)PC;(3)堆栈指针(SP);(4)连接寄存器(LR);(5)CPSR(有条件的访问)。

每个特权模式都有分组的SP和LR。2.5.2 一般的通用寄存器

在汇编语言中,寄存器R0~R7为保存数据或地址值的通用寄存器。对于任何处理器模式,它们中的每一个都对应于相同的32位物理寄存器。它们是完全通用的寄存器,不会被体系结构作为特殊的用途,并且可用于任何使用通用寄存器的指令。2.5.3 堆栈指针SP

堆栈指针SP对应ARM状态寄存器R13。每个异常模式都有其自身的SP分组版本,它通常指向由异常模式所专用的堆栈。在入口处,异常处理程序通常将其他要使用的寄存器值保存到这个堆栈。通过返回时将这些值重装到寄存器中,异常处理程序可确保异常发生时的程序状态不会被破坏。由于某种原因使处理器进入异常,处理器自动进入ARM状态。2.5.4 链接寄存器LR

链接寄存器LR对应ARM状态寄存器R14,在结构上有两个特殊功能,若异常时,处理器自动进入ARM状态。2.5.5 ARM状态寄存器和Thumb状态寄存器

Thumb状态寄存器与ARM状态寄存器有如下的关系:(1)Thumb状态的R0~R7与ARM状态的R0~R7相同;(2)Thumb状态的CPSR和SPSR与ARM状态的CPSR和SPSR相同;(3)Thumb状态的SP映射到ARM状态的R13;(4)Thumb状态的LR映射到ARM状态的R14;(5)Thumb状态的PC映射到ARM状态的PC(R15)。

寄存器R0~R7为低寄存器,寄存器R8~R15为高寄存器。2.5.6 Thumb状态访问高寄存器

在Thumb状态中,高寄存器R8~R15不是标准寄存器集的一部分。汇编语言程序对它们的访问受到限制,但可以将它们用于快速暂存。可以使用MOV指令的特殊变量将一个值从低寄存器R0~R7转移到高寄存器,或者从高寄存器转移到低寄存器。CMP指令可用于比较高寄存器和低寄存器的值。ADD指令可用于将高寄存器的值与低寄存器的值相加。

ARM7TDMI内核包含1个CPSR和5个供异常处理程序使用的SPSR。ARM7TDMI内核所有处理器状态都保存在CPSR中。当前的操作处理器状态位于CPSR当中。CPSR包含:(1)4个条件代码标志(负N、零Z、进位C和溢出V);(2)2个中断禁止位,分别用于一种类型的中断;(3)5个对当前处理器模式进行编码的位;(4)1个用于指示当前执行指令(ARM还是Thumb)的位。

每个异常模式还带有一个程序状态保存寄存器(SPSR),它用于保存任务在异常发生之前CPSR,其CPSR和SPSR通过特殊指令进行访问。2.5.7 条件代码标志

大多数数值处理指令可以选择是否修改条件代码标志。如果指令带S后缀,则指令会修改条件代码标志,但有一些指令总是改变条件代码标志。

N、Z、C和V位都是条件代码标志。可以通过算术和逻辑操作来设置这些位。这些标志还可通过MSR和LDM指令进行设置。ARM7TDMI处理器对这些位进行测试以决定是否执行一条指令。

各标志位的含义如下:

N 运算结果的b31位值。对于有符号二进制补码,结果为负数时,N=l;结果为正数或零时,N=0。

Z 指令结果为0时,Z=l(通常表示比较结果“相等”);否则,Z=0。

C 使用加法运算(包括CMN指令),b31位产生进位时,C=l;否则,C=0。使用减法运算(包括CMP指令),b31位产生借位时,C=0;否则,C=l。对于结合移位操作的非加法/减法指令,C为b31位最后的移出值,其他指令C通常不变;

V 使用加法/减法运算,当发生有符号溢出时,V=l;否则,V=0。其他指令V通常不变。

在ARM状态中,所有指令都可按条件来执行。在Thumb状态中,只有分支指令可条件执行。2.5.8 控制位

CPSR的最低8位为控制位。它们分别是中断禁止位、T位、模式位。

当发生异常时,控制位改变。当处理器在一个特权模式下操作时,可用软件操作这些位。

1.中断禁止位

I和F位都是中断禁止位:

❑ 当I位置位时,IRQ中断被禁止。

❑ 当F位置位时,FIQ中断被禁止。

2.T位

T位反映了正在操作的状态:

❑ 当T位置位时,处理器正在Thumb状态下运行。

❑ 当T位清零时,处理器正在ARM状态下运行。

3.模式位

M4、M3、M2、Ml和M0位(M[4:0])都是模式位。这些位决定处理器的操作模式,不是所有模式位的组合都定义有效的处理器模式,因此注意不要使用表2.4中未列出的组合。表2.4 CPSR模式位值2.5.9 保留位

CPSR中的保留位被保留将来使用。当改变CPSR标志和控制位时,请确认没有改变这些保留位。另外,请确保程序不依赖于包含特定值的保留位,因为将来的处理器可能会将这些位设置为1或0。2.6 异常

只要正常的程序流被暂时中止,处理器就进入异常模式。例如响应一个来自外设的中断。在处理异常之前,ARM7TDMI内核保存当前的处理器状态,这样当处理程序结束时,可以恢复执行原来的程序。

如果同时发生两个或更多异常,那么将按照固定的顺序来处理异常。2.6.1 异常入口/出口汇总

表2.5所示为异常入口处变量R14所保存的PC值以及退出异常处理程序所推荐使用的指令。表2.5 异常入口/出口2.6.2 进入异常

当处理异常时,ARM7TDMI内核会在适当的LR中保存下一条指令的地址。当异常入口来自M状态下,ARM7TDMI将下一条指令的地址复制到LR中(当前PC+4或PC+8,取决于异常的类型)。

Thumb状态下,ARM7TDMI将PC加偏移值(PC+4或PC+8,这取决于异常的类型),写入LR,当进入异常时,异常处理程序不必确定状态。例如,在SWI情况下,“MOVS PC,R14_svc”总是返回到下一条指令,而不管SWI是在ARM还是在Thumb状态下执行。(1)将CPSR复制到适当的SPSR;(2)根据异常将CPSR模式强制设为某一值;(3)强制PC从相关的异常向量处取指。

ARM7TDMI内核在中断异常时,置位中断禁止标志,这样可防止不受控制的异常嵌套。异常总是在ARM状态中进行处理。当处理器处于Thumb状态时发生了异常,在异常向量地址装入PC时,会自动切换到ARM状态。2.6.3 退出异常

当异常结束时,异常处理程序必须:(1)将LR中的值减去偏移量后移入PC;(2)将SPSR的值复制回CPSR;(3)清零在入口置位的中断禁止标志。2.6.4 快速中断请求

快速中断请求FIQ异常支持数据转移或通道处理。在ARM状态中,快中断模式有8个专用的寄存器,可用来满足寄存器保护的需要。将nFIQ信号拉低可实现外部产生FIQ。

不管异常入口是来自ARM状态还是Thumb状态,FIQ处理程序都会通过执行下面的指令从中断返回:

在一个特权模式中,可通过置位CPSR中的F标志来禁止FIQ异常。当F标志清零时,ARM7TDMI在每条指令结束时检测FIQ同步器输出端的低电平。2.6.5 中断请求

中断请求IRQ异常是一个由nIRQ输入端的低电平所产生的正常中断(在具体的芯片中,nIRQ由片内外设拉低,nIRQ是内核的一个信号,对用户不可见)。IRQ的优先级低于FIQ,对于FIQ序列它是被屏蔽的。任何时候,在一个特权模式下,都可通过置位CPSR中的1位来禁止IRQ。

不管异常入口是来自ARM状态还是Thumb状态,IRQ处理程序都会通过执行下面的指令从中断返回:2.6.6 中止

中止表示当前对存储器的访问不能被完成,这是通过外部ABORT输入指示的(在具体的芯片中,ABORT信号由片内存储器管理部件控制,ABORT是内核的一个信号,对用户不可见)。

处理器在存储器访问周期结束时检测中止异常。有两种类型的中止:

❑ 预取中止,发生在指令预取过程中。

❑ 数据中止,发生在对数据访问时。

1.预取中止

当发生预取中止时,ARM7TDMI内核将预取的指令标记为无效,但在指令到达流水线的执行阶段时才进入异常。如果指令在流水线中因为发生分支而没有被执行,则中止将不会发生。

在处理中止的原因之后,不管处于哪种处理器操作状态,处理程序都会执行下面的指令:

这个动作恢复了PC和CPSR并重试被中止的指令。

2.数据中止

当发生数据中止时,根据指令的类型产生不同的动作:

❑ 数据转移指令LDR、STR回写到被修改的基址寄存器。中止处理程序必须注意这一点。

❑ 交换指令SWP中止好像没有被执行过一样(中止必须发生在SWP指令进行读访问时)。

❑ 块数据转移指令LDM、STM完成。当回写被设置时,基址寄存器被更新。在指示出现中止后,ARM7TDMI内核防止所有寄存器被覆盖。这意味着ARM7TDMI内核总是会保护被中止的LDM指令中的R15(总是最后一个被转移的寄存器)。

中止的机制使指令分页的虚拟存储器系统能够被实现。在这样一个系统中,处理器允许产生仲裁地址。当某一地址的数据无法访问时,存储器管理单元MMU通知产生了中止。中止处理程序必须找出中止的原因,使请求的数据可以被访问并重新执行被中止的指令。应用程序不必知道可用存储器的数量,也不必知道它的被中止时所处的状态。

在修复产生中止的原因后,不管处于哪种处理器操作状态,处理程序都必须执行下面的返回指令:

这个动作恢复了PC和CPSR并重试被中止的指令。2.6.7 软件中断指令

软件中断SWI用于进入管理模式,通常用于请求一个特定的管理函数。SWI处理程序通过执行下面的指令返回:

这个动作恢复了PC和CPSR并返回到SWI之后的指令。SWI处理程序读取操作码以提取SWI函数编号。2.6.8 未定义的指令

当ARM7TDMI处理器遇到一条自己和系统内任何协处理器都无法处理的指令时,ARM7TDMI内核执行未定义指令陷阱。软件可使用这一机制通过仿真未定义的协处理器指令来扩展ARM指令集。ARM7TDMI处理器完全遵循ARM结构v4T,可捕获所有分类未被定义的指令位格式。在防止失败的指令后,捕获处理器执行下面的指令:

这个动作恢复了PC和CPSR,并返回到未定义指令之后的指令。2.6.9 异常向量

表2.6所示为异常向量地址。其中,I和F表示先前的值。表2.6 异常向量2.6.10 异常优先级

当多个异常同时发生时,一个固定的优先级系统决定它们被处理的顺序:

复位(最高优先级)→数据中止→FIQ→IRQ→预取中止→未定义指令→SWI(最低优先级)。

有些异常不能一起发生:

❑ 未定义的指令和SWI异常互斥。它们分别对应于当前指令一个特定(非重叠)译码。

❑ 当FIQ使能,并且在发生FIQ的同时产生了一个数据中止,ARM7TDMI内核进入数据中止处理程序,然后立即转到FIQ向量,从FIQ的正常返回使数据中止处理程序恢复执行。数据中止的优先级必须高于FIQ,以确保数据转移错误不会被漏过。必须将异常入口的时间增加到系统最坏情况下FIQ的延迟时间。2.7 中断延迟2.7.1 最大中断延迟

当FIQ使能时,最坏情况下FIQ的延迟时间包含:

T请求通过同步器的最长时间。T为2个处理器周SYNCMAXSYNCMAX期(由内核决定)。

T最长指令执行需要的时间(最长指令是装载包括PC在内所IDM有寄存器的LDM指令)。T在零等待状态系统中的执行时间为20个IDM周期。注意,是在零等待状态系统中,一般基于ARM7核的芯片存储器系统比内核速度慢,造成其不是零等待。

T数据中止入口的时间。T为3个周期(由内核决定)。EXCEXC

T为2个周期(由内核决定)。FIQ

因此,总的延迟时间为27个周期,在系统使用40MHz处理器时钟时,略微小于0.7μs。在此时间结束后,ARM7TDMI执行位于0xlC处的指令。

最大的IRQ延迟时间与之相似,但必须考虑到这样一个事实:即有更高优先级的FIQ。当FIQ和IRQ同时申请时,IRQ要延迟到FIQ处理程序允许IRQ中断时才处理(可能需要对中断控制器进行相应的操作)。IRQ延迟时间也要相应增加。2.7.2 最小中断延迟

FIQ或IRQ的最小中断延迟是请求通过同步器的时间T加SYNCMAX上T(共4个处理器周期)。FIQ2.8 复位

当nRESET信号被拉低时(一般外部复位引脚电平的变化和芯片的其他复位源会改变这个内核信号),ARM7TDMI处理器放弃正在执行的指令。

当nRESET信号再次变为高电平时,ARM处理器执行下列操作:(1)强制M[4:0]变为b10011(管理模式);(2)置位CPSR中的I和F位;(3)清零CPSR中的T位;(4)强制PC从地址0x00开始对下一条指令进行取指;(5)返回到ARM状态并恢复执行。

在复位后,除PC和CPSR之外的所有寄存器值都不确定。2.9 存储器及存储器映射I/O

ARM7TDMI处理器采用冯·诺依曼(Von Neumann)结构,指令和数据共用一条32位数据总线。只有装载、保存和交换指令可访问存储器中的数据。ARM7的规范仅定义了处理器核与存储系统之间的信号及时序(局部总线),而现实的芯片一般在外部总线与处理器核的局部总线之间有一个存储器管理部件将局部总线的信号和时序转换为现实的外部总线信号和时序。因此,外部总线的信号和时序与具体的芯片相关,具体到某个芯片外部存储系统的设计需要参考其芯片的数据手册或使用手册等资料。

ARM7TDMI处理器将存储器看作是一个从0开始的线性递增的字节集合:

❑ 字节0~3保存第1个存储的字;

❑ 字节4~7保存第2个存储的字;

❑ 字节8~11保存第3个存储的字。

ARM7TDMI处理器可以将存储器中的字以下列格式存储:

❑ 大端(Big-endian)格式;

❑ 小端(Little-endian)格式。2.9.1 地址空间32

ARM结构使用单个平面的2个8位字节地址空间。字节地址按照32无符号数排列,从0到2-1。30

地址空间可以看作是包含2个32位字,地址以字为单位进行分配,也就是将地址除以4。地址为A的字包含4个字节,地址分别为A,A+l,A+2和A+3。

在ARM结构v4及以上版本中(ARM7TDMI基于v4版本),地址空31间还可被看作包含2个16位半字。地址按照半字进行分配。地址为A的半字包含2个字节,地址分别为A和A+l。

地址计算通常通过普通的整数指令来实现。这意味着如果地址向上或向下溢出地址空间,通常会发生翻转,也就是说计算的结果以322为模。但是如果地址空间在将来进行扩展,为了降低不兼容性,程序不应依赖于该特性进行编写。如果地址的计算没有发生翻转,那么31结果仍然位于范围0~2-1内。

大多数指令通过指令所指定的偏移量与PC值相加并将结果写入PC来计算目标地址。如果计算:(当前指令的地址)+8+偏移量溢出地址空间,那么该指令依赖于地址的翻转,这在技术上是不可预测的。因此,穿过地址0xFFFFFFFF的向前转移和穿过地址0x00000000的向后转移都不应使用。

另外,正常连续执行的指令实际上是通过计算:(当前指令的地址)+4来确定下一条要执行的指令。如果该计算溢出了地址空间的顶端,结果同样不可预测。换句话说,程序不应信任在地址0xFFFFFFFC处的指令之后连续执行的位于地址0x00000000的指令。上述原则不只适用于执行的指令,还包括指令条件代码检测失败的指令。大多数ARM在当前执行的指令之前执行预取指令。如果预取操作溢出了地址空间的顶端,则不会产生执行动作并导致不可预测的结果,除非预取的指令实际上已经执行。

LDR、LDM、STR和STM指令在增加的地址空间访问一连串的字,每次装载或保存,存储器地址都会加4。如果计算溢出了地址空间的顶端,结果是不可预测的。换句话说,程序在使用这些指令时不应使其溢出。2.9.2 存储器格式

地址空间的规则要求字地址A:

❑ 位于地址A的字包含的字节位于地址A,A+l,A+2和A+3;

❑ 位于地址A的半字包含的字节位于地址A和A+l;

❑ 位于地址A+2的半字包含的字节位于地址A+2和A+3;

❑ 位于地址A的字包含的半字位于地址A和A+2。

但是这样并不能完全定义字、半字和字节之间的映射。存储器系统使用下列两种映射机制中的一种。

1.小端(Little-endian)存储器系统

在小端格式中,一个字当中最低地址的字节被看作是最低位字节,最高地址字节被看作是最高位字节。因此,存储器系统字节0连接到数据线0~7。

2.大端(Big-endian)存储器系统

在大端格式中,ARM7TDMI处理器将最高位字节保存在最低地址字节,最低位字节保存在最高地址字节。因此,存储器系统字节0连接到数据线24~31。

一个具体基于ARM的芯片可能只支持小端存储器系统,也可能只支持大端存储器系统,还可能两者都支持。

ARM指令集不包含任何直接选择大小端的指令。但是一个同时支持大小端的基于ARM的芯片可以在硬件上配置(一般使用芯片的引脚来配置),以匹配存储器系统所使用的规则。如果芯片有一个标准系统控制协处理器,系统控制协处理器中寄存器1的bit7可用于改变配置输入。

如果一个基于ARM的芯片将存储器系统配置为其中一种存储器格式(如小端格式),而实际连接的存储器系统配置为相反的格式(如大端格式),那么只有以字为单位的指令取指、数据装载和数据保存能够可靠实现,其他的存储器访问将出现不可预期的结果。

当标准系统控制协处理器连接到支持大小端格式的ARM处理器时,协处理器寄存器的bit7在复位时清零。这表示ARM处理器在复位后立即配置为小端存储器系统。如果它连接到一个大端存储器系统,复位处理程序所要尽早做的事情之一就是切换到大端存储器系统,并必须在任何可能的字节或半字数据访问发生或Thumb指令执行之前执行。存储器格式的规则意味着字的装载和保存并不受配置的大小端影响。因此不可能通过保存一个字改变存储器格式,然后重装已保存的字使该字当中字节的顺序翻转。改变ARM处理器配置的存储器格式使其不同于连接的存储器系统并没有什么用处,因为这样做的结果并不会产生一个额外的结构定义操作。因此,通常只在复位时改变存储器格式的配置使其匹配存储器系统的存储器格式。2.9.3 未对齐的存储器访问

ARM结构通常期望所有的存储器访问都合理的对齐。具体来说,就是字访问的地址通常是字对齐,而半字访问使用的地址是半字对齐。不按这种方式对齐的存储器访问称为非对齐的存储器访问。

1.非对齐的指令取指

如果在ARM状态下将一个非字对齐的地址写入R15,结果通常不可预测。如果在Thumb状态下将一个非半字对齐的地址写入R15,地址位bit0通常被忽略。结果在ARM状态下有效代码从R15读出值的bit[l:0]为0,而在Thumb状态下读出的R15值的bit0为0。当规定忽略这些位时,ARM实现不要求在指令取指时将这些位清零。可以将写入R15的值不加改变地发送到存储器,并在ARM或Thumb指令取指时,请求系统忽略地址位bit[l:0]或bit0。

2.非对齐的数据访问

产生非对齐访问的装载/保存指令会出现下列定义的动作之一:

❑ 不可预测。

❑ 忽略造成访问不对齐的低地址位。这意味着在半字访问时使用公式“地址 AND 0xFFFFFFFE”,而在字访问时使用公式“地址 AND 0xFFFFFFFC”。

❑ 对存储器访问本身忽略造成访问不对齐的低地址位,然后使用这些低地址位控制装载数据的循环。

这三个选项中的哪一个适用于装载/保存指令取决于具体的指令。

在将地址发送到存储器时,ARM实现不要求将造成不对齐的低地址位清零。可以将装载/保存指令计算出的地址不加改变地发送到存储器,并在半字访问或字访问时请求存储器系统忽略地址位bit0或bit[l:0]。2.9.4 指令的预取和自修改代码

许多ARM实现在前一条指令的执行尚未完成时将指令从存储器中取出。这个动作称为指令的预取。指令的预取并不是实际执行指令,指令后来没有被执行有两种典型的情况:

❑ 当发生异常时,当前指令执行完毕,所有预取的指令都被丢弃,指令的执行从异常向量开始。

❑ 当发生跳转时,预取在分支指令后的指令将被丢弃。

ARM实现可以自由选择预取指令比当前执行点提前多少,甚至可以动态改变预取指令的数目。最初的ARM实现在当前执行的指令之前预取两条指令,但现在可选择多于或少于两条指令。当指令读取PC时,它得到的指令地址比它自身地址落后了两条指令:

❑ 对于ARM指令,得到的地址是它自身的地址+8。

❑ 对于Thumb指令,得到的地址是它自身的地址+4。

最初的ARM实现曾经在PC读取的两指令偏移量和两指令预取之间存在关联,但这一关联不是结构上的。一个预取不同数目指令的ARM实现仍能保证读取PC所得到的地址比它自身地址落后两条指令。

和自由选择多少条预取指令一样,ARM实现可选择沿着哪条可能的执行路径进行预取。例如,在一条分支指令之后,它可选择预取分支指令之后的指令或者是转移目标地址的指令,这称为转移预测。

所有形式的指令预取都有一个潜在的问题,即存储器中的指令可能在它被预取之后和被执行之前发生改变。如果发生这种情况,对存储器中的指令进行修改通常并不妨碍已取指的指令备份执行完毕。

例如,在下面的代码序列中,STR指令使用ADD指令的备份取代了它后面的SUB指令:

但是当代码第一次被执行时,STR指令之后执行的指令通常是SUB指令,因为SUB指令在存储器中的指令发生改变之前已经被预取了。ADD指令不会被执行,除非第二次执行该代码序列。实际上,处理器不能保证按照上面所述的方式执行,因为第一次执行时,在STR指令之后有可能立即产生一个中断,如果这样,已经预取的SUB指令将被丢弃。当中断处理程序返回时,位于NextInstr处的指令被再次预取,而这次则执行ADD指令。因此,虽然SUB指令通常最有可能被执行,但也有可能执行ADD指令。

如果指令被再次执行,ARM处理器或存储器系统允许保持预取指令的备份并使用这些备份而不是重新预取。如果发生这种情况,在代码序列第二次及以后执行时,SUB指令可能被执行。

发生这种情况的主要原因是存储器系统包含独立的指令和数据缓存。但是也存在其他可能性。应当尽可能避免使用涉及自修改代码的编程技术。

1.指令存储器屏障

在许多系统中,几乎不可能完全避免自修改代码的使用。例如,任何一个允许将程序装入存储器然后执行的系统都使用自修改代码。

因此,每个ARM实现(可以理解为具体芯片)都定义了一系列的操作使自修改代码序列可以可靠地执行。这一串代码称为指令存储器屏障(IMB),它通常同时取决于ARM处理器和存储器系统的实现(可以理解为具体的芯片)。

IMB序列必须在新的指令已经保存到存储器之后而尚未执行时执行。例如,在程序被装载之后并且在转移到它的入口之前。任何不以这种方式使用IMB的自修改代码序列都可能会执行不确定的动作。

根据IMB所执行的确定操作顺序取决于ARM和存储器系统的实现(可以理解为具体的芯片)。建议在软件设计时使IMB序列作为一个调用程序来替换与系统相关的模块,而不是直接插入到需要的地方,这样易于移植到其他ARM处理器和存储器系统。

另外在许多实现当中,IMB序列包含了只能在特权模式下使用的操作,例如标准系统控制协处理器提供的缓存清零和无效操作。为了允许用户模式程序使用IMB序列,推荐将其作为一个操作系统调用程序,由SWI指令调用。

在SWI指令使用24位立即数的系统中指定所要求的系统服务,推荐通过下面的指令来请求IMB序列。

这是一个无参调用,不返回结果,应当使用与带原型的C函数调用相同的调用约定:区别在于使用SWI指令调用而不是BL指令。有些实现可对已保存的新指令使用地址范围的指示来减少IMB执行的时间。因此,还推荐执行第二个操作系统调用程序,该调用程序只根据指定的地址范围执行IMB。在SWI指令使用24位立即数的系统中指定所要求的系统服务,推荐通过下面的指令来请求:

应当使用与带原型的C函数调用相似的调用约定:

此处,地址范围从start_addr(包含)到end_addr(不包含)。

注意:(1)当使用标准的ARM过程调用标准时,start_addr在R0中传递,而end_addr则在Rl中传递。(2)对于某些ARM实现来说,即使使用小地址范围,IMB执行的时间也可能非常长(数千个时钟周期)。对于自修改代码的小规模使用,这样很可能使性能上受到较大损失。因此建议自修改代码只用于不可避免或有足够的执行时间裕量的情况。

2.IMB的其他用途

有些存储器系统允许虚拟一物理的地址映射,其中物理存储器位置对应于ARM处理器产生的地址,它可以被改变。如果该地址映射在指令预取之后,执行之前被更改,指令的地址会受到地址映射更改的影响,那么将执行错误的指令。

这与在指令被预取但尚未执行时在指令地址发生保存的情况非常类似。在这两种情况下,由于有一个值保存到该地址或者该地址关联到一个不同的物理存储器位置,保存在存储器地址的指令被改变。当虚拟一物理地址映射发生改变时,可以使用相同的解决办法。IMB序列必须在虚拟一物理地址映射改变之后,且在指令执行之前执行。

另一种相似的情况是在指令预取和指令执行之间这段时间内,发生存储器访问许可的变更。如果在指令预取时不允许访问,而在指令执行时允许访问,可能会发生不期望的预取中止异常。相反,即指令预取时允许访问,而在指令执行时禁止访问,系统中可能存在安全漏洞。

存储器访问许可的改变通常是因为将新的访问许可设定写入存储器或是因为存储器系统适于用户模式、特权模式以及发生的下列情况支持不同的访问许可:

❑ 在用户模式下产生一次异常,导致处理器切换到特权模式。

❑ 特权代码将模式切换到用户模式。

所有ARM的实现都确保了下列事件不会导致在错误访问许可下预取之后指令的执行:

❑ 在用户模式下产生一次异常。

❑ 当异常返回时使特权模式切换到用户模式的指令执行。这些指令有一个副作用,就是将当前模式的SPSR内容复制到CPSR,它们是目标寄存器为R15的数据处理指令ADCS,ADDS,ANDS,BICS,EORS,MOVS,MVNS,ORRS,RSBS,RSCS,SBCS和SUBS。

其余的情况则不能保证在错误的访问许可下预取之后指令不会被执行。这些情况是:

❑ 向存储器系统明确地写入新的访问许可设定。

❑ 通过MSR指令从特权模式切换到用户模式。

在这些情况下,访问许可发生改变后需要立即执行IMB序列,并且在访问许可改变之后,指令存储器屏障被执行之前没有执行任何指令。

但是在这些情况下通常可以避免整个IMB的开销。特别地,与任何特定地址相关联的指令字并未改变,因此通常可以避免清空缓存,一个实现可以定义受限版的IMB序列在这些情况下使用。2.9.5 存储器映射的I/O

执行ARM系统I/O功能的标准方法是使用存储器映射的I/O。装载和保存I/O值时,使用提供给I/O功能的特殊存储器地址。通常,从存储器映射的I/O地址装载用于输入,而保存到存储器映射的I/O地址则用于输出。装载和保存都可用于执行控制功能,用于取代它们正常的输入或输出功能。

存储器映射的I/O位置的动作通常不同于正常存储器位置的动作。例如,正常存储器位置的两次连续装载每次都会返回相同的值,除非中间插入了保存的操作。对于存储器映射的I/O位置,第二次装载返回的值可以不同于第一次返回的值,因为第一次装载的副作用。

这些区别主要影响高速缓存的使用和存储器系统的写缓冲区,具体信息请参考相关资料。一般来说,存储器映射的I/O位置通常标识为无高速缓存和无缓冲区,以避免对它们进行访问的次数、类型、顺序或时序发生改变。

1.从存储器映射的I/O取指

不同ARM的实现(可以理解为不同的芯片)在存储器指令取指时会有相当大的区别。因此建议存储器映射的I/O位置只用于数据的装载和保存,不用于指令取指。任何依赖于映射I/O位置取指的系统设计都可能难以移植到将来的ARM实现。

2.对存储器映射I/O的数据访问

一个指令序列在执行时,会在不同的点访问数据存储器,产生装载和保存访问的时序。如果这些装载和保存访问的是正常存储器位置,那么在它们访问相同的存储器位置时,只执行交互操作。结果,对不同存储器位置的保存和装载可以按照不同于指令的顺序执行,但会改变最终的结果。这种改变存储器访问顺序的自由可被存储器系统用来提高性能。

对同一存储器位置的访问还拥有其他可用于提升性能的特性,其中包括:

❑ 从相同的位置连续加载(没有插入存储)产生相同的结果。

❑ 从一个位置执行加载操作,将返回最后保存到该位置的值。

❑ 对某个数据规格的多次访问有时可合并成单个更大规模的访问。例如,分别存储一个字所包含的两个半字可合并成单个字的存储。

但如果存储器字、半字或字节访问的对象是存储器映射的I/O位置。一次访问会产生副作用,使后续访问改变成一个不同的地址。如果是这样,那么不同时间顺序的访问将会使代码产生不同的最终结果。因此访问存储器映射的I/O位置时不能进行优化,它们的时间顺

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载