第2章 ARM体系结构
2.1 ARM体系结构简介 ARM(Advanced RISC Machines)公司1991年成立于英国剑桥,是专门从事基于RISC技术芯片设计开发的公司,主要出售芯片设计技术的授权,作为知识产权供应商,本身不直接从事芯片生产,靠转让设计许可由合作公司生产各具特色的芯片,半导体生产商从ARM公司购买其设计的ARM微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的ARM微处理器芯片进入市场。目前,全世界有几十家大的半导体公司都使用ARM公司的授权,使得ARM技术获得了更多的第三方工具、制造、软件的支持,又使整个系统成本降低,使产品更容易进入市场,更具有竞争力。目前,ARM微处理器几乎已经深入到工业控制、无线通讯、网络应用、消费类电子产品、成像和安全产品各个领域 采用RISC架构的ARM微处理器一般具有如下特点: ● 支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件。Thumb指令集比通常的8位和16位CISC/RISC处理
器具有更好的代码密度; ● 指令执行采用3级流水线/5级流水线技术; ● 带有指令Cache和数据Cache,大量使用寄存器,指令执行速度更快。大多数数据操作都在寄存器中完成。寻址方式灵活简单,执行效率高。指令长度固定(在ARM状态下是32位,在Thumb状态下是16位); ● 支持大端格式和小端格式两种方法存储字数据; ● 支持Byte(字节,8位)、Halfword(半字,16位)和Word(字,32位)三种数据类型。 ● 支持用户、快中断、中断、管理、中止、系统和未定义等7种处理器模式,除了用户模式外,其余的均为特权模式; ● 处理器芯片上都嵌入了在线仿真ICE-RT逻辑,便于通过JTAG来仿真调试ARM体系结构芯片,可以避免使用昂贵的在线仿真器。另外,在处理器核中还可以嵌入跟踪宏单元ETM,用于监控内部总线,实时跟踪指令和数据的执行; 具有片上总线AMBA(Advanced Micro-controller Bus Architecture)。
AMBA定义了3组总线:先进高性能总线AHB(Advanced High performance Bus);先进系统总线ASB(Advanced System Bus);先进外围总线APB(Advanced Peripheral Bus)。通过AMBA可以方便地扩充各种处理器及I/O,可以把DSP、其他处理器和I/O(如UART、定时器和接口等)都集成在一块芯片中; ● 采用存储器映像I/O的方式,即把I/O端口地址作为特殊的存储器地址; ● 具有协处理器接口。ARM允许接16个协处理器,如CP15用于系统控制,CP14用于调试控制器; ● 采用了降低电源电压,可工作在3.0V以下;减少门的翻转次数,当某个功能电路不需要时禁止门翻转;减少门的数目,即降低芯片的集成度;降低时钟频率等一些措施降低功耗; ● 体积小、低成本、高性能。 ARM微处理器包括ARM7、ARM9、ARM9E、ARM10E、SecurCore、以及Intel的StrongARM、XScale和其它厂商基于ARM体系结构的
处理器,除了具有ARM体系结构的共同特点以外,每一个系列的ARM微处理器都有各自的特点和应用领域。 一个典型的ARM体系结构方框图如图2.1.1所示,包含有32位ALU、31个32位通用寄存器及6位状态寄存器、32×8位乘法器32×32位桶形移位寄存器、指令译码及控制逻辑、指令流水线和数据/地址寄存器等。
图2.1.1 ARM体系结构方框图
1.ALU ARM体系结构的ALU与常用的ALU逻辑结构基本相同,由两个操作数锁存器、加法器、逻辑功能、结果及零检测逻辑构成。ALU的最小数据通路周期包含寄存器读时间、移位器延迟、ALU延迟、寄存器写建立时间、双相时钟间非重叠时间等几部分。 2.桶形移位寄存器 ARM采用了32×32位桶形移位寄存器,左移/右移n位、环移n位和算术右移n位等都可以一次完成,可以有效的减少移位的延迟时间。在桶形移位寄存器中,所有的输入端通过交叉开关(Crossbar)与所有的输出端相连。交叉开关采用NMOS晶体管来实现。 3.高速乘法器 ARM为了提高运算速度,采用两位乘法的方法,2位乘法可根据乘数的2位来实现“加-移位”运算。ARM的高速乘法器采用32×8位的结构,完成32×2位乘法也只需5个时钟周期。
4.浮点部件 在ARM体系结构中,浮点部件作为选件可根据需要选用,FPA10浮点加速器以协处理器方式与ARM相连,并通过协处理器指令的解释来执行。 浮点的Load/Store指令使用频度要达到67%,故FPA10内部也采用Load/Store结构,有8个80位浮点寄存器组,指令执行也采用流水线结构。 5.控制器 ARM的控制器采用硬接线的可编程逻辑阵列PLA,其输入端有14根、输出端有40根,分散控制Load/Store多路、乘法器、协处理器以及地址、寄存器ALU和移位器。 6.寄存器 ARM内含37个寄存器,包括31个通用32位寄存器和6个状态寄存器。
2.2 ARM微处理器结构 2.2.1 ARM7微处理器 ARM7系列微处理器包括ARM7TDMI、ARM7TDMI-S、ARM720T、ARM7EJ几种类型。其中,ARM7TMDI是目前使用最广泛的32位嵌入式RISC处理器,主频最高可达130MIPS,采用能够提供0.9MIPS/MHz的三级流水线结构,内嵌硬件乘法器(Multiplier),支持16为压缩指令集Thumb,嵌入式ICE,支持片上Debug,支持片上断点和调试点。指令系统与ARM9系列、ARM9E系列和ARM10E系列兼容,支持Windows CE、Linux、Palm OS等操作系统。典型产品如Samsung公司的S3C4510B。 1.ARM7TDMI处理器内核 ARM7TDMI处理器的内核如图2.2.1所示。
图2.2.1 ARM7TDMI内核结构
ARM7TDMI还提供了存储器接口、MMU接口、协处理器接口和调试接口,以及时钟与总线等控制信号,如图2.2.2所示。 存储器接口包括了32位地址A[31:0]、双向32位数据总线D[31:0]、单向32位数据总线DIN[31:0]与DOUT[31:0]、以及存储器访问请求MREQ、地址顺序SEQ、存储器访问控制MAS[1:0和数据锁存控制BL[3:0]等控制信号。 ARM7TDMI处理器内核也可以ARM7TDMI-S软核(Softcore)形式向用户提供。同时,提供多种组合选择,例如可以省去嵌入式ICE单元等。
图2.2.2 ARM7TDMI的接口
2.ARM720T/ARM740T处理器内核 ARM720T处理器内核是在ARM7TDMI处理器内核基础上,增加8KB的数据与指令Cache,支持段式和页式存储的MMU(Memory Management Unit)、写缓冲器及AMBA(Advanced Microcontroller Bus Architecture)接口而构成,如图2.2.3所示。 ARM740T处理器内核与ARM720T处理器内核相比,结构基本相同,ARM740T处理器核没有存储器管理单元MMU,不支持虚拟存储器寻址,而是用存储器保护单元来提供基本保护和Cache的控制。合适低价格低功耗的嵌入式应用。
图2.2.3 ARM720T内核结构
2.2.2 ARM9微处理器 ARM9系列微处理器包含ARM920T、ARM922T和ARM940T几种类型,可以在高性能和低功耗特性方面提供最佳的性能。采用5级整数流水线,指令执行效率更高。提供1.1MIPS/MHz的哈佛结构。支持数据Cache和指令Cache,具有更高的指令和数据处理能力。 支持32位ARM指令集和16位Thumb指令集。支持32位的高速AMBA总线接口。全性能的MMU,支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统。MPU支持实时操作系统。 ARM920T处理器核在ARM9TDMI处理器内核基础上,增加了分离式的指令Cache和数据Cache,并带有相应的存储器管理单元I-MMU和D-MMU、写缓冲器及AMBA接口等,如图2.2.4所示。
图2.2.4 ARM920T内核结构
ARM940T处理器核采用了ARM9TDMI处理器内核,是ARM920T处理器核的简化版本,没有存储器管理单元MMU,不支持虚拟存储器寻址,而是用存储器保护单元来提供存储保护和Cache控制。 ARM9系列微处理器主要应用于无线通信设备、仪器仪表、安全系统、机顶盒、高端打印机、数字照相机和数字摄像机等。典型产品如Samsung公司的S3C2410A。
2.2.3 ARM9E微处理器 ARM9E系列微处理器包含ARM926EJ-S、ARM946E-S和ARM966E-S几种类型,使用单一的处理器内核提供了微控制器、DSP、Java应用系统的解决方案。ARM9E系列微处理器提供了增强的DSP处理能力,很适合于那些需要同时使用DSP和微控制器的应用场合。 ARM9E系列微处理器支持DSP指令集,适合于需要高速数字信号处理的场合。ARM9E系列微处理器采用5级整数流水线,支持32位ARM指令集和16位Thumb指令集,支持32位的高速AMBA总线接口,支持VFP9浮点处理协处理器,MMU支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统,MPU支持实时操作系统,支持数据Cache和指令Cache,主频最高可达300MIPS。 ARM9系列微处理器主要应用于下一代无线设备、数字消费品、成像设备、工业控制、存储设备和网络设备等领域。
2.2.4 ARM10E微处理器 ARM10E系列微处理器包含ARM1020E、ARM1022E和ARM1026EJ-S几种类型,由于采用了新的体系结构,与同等的ARM9器件相比较,在同样的时钟频率下,性能提高了近50%。同时采用了两种先进的节能方式,使其功耗极低。 ARM10E系列微处理器支持DSP指令集,适合于需要高速数字信号处理的场合。 采用6级整数流水线,支持32位ARM指令集和16位Thumb指令集,支持32位的高速AMBA总线接口,支持VFP10浮点处理协处理器,MMU支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统,支持数据Cache和指令Cache,内嵌并行读/写操作部件,主频最高可达400MIPS。 ARM10E系列微处理器主要应用于下一代无线设备、数字消费品、成像设备、工业控制、通信和信息系统等领域。
2.2.5 SecurCore微处理器 SecurCore系列微处理器包含SecurCore SC100、SecurCore SC110、SecurCore SC200和SecurCore SC210几种类型,提供了完善的32位RISC技术的安全解决方案。 SecurCore系列微处理器除了具有ARM体系结构各种主要特点外,在系统安全方面: 带有灵活的保护单元,以确保操作系统和应用数据的安全;采用软内核技术,防止外部对其进行扫描探测;可集成用户自己的安全特性和其他协处理器。 SecurCore系列微处理器主要应用于如电子商务、电子政务、电子银行业务、网络和认证系统等一些对安全性要求较高的应用产品及应用系统。
2.2.6 StrongARM微处理器 Intel StrongARM处理器是采用ARM体系结构高度集成的32位RISC微处理器,采用在软件上兼容ARMv4体系结构、同时采用具有Intel技术优点的体系结构。典型产品如SA110 处理器、SA1100、SA1110PDA系统芯片和SA1500多媒体处理器芯片等。例如其中的Intel StrongARM SA-1110 微处理器是一款集成了32位StrongARM RISC处理器核、系统支持逻辑、多通信通道、LCD控制器、存储器和PCMCIA控制器以及通用I/O口的高集成度通信控制器。该处理器最高可在206 MHz下运行。SA-1110有一个大的指令Cache 和数据Cache、内存管理单元(MMU)和读/写缓存。存储器总线可以和包括SDRAM、SMROM 和类似SRAM的许多器件相接。软件与ARM V4结构处理器家族相兼容。 Intel StrongARM处理器是便携式通讯产品和消费类电子产品的理想选择。
2.2.7 XScale微处理器 Intel XScale微体系结构提供了一种全新的、高性价比、低功耗且基于ARMv5TE体系结构的解决方案,支持16位Thumb指令和DSP扩充。基于XScale技术开发的微处理器,可用于手机、便携式终端(PDA)、网络存储设备、骨干网(BackBone)路由器等。 Intel XScale处理器的处理速度是Intel StrongARM处理速度的两倍,数据Cache的容量从8KB增加到32KB,指令Cache的容量从16KB增加到32KB,微小数据Cache的容量从512B增加到2KB;为了提高指令的执行速度,超级流水线结构由5级增至7级;新增乘/加法器MAC和特定的DSP型协处理器,以提高对多媒体技术的支持;动态电源管理,使XScale处理器的时钟可达1GHz、功耗1.6W,并能达到1200MIPS。 XScale微处理器架构经过专门设计,核心采用了英特尔先进的0.18μm工艺技术制造;具备低功耗特性,适用范围从0.1mW~1.6W。同时,它的时钟工作频率将接近1GHz。XScale与
StrongARM相比,可大幅降低工作电压并且获得更高的性能。具体来讲,在目前的StrongARM中,在1 StrongARM相比,可大幅降低工作电压并且获得更高的性能。具体来讲,在目前的StrongARM中,在1.55V下可以获得133MHz的工作频率,在2.0V下可以获得206MHz的工作频率;而采用XScale后,在0.75V时工作频率达到150MHz,在1.0V时工作频率可以达到400MHz,在1.65V下工作频率则可高达800MHz。超低功率与高性能的组合使Intel XScale适用于广泛的互联网接入设备,在因特网的各个环节中,从手持互联网设备到互联网基础设施产品,Intel XScale都表现出了令人满意的处理性能。 Intel采用XScale架构的嵌入式处理器典型产品有PXA25x、PXA26x和PXA27x系列。
2.3 ARM微处理器的寄存器结构 2.3.1 处理器运行模式 ARM微处理器支持7种运行模式,分别为: ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄器包括: ● 31个通用寄存器,包括程序计数器(PC指针),均为32位的寄存器。 ● 6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位,目前只使用了其中的一部分。 2.3.1 处理器运行模式 ARM微处理器支持7种运行模式,分别为: ● usr(用户模式):ARM处理器正常程序执行模式。 ● fiq(快速中断模式):用于高速数据传输或通道处理 ● irq(外部中断模式):用于通用的中断处理 ● svc(管理模式):操作系统使用的保护模式
abt (数据访问终止模式): 当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。 ● sys(系统模式): 运行具有特权的操作系统任务。 ● und(未定义指令中止模式):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。 ARM微处理器的运行模式可以通过软件改变,也可以通过外部中断或异常处理改变。 大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的。 除用户模式以外,其余的所有6种模式称之为非用户模式,或特权模式(Privileged Modes);其中除去用户模式和系统模式以外的5种又称为异常模式(Exception Modes),常用于处理中断或异常,以及需要访问受保护的系统资源等情况。
ARM处理器在每一种处理器模式下均有一组相应的寄存器与之对应。即在任意一种处理器模式下,可访问的寄存器包括15个通用寄存器(R0~R14)、一至二个状态寄存器和程序计数器。在所有的寄存器中,有些是在7种处理器模式下共用的同一个物理寄存器,而有些寄存器则是在不同的处理器模式下有不同的物理寄存器。 2.3.2 处理器工作状态 ARM处理器有32位ARM和16位Thumb两种工作状态。在32位ARM状态下执行字对齐的ARM指令,在16位Thumb状态下执行半字对齐的Thumb指令。 在Thumb状态下,程序计数器PC(Program Counter)使用位[1]选择另一个半字。 ARM处理器在两种工作状态之间可以切换,切换不影响处理器的模式或寄存器的内容。
(1)当操作数寄存器的状态位(位[0])为1时,执行BX指令进入Thumb状态。如果处理器在Thumb状态进入异常,则当异常处理(IRQ、FIQ、Undef、Abort和SWI)返回时,自动转换到Thumb状态。 (2)当操作数寄存器的状态位(位[0])为0时,执行BX指令进入ARM状态,处理器进行异常处理(IRQ、FIQ、Reset、Undef、Abort和SWI)。在此情况下,把PC放入异常模式链接寄存器中。从异常向量地址开始执行也可以进入ARM状态。
2.3.3 ARM处理器的寄存器组织 ARM处理器的37个寄存器被安排成部分重叠的组,不能在任何模式都可以使用,寄存器的使用与处理器状态和工作模式有关。如图2.3.1所示,每种处理器模式使用不同的寄存器组。其中15个通用寄存器(R0~R14)、1或2个状态寄存器和程序计数器是通用的。 1.通用寄存器 通用寄存器(R0~R15)可分成不分组寄存器R0~R7、分组寄存器R8~R14和程序计数器R15 三类。 (1)不分组寄存器R0~R7 不分组寄存器R0~R7是真正的通用寄存器,可以工作在所有的处理器模式下,没有隐含的特殊用途。 (2)分组寄存器R8~R14 分组寄存器R8~R14取决于当前的处理器模式,每种模式有专用的分组寄存器用于快速异常处理。
寄存器R8~Rl2可分为两组物理寄存器。一组用于FIQ模式,另一组国用于除FIQ以外的其他模式。第1组访问R8_fiq~R12_fiq,允许快速中断处理。第二组访问R8_usr~R12_usr,寄存器R8~R12没有任何指定的特殊用途。
寄存器R14用作子程序链接寄存器,也称为链接寄存器LK (Link Register)。当执行带链接分支(BL)指令时,得到R15的备份。 表明用户或系统模式使用的一般寄存器己被异常模式特定的另一寄存器所替代。 图2.3.1 寄存器组织结构图 寄存器R13~R14可分为6个分组的物理寄存器。1个用于用户模式和系统模式,而其他5个分别用于svc、abt、und、irq和fiq五种异常模式。访问时需要指定它们的模式,如:R13_<mode>,R14_<mode>;其中:<mode>可以从usr、svc、abt、und、irq和fiq六种模式中选取一个。 寄存器R13通常用作堆栈指针,称作SP。每种异常模式都有自己的分组R13。通常R13应当被初始化成指向异常模式分配的堆栈。在入口处,异常处理程序将用到的其他寄存器的值保存到堆栈中;返回时,重新将这些值加载到寄存器。这种异常处理方法保证了异常出现后不会导致执行程序的状态不可靠。 寄存器R14用作子程序链接寄存器,也称为链接寄存器LK (Link Register)。当执行带链接分支(BL)指令时,得到R15的备份。 在其他情况下,将R14当做通用寄存器。类似地,当中断或异常
出现时,或当中断或异常程序执行BL指令时,相应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15的返回值。 FIQ模式有7个分组的寄存器R8~R14,映射为R8_fiq~R14_fiq。在ARM状态下,许多FIQ处理没必要保存任何寄存器。User、IRQ、Supervisor、Abort和Undefined模式每一种都包含两个分组的寄存器R13和R14的映射,允许每种模式都有自己的堆栈和链接寄存器。 (3)程序计数器R15 寄存器R15用作程序计数器(PC)。在ARM状态,位[1:0]为0,位[31:2]保存PC。 在Thumb状态,位[0]为0,位[31:1]保存PC。R15虽然也可用作通用寄存器,但一般不这么使用,因为对R15的使用有一些特殊的限制,当违反了这些限制时,程序的执行结果是未知的。 ① 读程序计数器。指令读出的R15的值是指令地址加上8字节。由于ARM指令始终是字对齐的,所以读出结果值的位[1:0]总是
0(在Thumb状态下,情况有所变化)。读PC主要用于快速地对临近的指令和数据进行位置无关寻址,包括程序中的位置无关转移。 ② 写程序计数器。写R15的通常结果是将写到R15中的值作为指令地址,并以此地址发生转移。由于ARM指令要求字对齐,通常希望写到R15中值的位[1:0]=0b00。 由于ARM体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节。 2.程序状态寄存器 寄存器R16用作程序状态寄存器CPSR(Current Program Status Register,当前程序状态寄存器)。在所有处理器模式下都可以访问CPSR。CPSR包含条件码标志、中断禁止位、当前处理器模式以及其他状态和控制信息。每种异常模式都有一个程序状态保存寄存器SPSR(Saved Program Status Register)。当异常出现
SPSR用于保留CPSR的状态。 CPSR和SPSR的格式如下: (1)条件码标志 N、Z、C、V(Negative、Zero、Carry、oVerflow)均为条件码标志位(Condition Code Flags),它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。CPSR中的条件码标志可由大多数指令检测以决定指令是否执行。在ARM状态下,绝大多数的指令都是有条件执行的。在Thumb状态下,仅有分支指令是有条件执行的。 通常条件码标志通过执行比较指令(CMN、CMP、TEQ、TST)、一些算术运算、逻辑运算和传送指令进行修改。 条件码标志的通常含义如下: ● N:如果结果是带符号二进制补码,那么,若结果为负数,则N=1;若结果为正数或0,则N=0。 ● Z:若指令的结果为0,则置1(通常表示比较的结果为“相等”),否则置0。 C:可用如下4种方法之一设置:
一-加法(包括比较指令CMN)。若加法产生进位(即无符号溢出),则C置1;否则置0。 一-减法(包括比较指令CMP)。若减法产生借位(即无符号溢出),则C置0;否则置1。 一-对于结合移位操作的非加法/减法指令,C置为移出值的最后1位。 一-对于其他非加法/减法指令,C通常不改变。 ● V:可用如下两种方法设置,即 一-对于加法或减法指令,当发生带符号溢出时,V置1,认为操作数和结果是补码形式的带符号整数。 一-对于非加法/减法指令,V通常不改变。 (3)控制位 程序状态寄存器PSR(Program Status Register)的最低8位I、F、T和M[4:0]用作控制位。当异常出现时改变控制位。处理器在特
权模式下时也可由软件改变。 a.中断禁止位 I:置1,则禁止IRQ中断; F:置1,则禁止FIQ中断。 b.T位 T=0 指示ARM执行; T=1 指示Thumb执行。 c.模式控制位 M4、M3、M2、Ml和M0(M[4:0])是模式位,决定处理器的工作模式,如表2.3.1所列。
PC,R7~R0,CPSR, SPSR_fiq,R14_fiq~R8_fiq 表2.3.1 M[4:0]模式控制位 M[4:0] 处理器工作模式 可访问的寄存器 10000 用户模式 PC,CPSR,R14~R0 10001 FIQ模式 PC,R7~R0,CPSR, SPSR_fiq,R14_fiq~R8_fiq 10010 IRQ模式 PC,R12~R0,CPSR, SPSR_irq,R14_irq,R13_irq 10011 管理模式 PC,R12~R0, CPSR, SPSR_svc,R14_svc,R13_svc 10111 中止模式 PC,R12~R0, CPSR, SPSR_abt,R14_abt,R13_abt 11011 未定义模式 PC,R12~R0, CPSR, SPSR_und,R14_und,R13_und 11111 系统模式 PC,R14~R0,CPSR(ARM v4及以上版本)
并非所有的模式位组合都能定义一种有效的处理器模式。其他组合的结果不可预知。 (4)其他位 程序状态寄存器的其他位保留,用做以后的扩展。 2.3.4 Thumb状态的寄存器集 Thumb状态下的寄存器集如图2.3.2所示,是ARM状态下的寄存器集的子集。程序员可以直接访问8个通用寄存器(R0~R7)、PC、SP、LR和CPSR。每一种特权模式都有一组SP、LR和SPSR。 ● Thumb状态R0~R7与ARM状态R0~R7是一致的。 ● Thumb状态CPSR和SPSR与ARM的状态CPSR和SPSR是一致的。 ● Thumb状态SP映射到ARM状态R13。 ● Thumb状态LR映射到ARM状态R14。 ● Thumb状态PC映射到ARM状态PC(R15)。
图2.3.2 Thumb状态下寄存器组织
图2.3.3 Thumb状态与ARM状态的寄存器关系
在Thumb状态下,寄存器R8~R15(高寄存器)并不是标准寄存器集的一部分。汇编语言编程者访问它虽有限制,但可以将其用做快速暂存存储器,将R0~R7(Lo-registers,低寄存器)中的值传送到R8~R15(Hi-registers,高寄存器)。
2.4 ARM微处理器的异常处理 在一个正常的程序流程执行过程中,由内部或外部源产生的一个事件使正常的程序产生暂时的停止时,称之为异常。异常是由内部或外部源产生并引起处理器处理一个事件,例如一个外部的中断请求。在处理异常之前,当前处理器的状态必须保留,当异常处理完成之后,恢复保留的当前处理器状态,继续执行当前程序。多个异常同时发生时,处理器将会按固定的优先级进行处理。 ARM体系结构中的异常,与单片机的中断有相似之处,但异常与中断的概念并不完全等同,例如外部中断或试图执行未定义指令都会引起异常。 2.4.1 ARM体系结构的异常类型 ARM体系结构支持7种类型的异常,异常类型、异常处理模式和优先级如表2.4.1所示。异常出现后,强制从异常类型对应的固定存储器地址开始执行程序。这些固定的地址称为异常向量(Exception Vectors)。
表2.4.1 ARM体系结构的异常类型和异常处理模式 进入模式 地址(异常向量) 优先级 复位 管理模式 0x0000,0000 1(最高) 未定义指令 未定义模式 0x0000,0004 6(最低) 软件中断 0x0000,0008 指令预取中止 中止(预取指令) 中止模式 0x0000,000C 5 数据中止 中止(数据) 0x0000,0010 2 IRQ(外部中断请求) IRQ 0x0000,0018 4 FIQ(快速中断请求) FIQ 0x0000,001C 3
2.4.2 异常类型的含义 (1)复位 当处理器的复位电平有效时,产生复位异常,ARM处理器立刻停止执行当前指令。复位后,ARM处理器在禁止中断的管理模式下,程序跳转到复位异常处理程序处执行(从地址0x00000000或0xFFFF0000开始执行指令)。 (2)未定义指令异常 当ARM处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。当ARM处理器执行协处理器指令时,它必须等待任一外部协处理器应答后,才能真正执行这条指令。若协处理器没有响应,就会出现未定义指令异常。若试图执行未定义的指令,也会出现未定义指令异常。未定义指令异常可用于在没有物理协处理器(硬件)的系统上,对协处理器进行软件仿真,或在软件仿真时进行指令扩展。
(3)软件中断异常(SoftWare Interrupt,SWI) (4)指令预取中止 若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出存储器中止(Abort)信号,但当预取的指令被执行时,才会产生指令预取中止异常。 (5)数据中止(数据访问存储器中止) 若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。存储器系统发出存储器中止信号。响应数据访问(加载或存储)激活中止,标记数据为无效。在后面的任何指令或异常改变CPU状态之前,数据中止异常发生。 (6)外部中断请求(IRQ)异常 当处理器的外部中断请求引脚有效,且CPSR中的I位为0时,产生IRQ异常。系统的外设可通过该异常请求中断服务。IRQ异常的优先级比FIQ异常的低。当进入FIQ处理时,会屏蔽掉IRQ异常。
(7)快速中断请求(FIQ)异常 当处理器的快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常。FIQ支持数据传送和通道处理,并有足够的私有寄存器。 2.4.3 异常的响应过程 当一个异常出现以后,ARM微处理器会执行以下几步操作: ① 将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。若异常是从ARM状态进入,LR寄存器中保存的是下一条指令的地址(当前PC+4或PC+8,与异常的类型有关);若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量。 ② 将CPSR状态传送到相应的SPSR中。 ③ 根据异常类型,强制设置CPSR的运行模式位。 ④ 强制PC从相关的异常向量地址取下一条指令执行,跳转到相应的异常处理程序。还可以设置中断禁止位,以禁止中断发生。
如果异常发生时,处理器处于Thumb状态,则当异常向量地址加载入PC时,处理器自动切换到ARM状态。 ① 将连接寄存器LR的值减去相应的偏移量后送到PC中。 ② 将SPSR内容送回CPSR中。 ③ 若在进入异常处理时设置了中断禁止位,要在此清除。 可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。
2.4.4 应用程序中的异常处理 在应用程序的设计中,异常处理采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序。当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,从而跳转到异常处理程序,当异常处理完成以后,返回到主程序继续执行。
2.5 ARM的存储器结构 ARM体系结构允许使用现有的存储器和I/O器件进行各种各样的存储器系统设计。 1.地址空间 2.存储器格式 对于字对齐的地址A,地址空间规则要求如下: ● 地址位于A的字由地址为A、A+1、A+2和A+3的字节组成; ● 地址位于A的半字由地址为A和A+1的字节组成; ● 地址位于A+2的半字由地址为A+2和A+3的字节组成; ● 地址位于A的字由地址为A和A+2的半字组成。 ARM存储系统可以使用小端存储或者大端存储两种方法,大端存储和小端存储格式如图2.5.1所示。
ARM体系结构通常希望所有的存储器访问能适当地对齐。特别是用于字访问的地址通常应当字对齐,用于半字访问的地址通常应当半字对齐。未按这种方式对齐的存储器访问称作非对齐的存储器访问。 图2.5.1 大端存储和小端存储格式
若在ARM态执行期间,将没有字对齐的地址写到R15中,那么结果通常是不可预知或者地址的位[1:0]被忽略。若在Thumb态执行期间,将没有半字对齐的地址写到R15中,则地址的位[0]通常忽略。 ARM处理器有的带有指令Cache和数据Cache,但不带有片内RAM和片内ROM。系统所需的RAM和ROM(包括Flash)都通过总线外接。由于系统的地址范围较大(232=4GB),有的片内还带有存储器管理单元MMU(Memory Management Unit)。ARM架构处理器还允许外接PCMCIA。 4.存储器映射I/O ARM系统使用存储器映射I/O。I/O口使用特定的存储器地址,当从这些地址加载(用于输入)或向这些地址存储(用于输出)时,完成I/O功能。加载和存储也可用于执行控制功能,代替或者附加到正常的输入或输出功能。
然而,存储器映射I/O位置的行为通常不同于对一个正常存储器位置所期望的行为。例如,从一个正常存储器位置两次连续的加载,每次返回的值相同。而对于存储器映射I/O位置,第2次加载的返回值可以不同于第1次加载的返回值。
2.6 ARM微处理器指令系统 2.6.1 基本寻址方式 寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式,ARM处理器有9 种基本寻址方式。 1.寄存器寻址 操作数的值在寄存器中,指令中的地址码字段给出的是寄存器编号,寄存器的内容是操作数,指令执行时直接取出寄存器值操作。 例如指令: MOV R1,R2 ;R1←R2 SUB R0,R1,R2 ;R0←R1- R2 2.立即寻址 在立即寻址指令中数据就包含在指令当中,立即寻址指令的操作码字段后面的地址码部分就是操作数本身,取出指令也就取出了可以立即使用的操作数(也称为立即数)。立即数要以“#”为前缀,表示16进制数值时以“0x”表示。
例如指令: ADD R0,R0,#1 ;R0←R0 + 1 MOV R0,#0xff00 ;R0←0xff00 3.寄存器移位寻址 寄存器移位寻址是ARM指令集特有的寻址方式。第2个寄存器操作数在与第1个操作数结合之前,先进行移位操作。 MOV R0,R2,LSL #3 ;R2的值左移3位,结果放入R0,即R0=R2 * 8 ANDS R1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相与操作,结果放入R1 可采用的移位操作如下: LSL:逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补0。
LSR:逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补0。 ASR:算术右移(Arithmetic Shift Right),移位过程中保持符号位不变,即如果源操作数为正数,则字的高端空出的位补0,否则补1 ROR:循环右移(Rotate Right),由字的低端移出的位填入字的高端空出的位 RRX:带扩展的循环右移(Rotate Right extended by 1 place),操作数右移一位,高端空出的位用原C 标志值填充。 各移位操作过程如图2.6.1所示。
图2.6.1 移位操作过程
4.寄存器间接寻址 指令中的地址码给出的是一个通用寄存器编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针,操作数存放在存储器中。 例如指令 : LDR R0,[R1] ;R0←[R1](将R1中的数值作为地址,取出此地址中的数据保存在R0中) STR R0,[R1] ;[R1] ←R0 5.变址寻址 变址寻址是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,变址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄存器访问等。 例如指令: LDR R2,[R3,#4] ;R2←[R3 + 4](将R3中的数值加4作为地
址,取出此地址的数值保存在R2 中) STR R1,[R0,#-2] ;[R0-2] ← R1(将R0中的数值减2 作为地址,把R1中的内容保存到此地址位置) 6.多寄存器寻址 采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送,这种寻址方式用一条指令最多可以完成16个寄存器值的传送。 例如指令: LDMIA R0,{R1,R2,R3,R5} ;R1←[R0] ;R2←[R0 + 4] ;R3←[R3 + 8] ;R4←[R3 + 12] 7.堆栈寻址 堆栈是一种数据结构,堆栈是特定顺序进行存取的存储区,操作
顺序分为“后进先出”和“先进后出”,堆栈寻址时隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元就是堆栈的栈顶。存储器生长堆栈可分为两种: ● 向上生长:向高地址方向生长,称为递增堆栈(Ascending Stack)。 ● 向下生长:向低地址方向生长,称为递减堆栈(Decending Stack)。 堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈(Full Stack);堆栈指针指向下一个要放入的空位置,称为空堆栈(Empty Stack)。 这样就有四种类型的堆栈工作方式,ARM微处理器支持这四种类型的堆栈工作方式,即: ● 满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。如指令LDMFA,STMFA 等。 ● 满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。如指令LDMFD,STMFD 等。
● 空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。如指令LDMEA,STMEA 等。 ● 空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。如指令LDMED,STMED 等。 8.块复制寻址 块复制寻址用于把一块从存储器的某一位置复制到另一位置,是一个多寄存器传送指令。 例如指令: STMIA R0!,{R1-R7} ;将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,增长方向为向上增长。 STMDA R0!,{R1-R7} ;将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,增长方向为向下增长。
9.相对寻址 相对寻址是变址寻址的一种变通,由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。 例如指令: BL ROUTE1 ;调用到ROUTE1子程序 BEQ LOOP ;条件跳转到LOOP标号处 … LOOP MOV R2,#2 ROUTE1
2.6.2 ARM 指令集 1.指令格式 (1)基本格式 <opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>} 其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,而{<cond>}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。 opcode 指令助记符,如LDR,STR等 cond 执行条件,如EQ,NE等 S 是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响 Rd 目标寄存器 Rn 第一个操作数的寄存器
operand2 第二个操作数。在ARM指令中,灵活的使用第2个操作数能提高代码效率,第2个操作数的形式如0x3FC、0、0xF0000000、200,0xF0000001等。 指令格式举例如下: LDR R0,[R1] ;读取R1地址上的存储器单元内容,执行条件AL BEQ DATAEVEN ;跳转指令,执行条件EQ,即相等跳转到DATAEVEN ADDS R1,R1,#1 ;加法指令,R1+1=R1 影响CPSR寄存器,带有S SUBNES R1,R1,#0xD ;条件执行减法运算(NE),R1-0xD=>R1,影响CPSR寄存器,带有S (2)条件码 几乎所有的ARM指令都包含一个可选择的条件码,即{<cond>}。使用指令条件码,可实现高效的逻辑操作,提高代码效率。ARM条件码如表2.6.1所示。
操作码[31:28] 条件码助记符 标志 含义 0000 EQ Z=1 相等 0001 NE Z=0 不相等 0010 CS/HS C=1 表2.6.1 ARM条件码 操作码[31:28] 条件码助记符 标志 含义 0000 EQ Z=1 相等 0001 NE Z=0 不相等 0010 CS/HS C=1 无符号数大于或等于 0011 CC/LO C=0 无符号数小于 0100 MI N=1 负数 0101 PL N=0 正数或零 0110 VS V=1 溢出 0111 VC V=0 没有溢出
1000 HI C=1,Z=0 无符号数大于 1001 LS C=0,Z=1 无符号数小于或等于 1010 GE N=V 带符号数大于或等于 1011 LT N!=V 带符号数小于 1100 GT Z=0,N=V 带符号数大于 1101 LE Z=1,N!=V 带符号数小于或等于 1110 AL 任何 无条件执行(指令默认条件)
2.ARM 存储器访问指令 ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。ARM的加载/存储指令是可以实现字、半字、,无符/有符字节操作;批量加载/存储指令可实现一条指令加载/存储多个寄存器的内容;SWP指令是一条寄存器和存储器内容交换的指令,可用于信号量操作等。 ARM处理器是冯.诺依曼存储结构,程序空间、RAM空间及IO映射空间统一编址,除对对RAM操作以外,对外围IO、程序数据的访问均要通过加载/存储指令进行。 ARM存储访问指令表如表2.6.2所示。
Rd←[addressing],addressing 索引 LDR{cond} 表2.6.2 ARM 存储访问指令表 助记符 说明 操作 条件码位置 LDR Rd,addressing 加载字数据 Rd←[addressing],addressing 索引 LDR{cond} LDRB 加载无符字节数据 LDR{cond}B LDRT Rd,addressing 以用户模式加载字数据 LDR{cond}T LDRBT 以用户模式加载无符号字数据 LDR{cond}BT LDRH 加载无符半字数据 LDR{cond}H
STRB Rd,addressing 存储字节数据 [addressing]←Rd,addressing 索引 STR{cond}B STRT 以用户模式存储字数据 STR{cond}T SRTBT 以用户模式存储字节数据 STR{cond}BT STRH 存储半字数据 STR{cond}H LDM{mode} Rn{!},reglist 批量(寄存器)加载 reglist←[Rn…],Rn 回存等 LDM{cond}{more} STM{mode} Rn{!},rtglist 批量(寄存器)存储 [Rn…]← reglist,Rn 回存等 STM{cond}{more} SWP Rd,Rm,Rn 寄存器和存储器字数据交换 Rd←[Rd],[Rn]←[Rm](Rn≠Rd 或Rm) SWP{cond} SWPB 寄存器和存储器字节数据交换 SWP{cond}B
指令示例: LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。 LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。 LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。 LDR R0,[R1,R2]! ;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地 址R1+R2写入R1。 LDR R0,[R1,#8]! ;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址 R+8写入R1。 LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。
LDR R0,[R1,R2,LSL#2]! ;将存储器地址为R1+R2×4的字数据读入寄存器R0, LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入寄存器R0,并将 R0的高24位清零。 LDRH R0,[R1,R2] ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将R0的高16位清零。 STR R0,[R1],#8 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。 STRB R0,[R1,#8] ;将寄存器R0中的字节数据写入以R1+8为地址的存储器中。 STRH R0,[R1] ;将寄存器R0中的半字数据写入以R1为地址的存储器中
STMFD R13!,{R0,R4-R12,LR} ;将寄存器列表中的寄存器(R0,R4到R12,LR)存入堆栈。 LDMFD R13!,{R0,R4-R12,PC} ;将堆栈内容恢复到寄存器(R0,R4到R12,LR)。 SWP R0,R1,[R2] ;将R2所指向的存储器中的字数据传送到R0,同时将R1 中的字数据传送到R2所指向的存储单元。 3.ARM 数据处理指令 数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。数据传送指令用于在寄存器和存储器之间进行数据的双向传输。所有ARM 数据处理指令均可选择使用S 后缀,以影响状态标志。比较指令不需要后缀S,它们会直接影响状态标志。算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。 比较指令不保存运算结果,只更新CPSR中相应的条件标志位。 数据处理指令如表2.6.3所示。
Rd←Rn-operand2-(NOT)Carry SBC {cond}{S} 表2.6.3 数据处理指令表 助记符号 说明 操作 条件码位置 MOV Rd ,operand2 数据传送 Rd←operand2 MOV {cond}{S} MVN 数据取反传送 Rd←(operand2) MVN {cond}{S} ADD Rd,Rn operand2 加法运算指令 Rd←Rn+operand2 ADD {cond}{S} SUB 减法运算指令 Rd←Rn-operand2 SUB {cond}{S} RSB 逆向减法指令 Rd←operand2-Rn RSB {cond}{S} ADC 带进位加法 Rd←Rn+operand2+carry ADC {cond}{S} SBC 带进位减法指令 Rd←Rn-operand2-(NOT)Carry SBC {cond}{S} RSC 带进位逆向减法指令 Rd←operand2-Rn-(NOT)Carry RSC {cond}{S}
AND Rd,Rn operand2 逻辑与操作指令 Rd←Rn&operand2 AND {cond}{S} ORR 逻辑或操作指令 Rd←Rn|operand2 ORR {cond}{S} EOR 逻辑异或操作指令 Rd←Rn^operand2 EOR {cond}{S} BIC 位清除指令 Rd←Rn&(~operand2) BIC {cond}{S} CMP Rn,operand2 比较指令 标志N、Z、C、V←Rn-operand2 CMP {cond} CMN 负数比较指令 标志N、Z、C、V←Rn+operand2 CMN {cond} TST 位测试指令 标志N、Z、C、V←Rn&operand2 TST {cond} TEQ 相等测试指令 标志N、Z、C、V←Rn^operand2 TEQ {cond}
指令示例: MOV R1,R0 ;将寄存器R0的值传送到寄存器R1 MOV PC,R14 ;将寄存器R14的值传送到PC,常用于子程序返回 MOV R1,R0,LSL#3 ;将寄存器R0的值左移3位后传送到R1 MVN R0,#0 ;将立即数0取反传送到寄存器R0中,完成后R0=-1 CMP R1,R0 ;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位 CMN R1,R0 ;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位 TST R1,#0xffe ;将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位 TEQ R1,R2 ;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位
ADD R0,R1,R2 ;R0 = R1 + R2 ADDS R0,R4,R8 ;加低端的字 ADCS R1,R5,R9 ;加第二个字,带进位 SUB R0,R1,#256 ;R0 = R1 - 256 RSB R0,R1,R2 ;R0 = R2 – R1 RSC R0,R1,R2 ;R0 = R2 – R1 - !C AND R0,R0,#3 ;该指令保持R0的0、1位,其余位清零。 ORR R0,R0,#3 ;该指令设置R0的0、1位,其余位保持不变。 EOR R0,R0,#3 ;该指令反转R0的0、1位,其余位保持不变 BIC R0,R0,#%1011 ;该指令清除 R0 中的位 0、1、和 3, 其余的位保 持不变。
4.ARM 跳转指令 跳转指令用于实现程序流程的跳转,在ARM 中有两种方式可以实现程序的跳转,一种是使用跳转指令直接跳转,另一种则是直接向PC 寄存器赋值实现跳转。 通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。 ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令: (1)B(跳转指令) B指令的格式为: B{条件} 目标地址 B指令是最简单的跳转指令。一旦遇到一个B指令,ARM处理器将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转
指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。它是24位有符号数,左移两位后有符号扩展为32位,表示的有效偏移为26位(前后32MB的地址空间)。如指令: B Label ;程序无条件跳转到标号Label处执行 CMP R1,#0 ;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label处执行 BEQ Label (2)BL(带返回的跳转指令) BL指令的格式为: BL{条件} 目标地址 BL是另一个跳转指令,但跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14 的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调 用
的一个基本但常用的手段。如指令: BL Label ;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中 (3)BLX(带返回和状态切换的跳转指令) BLX指令的格式为: BLX 目标地址 BLX指令有两种格式,第1种格式记作BLX(1)。BLX(1)从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态的切换。同时,子程序的返回可以通过将寄存器R14值复制到PC中来完成。 第2种格式记作BLX(2)。BLX(2)从ARM指令集跳转到指令中所指定的目标地址,目标地址的指令可以是ARM指令,也可以是Thumb指令。该指令同时将PC的当前内容保存到寄存器R14中。
(4)BX(带状态切换的跳转指令) BX指令的格式为: BX{条件} 目标地址 BX指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令。 5.ARM 协处理器指令 ARM微处理器支持协处理器操作,,协处理器的控制要通过协处理器命令实现。在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略ARM处理器和其他协处理器的指令。 ARM的协处理器指令主要用于ARM处理器初始化ARM协处理器的数据处理操作,以及在ARM处理器的寄存器和协处理器的寄存器之间传送数据,和在ARM协处理器的寄存器和存储器之间传送数据。 ARM 协处理器指令如表2.6.4所示。
CDP coproc,opcodel,CRd,CRn, CRm{,opcode2} 协处理器数据操作指令 取决于协处理器 CDP{cond} 表2.6.4 ARM 协处理器指令 助记符 说明 操作 条件码位置 CDP coproc,opcodel,CRd,CRn, CRm{,opcode2} 协处理器数据操作指令 取决于协处理器 CDP{cond} LDC{L} coproc,CRd〈地址〉 协处理器数据加载指令 LDC{cond}{L} STC{L} coproc,CRd,〈地址〉 协处理器数据存储指令 STC{cond}{L} MCR coproc, opcodel,Rd, CRn,{,opcode2} MCR ARM 寄存器到协处理器寄存器的数据传送指令 MCR{cond} MRC MCR 协处理器寄存器到ARM 处理器寄存器的数据传送指令
指令示例: CDP P3,2,C12,C10,C3,4 ;该指令完成协处理器P3的初始化 LDC P3,C4,[R0] ;将ARM处理器的寄存器R0所指向的存储器中的字数据传送到协处理器P3的寄存器C4中。 STC P3,C4,[R0] ;将协处理器P3的寄存器C4中的字数据传送到ARM处理器的寄存器R0所指向的存储器中。 MCR P3,3,R0,C4,C5,6 ;该指令将ARM处理器寄存器R0中的数据传送到协处理器P3的寄存器C4和C5中。 MRC P3,3,R0,C4,C5,6 ;该指令将协处理器P3的寄存器中的数据传送到ARM处理器寄存器中。 6.ARM 杂项指令 (1)异常产生指令 ARM微处理器所支持的异常指令有如下两条:
① SWI(软件中断指令) SWI指令的格式为: SWI{条件} 24位的立即数 SWI指令用于产生软件中断,以便用户程序能调用操作系统的系统例程。操作系统在SWI的异常处理程序中提供相应的系统服务,指令中24位的立即数指定用户程序调用系统例程的类型,相关参数通过通用寄存器传递,当指令中24位的立即数被忽略时,用户程序调用系统例程的类型由通用寄存器R0的内容决定,同时,参数通过其他通用寄存器传递。 指令示例: SWI 0x02 ;该指令调用操作系统编号位02的系统例程。 ② BKPT(断点中断指令) BKPT指令的格式为: BKPT 16位的立即数
BKPT指令产生软件断点中断,可用于程序的调试 (2)程序状态寄存器访问指令 ARM微处理器支持程序状态寄存器访问指令,用于在程序状态寄存器和通用寄存器之间传送数据,程序状态寄存器访问指令包括以下两条: ① MRS(程序状态寄存器到通用寄存器的数据传送指令) MRS指令的格式为: MRS{条件} 通用寄存器,程序状态寄存器(CPSR或SPSR) MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下几种情况: 当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。 当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。
指令示例: MRS R0,CPSR ;传送CPSR的内容到R0 MRS R0,SPSR ;传送SPSR的内容到R0 ② MSR(通用寄存器到程序状态寄存器的数据传送指令) MSR指令的格式为: MSR{条件} 程序状态寄存器(CPSR或SPSR)_<域>,操作数 MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。<域>用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域: 位[31:24]为条件标志位域,用f表示; 位[23:16]为状态位域,用s表示; 位[15:8]为扩展位域,用x表示; 位[7:0]为控制位域,用c表示;
该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操作的域。 指令示例: MSR CPSR,R0 ;传送R0的内容到CPSR MSR SPSR,R0 ;传送R0的内容到SPSR MSR CPSR_c,R0 ;传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域 7.ARM 伪指令 ARM 伪指令不是ARM 指令集中的指令,只是为了编程方便编译器定义的指令,使用时可以像其它ARM 指令一样使用,但在编译时这些指令将被等效的ARM 指令代替。ARM伪指令有ADR,ADRL,LDR,NOP四条。 ①ADR指令将基于PC相对偏移的地址值加载到寄存器中。指令格式如下:
ADR{cond} register,exper ② ADRL指令将程序相对偏移或寄存器相对偏移地址加载到寄存器中。在汇编编译源程序时,ADRL 伪指令被编译器替换成两个条合适的指令。若不能用两条指令实现ADRL 伪指令功能,则产生错误,编译失败。指令格式如下: ADR{cond} register,expr 其中,register 加载的目标寄存器。expr 地址表达式。当地址值是非字对齐地址时,取值范围-64K~64K字节之间;当地址值是字对齐地址时,取值范围-256K~256K 字节之间。 ③ LDR伪指令用于加载32 位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR 伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV 或MVN 的范围,则使用MOV 或
MVN 指令代替该LDR 伪指令,否则汇编器将产生文字常量放入字池,并使用一条程序相对偏移的LDR 指令从文字池读出常量。LDR 伪指令格式如下: LDR{cond} register, [ expr∣label_expr] 其中:register 加载的目标寄存器,expr 32 位立即数,labe1_expr 程序相对偏移或外部表达式。 ④ NOP为空操作伪指令。在汇编时将会被代替成ARM 中的空操作,比如可能MOV,R0,R0指令等。NOP可用于延时操作。NOP伪指令格式如下: NOP 2.6.3 Thumb 指令集 ARM体系结构除了支持执行效率很高的32位ARM指令集以外,同时支持16位的Thumb指令集。Thumb指令集是ARM指令集的一个子集,允许指令编码为16位的长度。与等价的32位代码相比较,Thumb指令集在保留32代码优势的同时,大大的节省了系统的存储空间。
所有的Thumb指令都有对应的ARM指令,而且Thumb的编程模型也对应于ARM的编程模型,在应用程序的编写过程中,只要遵循一定调用的规则,Thumb子程序和ARM子程序就可以互相调用。当处理器在执行ARM程序段时,称ARM处理器处于ARM工作状态,当处理器在执行Thumb程序段时,称ARM处理器处于Thumb工作状态。 与ARM指令集相比较,Thumb指令集中的数据处理指令的操作数仍然是32位,指令地址也为32位,但Thumb指令集为实现16位的指令长度,舍弃了ARM指令集的一些特性,如大多数的Thumb指令是无条件执行的,而几乎所有的ARM指令都是有条件执行的;大多数的Thumb数据处理指令的目的寄存器与其中一个源寄存器相同。
Thumb 指令集不是一个完整的体系结构。Thumb 指令集没有协处理器指令,信号量指令以及访问CPSR或SPSR的指令,没有乘加指令及64位乘法指令等,且指令的第二操作数受到限制;除了跳转指令B有条件执行功能外,其它指令均为无条件执行;大多数Thumb数据处理指令采用2地址格式。因此,Thumb指令只需要支持通用功能,必要时可以借助于完善的ARM指令集,比如,所有异常自动进入ARM状态。 在编写Thumb 指令时,先要使用伪指令CODE16声明,而且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。编写ARM指令时,则可使用伪指令CODE32声明。 Thumb 存储器访问指令如表2.6.5所示。Thumb指令集的LDM和SRM指令可以将任何范围为R0~R7的寄存器子集加载或存储。批量寄存器加载和存储指令只有LDMIA、STMIA指令,即每次传送先加载/存储数据,然后地址加4。对堆栈处理只能使用PUSH 指令及POP指令。
Rd←[Rm,#immed_5×4], Rd,Rn 为R0~R7 无 表2.6.5 Thumb 存储器访问指令 助记符 说明 操作 影响标志 LDR Rd,[Rn,#im med_5×4] 加载字数据 Rd←[Rm,#immed_5×4], Rd,Rn 为R0~R7 无 LDRH Rd,[Rn, #immed_5×2] 加载无符半字数据 Rd←[Rm,#immed_5×2], Rd,Rn 为R0~R7 LDRB Rd,[Rn, #immed_5×1] 加载无符字节数据 Rd←[Rm,#immed_5×1], Rd,Rn 为R0~R7 STR 存储字数据 [Rn,#immed_5×4]←Rd, Rd,Rn 为R0~R7 STRH Rd,[Rn, 存储无符半字数据 [Rn,#immed_5×2] ←Rd, Rd,Rn 为R0~R7 STRB Rd,[Rn, 存储无符字节数据 [Rn,#immed_5×1] ←Rd, Rd,Rn 为R0~R7
STR Rd,[Rn,#im med_5×4] 存储字数据 [Rn,#immed_5×4]←Rd, Rd,Rn 为R0~R7 无 STRH Rd,[Rn, #immed_5×2] 存储无符半字数据 [Rn,#immed_5×2] ←Rd, STRB Rd,[Rn, #immed_5×1] 存储无符字节数据 [Rn,#immed_5×1] ←Rd, LDR Rd,[Rn,Rm] 加载字数据 Rd←[Rn,Rm], Rd,Rn, Rm 为R0~R7 LDRH Rd,[Rn,Rm] 加载无符半字数据 Rd←[Rn,Rm],Rd,Rn, LDRB Rd,[Rn,Rm] 加载无符字节数据
LDRSH Rd[Rn,Rm] 加载有符半字数据 Rd←[Rn,Rm],Rd,Rn,Rm 为R0~R7 无 LDRSB Rd[Rn,Rm] 加载有符字节数据 STR Rd,[Rn,Rm] 存储字数据 [Rn,Rm]←Rd,Rd,Rn,Rm STRH Rd,[Rn,Rm] 存储无符半字数据 STRB Rd,[Rn,Rm] 存储无符字节数据 LDR Rd,[PC,#immed_8×4] 基于PC 加载字数据 Rd←{PC,#immed_8×4], Rd 为R0~R7
LDR Rd,label 基于PC 加载字数据 Rd←[label],Rd 为R0~R7 无 LDR Rd,[SP,#im med_8×4] 基于SP 加载字数据 Rd←[SP,#immed_8×4], Rd 为R0~R7 STR Rd,[SP,#im 基于SP 存储字数据 [SP,#immed_8×4]←Rd, LDMIA Rn{!}reglist 批量(寄存器)加载 regist←[Rn…] STMIA Rn{!}reglist [Rn…]←reglist PUSH {reglist[,LR]} 寄存器入栈指令 [SP…]←reglist[,LR] POP {reglist[,PC]} reglist[,PC]←[SP…]
Thumb 数据处理指令如表2.6.6所示。大多数Thumb 处理指令采用2 地址格式,数据处理操作比ARM 状态的更少,访问寄存器R8~R15受到一定限制。 Thumb跳转指令有B,BL,BLX和BX 4条指令。 Thumb杂项指令有SWI(软件中断指令)和BKPT(断点中断指令)。 Thumb伪指令有ADR,LDR和NOP。
助记符 说明 操作 影响标志 MOV Rd,#expr 数据转送 Rd←expr,Rd 为R0~R7 影响N,Z Rd,Rm 表2.6.6 Thumb 数据处理指令 助记符 说明 操作 影响标志 MOV Rd,#expr 数据转送 Rd←expr,Rd 为R0~R7 影响N,Z Rd,Rm Rd←Rm,Rd、Rm均 可为R0~R15 Rd T和Rm均为 R0~R7时,影响N,Z,清零C,V MVN 数据非传 送指令 Rd←(-Rm),Rd,Rm均 为R0~R7 NEG 数据取 负指令 Rd←(-Rm),Rd,Rm 均 影响N,Z,C,V
ADD Rd.Rn, Rm 加法运算指令 Rd←Rn+Rm,Rd,Rn, Rm均为R0~R7 影响N,Z,C,V #expr3 Rd←Rn+expr#,Rd, Rn均为R0~R7 Rd, #expr8 Rd←Rd+expr8, Rd为R0~R7 Rd,Rm Rd←Rd+Rm,Rd,Rm 均 可为R0~R15 R d和Rm均为R0~ R7时,影响N,Z,C,V Rp#expr SP/PC加法运算指令 Rd←SP+expr 或PC+expr, 无 SP, #expr SP加法运算指令 SP←SP+expr
SUB Rd,Rn,Rm 减法运算指令 Rd←Rn-Rm,Rd、Rn, Rm均为R0~R7 影响N,Z,C,V Rd, Rn#expr3 Rd←Rn-expr3,Rd, Rn均为R0~R7 Rd,#expr8 RD←Rd-expr8, Rd为R0~R7 SP,#expr SP减法运算指令 SP←SP-expr 无 ADC Rd,Rm 带进位加法指令 Rd←Rd+Rm+Carry, Rd,Rm为R0~R7 SBC 带位减法指令 Rd←Rd-Rm-(NOT)Carry,Rd,Rm为R0~R7 MUL 乘法运算指令 Rd←Rd*Rm,Rd、 Rm为R0~R7 影响N,Z,
AND Rd,Rm 逻辑与操作指令 Rd←Rd&Rm,Rd,Rm为R0~R7 影响N,Z, ORR 逻辑或操作指令 Rd←Rd|Rm,Rd,Rm为R0~R7 EOR 逻辑异或操作指令 Rd←Rd^Rm,Rd,Rm为R0~R7 BIC 位清除指令 Rd←Rd&(~Rm),Rd,Rm为R0~R7 ASR Rd,Rs 算术右移指令 Rd←Rd算术右移Rs 位,Rd,Rs为R0~R7 影响N,Z,C, #expr Rd←Rm算术右移expr位,Rd,Rm为R0~R7 LSL 逻辑左移指令 Rd←Rd<<Rs,Rd,Rs为R0~R7
LSL Rd,Rm, #expr 逻辑左移指令 Rd←Rm<<expr,Rd,Rm为R0~R7 影响N,Z,C, LSR Rd,Rs 逻辑右移指令 Rd←Rd>>Rs,Rd,Rs为R0~R7 Rd←Rm>>mexpr,Rd,Rm为R0~R7 ROR 循环右移指令 Rd←Rm循环右移Rs位, Rd,Rs为R0~R7 CMP Rn,Rm 比较指令 状态标←Rn-Rm,Rn, Rm为R0~R15 影响N,Z,C,V Rn,#expr 状态标←Rn-expr,Rn为R0~R7 CMN 负数比较指令 状态标←Rn+Rm,Rn,Rm为R0~R7 TST 位测试指令 状态标←Rn&Rm,Rn,Rm为R0~R7
2.7 ARM微处理器的接口 2.7.1 ARM协处理器接口 为了便于片上系统SoC的设计,ARM可以通过协处理器(CP)来支持一个通用指令集的扩充,通过增加协处理器来增加系统的功能。 在逻辑上,ARM可以扩展16个(CP15~CP0)协处理器,其中:CP15作为系统控制,CP14作为调试控制器,CP7~4作为用户控制器,CP13~8和CP3~0保留。每个协处理器可有16个寄存器。例如MMU和保护单元的系统控制都采用CP15协处理器;JTAG调试中的协处理器为CP14,即调试通信通道DCC(Debug Communication Channel)。 ARM处理器内核与协处理器接口有以下4类。 ① 时钟和时钟控制信号:MCLK、nWAIT、nRESET; ② 流水线跟随信号:nMREQ、SEQ、nTRANS、nOPC、TBIT; ③ 应答信号:nCPI、CPA、CPB; ④ 数据信号:D[31:0]、DIN[31:0]、DOUT[31:0]。
协处理器的应答信号中: ● nCPI为ARM处理器至CPn协处理器信号,该信号低电压有效代表“协处理器指 令”,表示ARM处理器内核标识了1条协处理器指令,希望协处理器去执行它。 ● CPA为协处理器至ARM处理器内核信号,表示协处理器不存在,目前协处理器无 能力执行指令。 ● CPB为协处理器至ARM处理器内核信号,表示协处理器忙,还不能够开始执行指 令。 协处理器也采用流水线结构,为了保证与ARM处理器内核中的流水线同步,在每一个协处理器内需有1个流水线跟随器(Pipeline Follower),用来跟踪ARM处理器内核流水线中的指令。由于ARM的Thumb指令集无协处理器指令,协处理器还必须监视TBIT
信号的状态,以确保不把Thumb指令误解为ARM指令。 协处理器也采用Load/Store结构,用指令来执行寄存器的内部操作,从存储器取数据至寄存器或把寄存器中的数保存至存储器中,以及实现与ARM处理器内核中寄存器之间的数据传送。而这些指令都由协处理器指令来实现。 2.7.2 ARM AMBA接口 ARM处理器内核可以通过先进的微控制器总线架构AMBA(Advanced Microcontroller Bus Architecture)来扩展不同体系架构的宏单元及I/O部件。AMBA已成为事实上的片上总线OCB(On Chip Bus)标准。 AMBA有AHB(Advanced High-performance Bus,先进高性能总线)、ASB(Advanced System Bus,先进系统总线)和APB(Advanced Peripheral Bus,先进外围总线)等三类总线。
ASB是目前ARM常用的系统总线,用来连接高性能系统模块,支持突发(Burst)方式数据传送。 AHB不但支持突发方式的数据传送,还支持分离式总线事务处理,以进一步提高总线的利用效率。特别在高性能的ARM架构系统中,AHB有逐步取代ASB的趋势,例如在ARM1020E处理器核中。 APB为外围宏单元提供了简单的接口,也可以把APB看作ASB的余部。 AMBA通过测试接口控制器TIC(Test Interface Controller)提供了模块测试的途径,允许外部测试者作为ASB总线的主设备来分别测试AMBA上的各个模块。 AMBA中的宏单元也可以通过JTAG方式进行测试。虽然AMBA的测试方式通用性稍差些,但其通过并行口的测试比JTAG的测试代价也要低些。 一个基于AMBA的典型系统如图2.7.1所示。
图2.7.1 一个基于AMBA的典型系统
2.7.3 ARM I/O结构 ARM处理器内核一般都没有I/O的部件和模块,ARM处理器中的I/O可通过AMBA总线来扩充。 ARM采用了存储器映像I/O的方式,即把I/O端口地址作为特殊的存储器地址。一般的I/O,如串行接口,它有若干个寄存器,包括发送数据寄存器(只写)、数据接收寄存器(只读)、控制寄存器、状态寄存器(只读)和中断允许寄存器等。这些寄存器都需相应的I/O端口地址。应注意的是存储器的单元可以重复读多次,其读出的值是一致的;而I/O设备的连续2次输入,其输入值可能不同。 在许多ARM体系结构中I/O单元对于用户是不可访问的,只可以通过系统管理调用或通过C的库函数来访问。 ARM架构的处理器一般都没有DMA(直接存储器存取)部件,只有一些高档的ARM架构处理器才具有DMA的功能。
为了能提高I/O的处理能力,对于一些要求I/O处理速率比较高的事件,系统安排了快速中断FIQ(Fast Interrupt reQuest),而对其余的I/O源仍安排一般中断IRQ。 为提高中断响应的速度,在设计中可以采用以下办法: ● 提供大量后备寄存器,在中断响应及返回时,作为保护现场和恢复现场的上下文切换(Context Switching)之用。 ● 采用片内RAM的结构,这样可以加速异常处理(包括中断)的进人时间。 ● 快存Cache和地址变换后备缓冲器TLB(Translation Lookaside Buffer)采用锁住 (Locked down)方式以确保临界代码段不受“不命中”的影响。
2.7.4 ARM JTAG调试接口 1.JTAG接口 JTAG(Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议,主要用于芯片内部测试及对系统进行仿真、调试。JTAG技术是一种嵌入式调试技术,它在芯片内部封装了专门的测试电路TAP(Test Access Port,测试访问口),通过专用的JTAG测试工具对内部节点进行测试。目前大多数比较复杂的器件都支持JTAG协议,如ARM、DSP、FPGA器件等。 JTAG测试允许多个器件通过JTAG接口串联在一起,形成一个JTAG链,能实现对各个器件分别测试。JTAG接口还常用于实现ISP(In-System Programmable在系统编程)功能,如对Flash 器件进行编程等。 通过JTAG接口,可对芯片内部的所有部件进行访问,因而是开发调试嵌入式系统的一种简洁高效的手段。 标准的JTAG接口是4线式的,分别为TM S(测试模式选择)、TCK(测试时钟)、TDI(测试数据输入)和TDO(测试数据输出)。 目前JTAG接口的连接有14针接口和20针接口两种标准,其定义分别如下表2.7.1和表2.7.2所示。
引脚 名 称 描 述 1、13 VCC 接电源 2,4,6,8,10,14 GND 接地 3 nTRST 测试系统复位信号 5 TDI 表2.7.1 14针JTAG接口定义 引脚 名 称 描 述 1、13 VCC 接电源 2,4,6,8,10,14 GND 接地 3 nTRST 测试系统复位信号 5 TDI 测试数据串行输入 7 TMS 测试模式选择 9 TCK 测试时钟 11 TDO 测试数据串行输出 12 NC 未连接
引脚 名 称 描 述 1 VTref 目标板参考电压,接电源 2 VCC 接电源 3 nTRST 测试系统复位信号 4,6,8,10,12, 表2.7.2 20针JTAG接口定义 引脚 名 称 描 述 1 VTref 目标板参考电压,接电源 2 VCC 接电源 3 nTRST 测试系统复位信号 4,6,8,10,12, 14,16,18,20 GND 接地 5 TDI 测试数据串行输入 7 TMS 测试模式选择 9 TCK 测试时钟 11 RTCK 测试时钟返回信号 13 TDO 测试数据串行输出 15 nRESET 目标系统复位信号 17、19 NC 未连接
2.ARM JTAG调试接口 ARM JTAG调试接口的结构如图2.7.2所示。它由测试访问端口TAP(Test Access Port)控制器、旁路(Bypass)寄存器、指令寄存器、数据寄存器以及与JTAG接口兼容的ARM架构处理器组成。处理器的每个引脚都有一个移位寄存单元(边界扫描单元(BSC,Boundary Scan Cell)),它将JTAG电路与处理器核逻辑电路联系起来,同时,隔离了处理器核逻辑电路与芯片引脚。所有边界扫描单元构成了边界扫描寄存器BSR,该寄存器电路仅在进行JTAG测试时有效,在处理器核正常工作时无效。 (1)JTAG的控制寄存器 ①测试访问端口TAP控制器对嵌入在ARM处理器核内部的测试功能电路进行访问控制,是一个同步状态机。通过测试模式选择TMS和时钟信号TCK来控制其状态转移,实现IEEE1149.1标准所确定的测试逻辑电路的工作时序。 ②指令寄存器是串行移位寄存器,通过它可以串行输入执行各种操作的指令。
③数据寄存器组是一组串行移位寄存器。操作指令被串行装入由当前指令所选择的数据寄存器,随着操作的进行,测试结果被串行移出 (2)JTAG测试信号 JTAG测试信号包含有TRST、TCK、TMS、TDI、TDO 五个测试信号。 JTAG可以对同一块电路板上多块芯片进行测试。TRST、TCK和TMS信号并行至各个芯片,而一块芯片的TDO接至下一芯片的TDI。 (3)TAP状态机 测试访问端口TAP控制器是一个16状态的有限状态机,为JTAG提供逻辑控制,控制进人JTAG结构中各种寄存器内数据的扫描与操作。在TCK同步时钟上升沿的TMS引脚的逻辑电压决定状态转移的过程。 由TDI引脚输入到器件的扫描信号有2个状态变化路径:用于指令移入至指令寄存器,或用于数据移入至相应的数据寄存器(该数据寄存器由当前指令确定)。
图2.7.2 JTAG调试接口示意图
(4)JTAG接口控制指令 控制指令用于控制JTAG接口各种操作,控制指令包括公用(Public)指令和私有(Private)指令。最基本的公用指令有: ● BYPASS:旁路片上系统逻辑指令,用于未被测试的芯片,即把TDI与TPO旁路(1个时钟延迟)。 ● EXTEST:片外电路测试指令,用于测试电路板上芯片之间的互连。 ● IDCODE:读芯片ID码指令,用于识别电路板上的芯片。 ● INTEST:片内测试指令,边界扫描寄存器位于TDI与TDO引脚之间,处理器核逻辑输入和输出状态被该寄存器捕获和控制。 采用ARM公司提供的标准20脚JTAG仿真调试接口电路如图2.7.3所示,可以通过外部JTAG调试电缆或仿真器与开发系统连接调试。
图2.7.3 JTAG仿真调试接口电路
第2章 思考题与习题 1 简述ARM微处理器的特点。 2 试画出ARM体系结构方框图,并说明各部分功能。 3 简述ARM7TDMI的接口分类与功能。 4 登录www.samsung.com ,查阅S3C4510B有关资料,分析其结构特点、接口分类与功能。 5 试分析ARM720T处理器内核结构和ARM7TDMI处理器内核结构的差异。 6 试分析ARM920T内核结构特点。 7 查阅有关资料,试画出ARM9E系列微处理器内核结构方框图。 8 查阅有关资料,试画出ARM10E系列微处理器内核结构方框图。 9 查阅有关资料,试画出SecurCore系列微处理器内核结构方框图。
10 查阅有关资料,试画出Intel Strong ARM系列微处理器内核结构方框图。 11 查阅有关资料,试画出Intel XScale系列微处理器内核结构方框图。 12 ARM微处理器支持哪几种运行模式?各运行模式有什么特点? 13 ARM处理器有几种工作状态?各工作状态有什么特点? 14 试分析ARM寄存器组织结构图,并说明寄存器分组与功能。 15 简述程序状态寄存器的位功能。 16 试分析Thumb状态下寄存器组织,并说明寄存器分组与功能。 17 试分析Thumb状态与ARM状态的寄存器关系。 18 ARM体系结构支持几种类型的异常,并说明其异常处理模式和优先级状态? 19 简述异常类型的含义。
20 简述ARM微处理器处理异常的操作过程。 21 对于字对齐的地址A,地址空间规则有哪些要求? 22 试说明存储器映射I/O的特点。 23 ARM处理器有哪几种基本寻址方式? 24 举例说明LSL、 LSR、ASR、ROR、RRX的移位操作过程 25 举例说明寄存器间接寻址的操作过程。 26 举例说明变址寻址的操作过程。
27 存储器生长堆栈可分为哪几种?各有什么特点? 28 ARM微处理器支持这哪几种类型的堆栈工作方式?各有什么特点? 29 举例说明块复制寻址的操作过程。 30 举例说明相对寻址的操作过程。 31 ARM 指令集包含有哪些类型的指令? 32 简述指令格式及各项的含义。 33 举例说明ARM 存储器访问指令功能。 34 举例说明ARM 数据处理指令功能。 35 举例说明ARM 跳转指令功能。 36 举例说明ARM 协处理器指令功能。 37 举例说明ARM 杂项指令功能。
38 举例说明ARM 伪指令功能。 39 Thumb 指令集包含有哪些类型的指令? 40 ARM协处理器接口结构与功能? 41 ARM AMBA接口结构与功能? 42 ARM I/O结构特点? 43 ARM JTAG调试接口结构与电路?