第三讲ARM技术基础ARM技术基础ARM处理器工作状态ARM处理器工作模式ARM寄存器组成ARM的异常中断ARM组织结构简介ARM存储器接口及存储器层次ARM协处理器ARM片上总线AMBA基于JTAG的ARM系统调试ARM处理器工作状态自从ARM7TDMI核以后,体系结构中具有T变种的ARM处理器核可以工作在以下两种状态:ARM状态32位,ARM状态下执行字对准的32位ARM指令;Thumb状态16位,Thumb状态下执行半字对准的16位Thumb指令。在Thumb状态下,程序计数器PC使用位1选择另一个半字。ARM处理器工作状态ARM处理器在两种工作状态之间切换方法为进入Thumb状态:当操作数寄存器Rm的状态位bit[0]为1时,执行BXRm指令进入Thumb状态所有的异常都是再ARM状态下进行,如果处理器在Thumb状态进入异常,则当异常处理(IRQ,FIQ,Undef,Abort和SWI)返回时,自动切换到Thumb状态。ARM处理器工作状态进入ARM状态:当操作数寄存器Rm的状态位bit[0]为0时,执行BXRm指令进入ARM状态。如果处理器进行异常处理(IRQ,FIQ,Undef,Abort和SWI),在此情况下,把PC放入异常模式链接寄存器LR中,从异常向量地址开始执行也可以进入ARM状态。ARM处理器工作状态在程序执行的过程中,处理器可以在两种状态下切换。需要强调的是:ARM和Thumb之间状态的切换不影响处理器的模式或寄存器的内容。ARM指令集和Thumb指令集都有相应的状态切换命令。ARM处理器在开始执行代码时,只能处于ARM状态。ARM技术基础ARM处理器工作状态ARM处理器工作模式ARM寄存器组成ARM的异常中断ARM组织结构简介ARM存储器接口及存储器层次ARM协处理器ARM片上总线AMBA基于JTAG的ARM系统调试ARM处理器工作模式ARM处理器共支持所列的7种处理器模式见下表表2-2中给出了CPSR[4:0]与七种工作模式的关系以及各种模式的解释。CPSR[4:0]模式用途可访问的寄存器10000用户正常用户模式,程序正常执行模式PC,R14~R0,CPSR10001FIQ处理快速中断,支持高速数据传送或通道处理PC,R14_fiq~R8_fiq,R7~R0,CPSR,SPSR_fiq10010IRQ处理普通中断PC,R14_irq~R13_fiq,R12~R0,CPSR,SPSR_irq10011SVC操作系统保护模式处理软件中断(SWI)PC,R14_svc~R13_svc,R12~R0,CPSR,SPSR_svc10111中止处理存储器故障、实现虚拟存储器和存储器保护PC,R14_abt~R13_abt,R12~R0,CPSR,SPSR_abt11011未定义处理未定义的指令陷阱,支持硬件协处理器的软件仿真PC,R14_und~R13_und,R12~R0,CPSR,SPSR_und11111系统运行特权操作系统任务PC,R14~R0,CPSRARM处理器工作模式在软件控制、外部中断或异常处理下可以引起处理器工作模式的改变。大多数的用户程序是运行在用户模式下,这时应用程序不能够访问一些受操作系统保护的系统资源,也不能改变模式。应用程序也不能直接进行处理器模式的切换,除非异常(exception)发生,这允许操作系统来控制系统资源的使用,适当编写操作系统可以来控制系统资源的使用。ARM处理器工作模式除用户模式外的其他6种模式称为特权模式。特权操作模式主要处理异常和监控调用(有时称为软件中断),它们可以自由的访问系统资源和改变模式。特权模式中除系统模式以外的5种模式又称为异常模式,特权模式由异常模式和系统模式组成ARM处理器工作模式异常模式主要用于处理中断和异常,当应用程序发生异常中断时,处理器进入相应的异常模式。在每一种异常模式中都有某些附加的影子(shadow)寄存器组(详细可参见2.6节),供相应的异常处理程序使用,这样就可以保证在进入异常模式时,用户模式下的寄存器(保存了程序运行状态)不被破坏,以避免异常出现时用户模式的状态不可靠。ARM处理器工作模式而系统模式仅在ARM体系结构V4以及以上的版本存在,系统模式不是通过异常过程进入的,它与用户模式有完全相同的寄存器,这样操作系统的任务可以访问所有需要的系统资源,也可以使用用户模式的寄存器组,但不使用异常模式下相应的寄存器组,因此避免使用与异常模式有关的附加寄存器,进而确保当任何异常出现时,都不会使任务的状态不可靠或被破坏。系统模式属于特权模式,因此不受用户模式的限制。ARM技术基础ARM处理器工作状态ARM处理器工作模式ARM寄存器组成ARM的异常中断ARM组织结构简介ARM存储器接口及存储器层次ARM协处理器ARM片上总线AMBA基于JTAG的ARM系统调试ARM寄存器组成ARM寄存器组成概述ARM状态下的寄存器组织Thumb状态下的寄存器组织ARM寄存器组成概述ARM处理器总共有37个寄存器,这37个寄存器按它在用户编程中的功能划分,可以分为以下两类寄存器31个通用寄存器在这31个通用寄存器中包括了程序计数器(PC),这些寄存器都是32位的。6个状态寄存器。31个通用寄存器R0~R15;R13_svc、R14_svc;R13_abt、R14_abt;R13_und、R14_und;R13_irq、R14_irq;R8_frq-R14_frq。6个状态寄存器CPSR;SPSR_svc、SPSR_abt、SPSR_und、SPSR_irq和SPSR_fiq。6个状态寄存器也是32位的,但目前只使用了其中的12位ARM寄存器组成概述这些寄存器并不是在同一时间全都可以被编程者看到或访问的。处理器工作状态和工作模式共同决定了程序员可以访问的寄存器。如前所述,ARM处理器共有7种不同的处理器模式和两种工作状态,也就是说ARM处理器在每个时刻只能工作在七种模式中的任何一种和ARM、Thumb状态中一种因此程序员可以操作的寄存器因工作状态和工作模式不同而不同。ARM状态下的寄存器组织一.ARM状态的寄存器简介二.ARM状态的通用寄存器三.ARM程序状态寄存器ARM状态的寄存器简介R0R1R2R3R4R5R6R7R8R9R10R11R12R15(PC)通用寄存器和程序计数器状态寄存器R14(LR)R14-svcR14-abtR14-undR14-irqR14-fiqCPSR无SPSR-svc系统管理中止未定义普通中断快速中断R13(SP)R13-svcR13-abtR13-undR13-irqR13-fiqR12-fiqR11-fiqR10-fiqR9-fiqR8-fiqSPSR-abtSPSR-undSPSR-irqSPSR-fiq用户异常模式特权模式图2-4ARM状态下的寄存器组织模式ARM状态的寄存器简介图2-4可以看到在所有的寄存器中,有些寄存器是各模式共用的同一个物理寄存器;有一些寄存器是各模式自己拥有的独立的物理寄存器。除了系统模式与用户模式具有完全相同的一组寄存器外,在其它每一种处理器模式下都有一组相应的寄存器组。任意时刻处理器的工作模式决定了哪些寄存器是编程者可以访问的。ARM状态的寄存器简介•对于系统模式、用户模式可以访问的寄存器是16个通用寄存器(R0-R14、R15(PC))和1个CPSR状态寄存器。•对于5种异常模式下,可以访问两个状态寄存器CPSR、SPSR和16个通用寄存器(可参见图2-4)。因此在任何时候,16个通用寄存器和1个或2个状态寄存器可在任何时候同时被访问,ARM状态的寄存器简介_影子寄存器在图中,带有“”“”的寄存器被称为影子寄存器,它是针对处理器不同工作模式下而特有的物理寄存器。在异常模式下,它们将代替用户或系统模式下使用的部分寄存器。在管理、中止、未定义、普通中断模式下的影子寄存器都为两个,而快速中断为7个,这样更有利于快速中断处理进程。ARM状态的寄存器_ARM状态通用寄存器•通用寄存器(R0~R15)可分为3类:不分组寄存器(Theunbankedregisters):R0~R7;分组寄存器(Thebankedregisters):R8~R14;程序计数器:R15(PC)ARM状态的寄存器_ARM状态通用寄存器不分组寄存器R0~R7:R0~R7是不分组寄存器。这意味着在所有处理器模式下,它们每一个都访问的是同一个物理寄存器。它们是真正并且在每种状态下都统一的通用寄存器。必须注意对同一寄存器在不同模式下使用时的数据保护。ARM状态的寄存器_ARM状态通用寄存器分组寄存器R8~R14FIQ模式分组寄存器R8~R12在FIQ模式下使用R8_fiq~R12_fiq,FIQ处理程序可以不必保存和恢复中断现场,从而使FIQ中断的处理过程更加迅速。FIQ以外的分组寄存器R8~R12在FIQ模式以外的其它4种异常模式下,可以访问R8~R12的寄存器和用户模式、系统模式下的R8-R12没有区别,是属于同一物理寄存器,也没有任何指定的特殊用途ARM状态的寄存器_ARM状态通用寄存器分组寄存器R13、R14寄存器R13、R14各有6个分组的物理寄存器。1个用于用户模式和系统模式,而其他5个分别用于5种异常模式。异常模式下R13、R14的访问时特别需要明确指定它们的工作模式。寄存器名字构成规则如下:R13_modeR14_mode其中mode可以从svc、abt、und、irq和fiq5种模式中选取一个。ARM状态的寄存器_ARM状态通用寄存器•R13寄存器R13通常用做堆栈指针SP,在ARM指令集中,并没有任何指令强制性的使用R13作为堆栈指针,而在Thumb指令集中,有一些指令强制性地使用R13作为堆栈指针。每一种异常模式拥有自己的物理R13。应用程序在对每一种异常模式进行初始化时,都要初始化该模式下的R13,使其指向相应的堆栈。当退出异常处理程序时,将保存在R13所指的堆栈中的寄存器值弹出,这样就使异常处理程序不会破坏被其中断程序的运行现场。ARM状态的寄存器_ARM状态通用寄存器•R14寄存器R14用作子程序链接寄存器(LinkRegister-LR),也称为LR,当程序执行子程序调用指令BL、BLX时,当前的PC将保存在R14寄存器中。每一种异常模式都有自己的物理R14,R14用来存放当前子程序的返回地址。当执行完子程序后,只要把R14的值复制到程序计数器PC中,子程序即可返回。两种方式可实现子程序的返回执行下面任何一条指令都可以实现子程序的返回:MOVPC,LRBXLR在子程序入口使用下面的指令将PC保存到栈中:STMFDSP!,{registers,LR}相应地,下面的指令可以实现子程序返回:LDMFDSP!,{registers,PC}两种方式可实现子程序的返回R14还用于异常处理的返回。当某种异常中断发生时,该异常模式下的寄存器R14将保存基于PC(进入异常前的PC)的返回地址在不同的流水线下,R14所保存的值会有所不同,三级流水下的R14保存的值为PC-4。在一个处理器的异常返回过程中,R14保存的返回地址可能与真正需要返回的地址有一个常数的偏移量,而且不同的异常模式这个偏移量会有所不同。异常中断返回的方式与上面的子程序返回方式基本相同。当然,在其他情况下R14寄存器也可以作为通用寄存器使用ARM状态的寄存器_ARM状态通用寄存器•通用寄存器(R0~R15)可分为3类:不分组寄存器(Theunbankedregisters):R0~R7;分组寄存器(Thebankedregisters):R8~R14;程序计数器:R15(PC)程序计数器:R15(PC)寄存器R15被用作程序计数器,也称为PC。它虽然可以作为一般的通用寄存器使用,但是由于R15的特