1、嵌入式系统设计:ARM:ARM处理器的工作模式1.1.1 ARM处理器的工作状态和模式为了能够体现ARM的特点和性能,ARM处理器有两种工作状态和7种工作模式。1.1.1 ARM处理器的工作状态 有两种工作状态:ARM状态:处理器执行32位的字对齐的ARM指令;Thumb状态:处理器执行16位的半字对齐的Thumb指令。两种状态可以切换。程序执行过程中,通过执行带状态切换的分支指令BX,随时在两种工作状态之间进行切换。并且,处理器工作状态的转变,并不影响处理器的工作模式和相应寄存器中的内容。2.1.1 ARM处理器的工作状态和模式(2)从ARM状态切换到Thumb状态有两种情况ARM处理器自动
2、切换到Thumb状态。(1)执行BX指令,当操作数寄存器的位0为1时,则微处理器从ARM状态切换到Thumb状态。此为主动切换。(2)当处理器处于Thumb状态时发生异常(如IRQ、FIQ、Undef等),处理完异常后,在异常处理返回时,自动切换到Thumb状态。此为自动切换。从Thumb状态切换到ARM状态有两种情况ARM处理器自动切换到Thumb状态。(1)执行BX指令,当操作数寄存器的位0为0时,则微处理器从Thumb状态切换到ARM状态。(2)当处理器在Thumb状态时发生异常(如IRQ、FIQ、Undef等),则处理器从Thumb状态自动切换到ARM状态进行异常处理3.1.1 ARM
3、处理器的工作状态和模式(3)例1.1 状态切换程序;从ARM状态切换到Thumb状态LDRR0,=Lable+1BXR0;从Thumb状态切换到ARM状态LDRR0,=LableBXR0注意:ARM和Thumb之间状态的切换不影响处理器的模式或寄存器的内容。ARM处理器在开始执行代码时,只能处于ARM状态。4.1.1.2 ARM处理器的工作模式一、ARM9的7种工作模式 1、用户模式(usr):非特权模式,大部分任务执行在这种模式。正常程序执行的模式2、快速中断模式(fiq):当一个高优先级(fast)中断产生时将会进入这种模式。高速数据传输或通道处理3、外部中断模式(irq):当一个低优先级
4、(normal)中断产生时将会进入这种模式。通常的中断处理4、管理模式(svc):当复位或软中断指令执行时将会进入这种模式。供操作系统使用的一种保护模式5.1.1.2 ARM处理器的工作模式(2)5、中止模式(abt):当存取异常时将会进入这种模式虚拟存储及存储保护6、未定义模式(und):当执行未定义指令时会进入这种模式软件仿真硬件协处理器7、系统模式(sys):供需要访问系统资源的操作系统任务使用特权级的操作系统任务6.1.1.2 ARM处理器的工作模式(2)二、模式分类及特点 七种模式可以划分成四类 1、用户模式特点:应用程序不能够访问受操作系统保护的系统资源。应用程序不能进行处理器模式
5、的切换。2、系统模式特点:不属于异常模式,不是通过异常进入的。系统模式属于特权模式,可以访问所有的系统资源,也可以直接进行模式的切换。它主要供操作系统使用。3、特权模式及其特点:特权模式:除用户模式之外的工作模式又称为特权模式特点:应用程序可以访问所有的系统资源可以任意地进行处理器模式的切换7.1.1.2 ARM处理器的工作模式(3)4、异常模式及其特点:异常模式:除用户模式、系统模式之外的五种模式称为异常模式。特点:以各自的中断或异常方式进入,并且处理各自的中断或异常。对管理模式(svc)进入方式和处理内容有:系统上电复位后进入管理模式,运行系统初始化程序,如中断允许/禁止,主时钟设置,SD
6、RAM配置,各个功能模块初始化等。当执行软件中断指令SWI时,进入管理模式。8.1.1.2 ARM处理器的工作模式(4)处理器模式的切换方式:软件控制进行切换。通过外部中断和异常进行切换处理器启动时的模式转换图管理模式(Supervisor)多种特权模式变化用户程序的运行模式复位后的缺省模式主要完成各模式的堆栈设置,注意不要进入用户模式一般为用户模式User9.1.2 ARM9寄存器本节主要内容1、ARM寄存器概述2、ARM通用寄存器3、ARM状态寄存器10.1.2 ARM9寄存器1.2.1、ARM寄存器概述ARM处理器v4及以上版本有37个32位的寄存器 其中31个为通用寄存器;6个为状态寄
7、存器。31个通用寄存器R0R15;R13_svc、R14_svc;R13_abt、R14_abt;R13_und、R14_und;R13_irq、R14_irq;R8_fiq-R14_fiq 6 个状态寄存器CPSRSPSR_svc、SPSR_abt、SPSR_und、SPSR_irq和SPSR_fiq11.1.2 ARM9寄存器(2)每一类处理器模式都有一组相应的寄存器组;在任意的处理器模式下,可见的寄存器包括1515个通用寄存器(R0R0R14R14)、1 1个或2 2个状态寄存器和程序寄存器。带灰色底纹的单元格表示,用户模式或系统模式使用的一般寄存器,已被异常模式特定的另一寄存器所替代。
8、12.1.2 ARM寄存器(4)1.2.2 ARM的通用寄存器 通用寄存器包括R0R15,可以分为三类:未分组寄存器R0R7 分组寄存器R8R14 程序计数器PC(R15)一、未分组寄存器R0R7在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途,是真正的通用寄存器。因此,在中断或异常处理进行运行模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计时应引起注意。13.1.2 ARM寄存器(5)二、分组的寄存器R8R14 对于R8R12,每一次所访问的物理寄存器,与处理器当前的工作模式有关。1、R8R12当
9、处理器工作于fiq模式时,访问的寄存器为R8_fiqR12_fiq;除fiq模式以外的其他模式,访问的寄存器为R8_usrR12_usr。2、R13和R14:每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外5个物理寄存器,对应于其他5种不同的异常模式。采用以下的记号来区分不同的物理寄存器:R13_ R14_ 其中,mode为以下几种模式之一:usr、fiq、irq、svc、abt、und。14.1.2 ARM寄存器(6)R13:寄存器R13在ARM指令中常用作堆栈指针SP。但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。而在Thumb指令集中,某些指令强
10、制性的要求使用R13作为堆栈指针。R14:寄存器R14也称作子程序链接寄存器(Subroutine Link Register)或链接寄存器LR。当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)的备份。其他情况下,R14用作通用寄存器。与之类似,当发生中断或异常时,对应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15的返回值。15.1.2 ARM寄存器(7)三、程序计数器PC(R15)寄存器R15用作程序计数器(PC)。在ARM状态下,位1:0为0,位31:2用于保存PC;在Thumb状态下,位0为0,位31:1用于保存P
11、C;使用R15时注意:虽然R15可以用作通用寄存器,但是有一些指令在使用R15时有一些特殊限制,若不注意,执行的结果将是不可预料的。所以,一般不这么使用。关于PC的值:由于ARM采用多级流水线技术,所以PC总是指向正在取指的指令,而不是正在执行的指令。也即PC总是指向当前指令的下两条指令的地址。因此,对于ARM指令集而言,PC的值为当前指令的地址值加8个字节。16.1.2 ARM寄存器(8)1.2.3 ARM的状态寄存器一、两种程序状态寄存器在ARM微处理器中,有CPSR和SPSR两种程序状态寄存器。1、当前程序状态寄存器 CPSR(Current Program Status Registe
12、r)用来保存当前程序状态的寄存器。所有处理器模式下都可以访问当前程序状态寄存器CPSR。仅一个CPSR。2、保存程序状态寄存器SPSR_mode(Saved Program Status Register)SPSR_mode用来进行异常处理,其功能包括:保存ALU中的当前操作信息当异常发生时,用来保存CPSR的值,从异常返回时,将 SPSR_mode复制到CPSR中,恢复CPSR的值。控制允许和禁止中断修改SPSR的值 设置处理器的运行模式修改SPSR的值问题:一共有多少个SPSR?为什么?17.1.2.3 ARM的状态寄存器(2)二、ARM状态寄存器的格式1、条件码标志位(保存ALU中的当前
13、操作信息)N:正负号/大小 标志位0表示:正数/大于;1表示:负数/小于Z:零标志位0表示:结果不为零;1表示:结果为零C:进位/借位/移出位0表示:未进位/借位/移出0;1表示:进位/未借位/移出1V:溢出标志位0表示:结果未溢出;1表示:结果溢出31 30 29 28 27 876543210NZCV(保留)IFT M4 M3 M2 M1 M018.1.2.3 ARM9的状态寄存器(3)2、控制位I、F中断控制位控制允许和禁止中断I1 禁止IRQ中断I0 允许IRQ中断F1 禁止FIQ中断F0 允许FIQ中断T控制(标志)位反映处理器的运行状态T=1时,程序运行于Thumb状态T=0时,程
14、序运行于ARM状态M控制位决定了处理器的运行模式当发生异常时这些位被改变。如果处理器运行在特权模式,这些位也可以由程序修改。M4:010000100011001010011101111101111111模式用户快中断中断管理中止未定义系统19.1.2.3 ARM9的状态寄存器(4)3、保留位 CPSR中的其余位为保留位,当改变CPSR中的条件码标志位或者控制位时,保留位不要改变,在程序中也不要使用保留位来存储数据。保留位将用于ARM版本的扩展。1.2.4 Thumb状态下的寄存器组织Thumb状态下的寄存器集是ARM状态下寄存器集的子集。程序员可以直接访问8个通用的寄存器(R0R7),程序计数
15、器PC、堆栈指针SP、链接寄存器LR和当前状态寄存器CPSP。20.本节主要内容1、中断和异常的概念2、ARM的异常中断介绍3、ARM的异常中断响应过程 4、中断向量和中断优先级 1.3 ARM异常 21.1.3 ARM异常 1.3.1 中断和异常的概念 1、中断 当CPU正在执行程序时,系统发生了一件急需处理的事件,CPU暂时停下正在执行的程序,转去处理相应的事件,事件处理完后,CPU再返回执行原来的程序,这种情况称为中断。这是中断的本来意义。中断事件:引起CPU产生中断、并且与CPU当前所执行的程序无关的、由外部硬件产生的事件,也叫中断源。中断事件也常称为外中断。常说的中断:有时指的是中断
16、的本意,有时指的是外部中断事件,即外中断。中断是计算机系统基本的功能 利用中断,外设可以与CPU并行工作,当外设需要传输数据或控制时,向CPU发出中断请求信号。CPU响应其请求进行处理。因此,使用中断既可以实现CPU与外设并行工作,又可以实时处理各种紧急事件。22.1.3 ARM异常 2、异常 是指CPU在执行指令时出现的错误,即不正常的情况。异常是与当前所执行的程序有关的。如存取数据或指令错误、计算结果溢出等。异常的处理:也用中断的方式进行处理。计算机通常是用中断来处理外中断和异常,因此下面将二者均称为异常。3、ARM程序的三种执行流程 顺序流程:每执行一条ARM指令,程序计数器(PC)的值
17、加4;每执行一条Thumb指令,程序计数器寄存器(PC)的值加2,整个过程是按顺序执行。23.对异常的说明当系统运行时,异常可能会随时发生,为保证在ARMARM处理器发生异常时不至于处于未知状态,在应用程序的设计中,首先要进行异常处理,采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序,当ARMARM处理器发生异常时,程序计数器PCPC会被强制设置为对应的异常向量,从而跳转到异常处理程序,当异常处理完成以后,返回到主程序继续执行。我们需要处理所有的异常,尽管我们可以简单的在某些异常处理程序处放置死循环。1.3 ARM异常 24.1.3 ARM异常 跳转流程:程序执行了跳转
18、指令,则要跳转到特定的地址标号处执行,包括跳转到子程序。例如,跳转指令,B、BL、BLX和BX。中断流程:当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。在当异常中断处理程序执行完成后,程序返回到发生中断的指令的下条指令处执行。在进行异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序退出时,要恢复被中断的程序的执行现场。中断处理与子程序调用的区别:中断是随机的,并且与正在执行的程序无关;子程序调用是程序的主动行为,并且与正在执行的程序密切相关。25.1.3.2 ARM的异常 ARM有7种异常1、复位 处理器上一旦有复位输入,ARM处理器立刻停止
19、执行当前指令。复位后,ARM处理器在禁止中断的管理模式下,从地址0 x00000000或0 xFFFF0000开始执行指令。2、未定义指令异常 当ARM处理器执行协处理器指令时,它必须等待任一外部协处理器应答后,才能真正执行这条指令。若协处理器没有响应,就会出现未定义指令异常。未定义指令异常可用于在没有物理协处理器(硬件)的系统上,对协处理器进行软件仿真,或在软件仿真时进行指令扩展。1.3 ARM异常 26.3、软件中断异常 该异常由执行SWI指令产生,可使用此机制进行软件仿真。4、预取中止(取指令存储器中止)若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信
20、号,但当预取的指令被执行时,才会产生指令预取中止异常。5、数据中止(访问数据存储器中止)若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。1.3 ARM异常 27.6、IRQ异常 当处理器的外部中断请求引脚有效,且CPSR中的I=0,产生IRQ异常。系统的外设可通过该异常请求中断服务。7、FIQ异常 当处理器的外部中断请求引脚有效,且CPSR中的F=0,产生FIQ异常。FIQ支持数据传送和通道处理,并有足够的私有寄存器,从而在应用中可避免对寄存器保存的需求,减少了开销。1.3 ARM异常 28.1.3.3 ARM异常中断响应过程 一、进入异常 当发生异常时,除了
21、复位异常立即中止当前指令外,处理器尽量完成当前指令,然后脱离当前的程序去处理异常。ARM处理器对异常中断的响应过程如下:1、保存返回地址 将引起异常指令的下一条指令的地址保存到新的异常模式x下的R14,即R14-中,使异常处理程序执行完后能正确返回原程序。2、保存当前状态寄存器CPSR的内容 将CPSR的内容保存到将要执行的异常中断对应的SPSR中,便于中断返回时恢复处理器当前的状态位、中断屏蔽位以及各条件标志位。1.3 ARM异常29.3、设置当前状态寄存器CPSR中的相应位设置CPSR模式控制位CPSR4:0,使处理器进入相应的执行模式;设置中断标志位(CPSR6=1),禁止IRQ中断;设
22、置中断标志位(CPSR7=1)禁止FIQ中断,当进入Reset或FIQ模式时。4、转去执行中断处理程序 取相应的中断向量给程序计数器PC,使程序开始执行中断处理程序。一般地说,矢量地址处将包含一条指向相应程序的转移指令,从而可跳转到相应的异常中断处理程序处执行异常中断处理程序。1.3 ARM异常30.1.3 ARM异常 ARM处理器对异常的响应过程可以用伪代码描述如下:R14_=return link SPSR_=CPSR CPSR4:0=exception mode number CPSR5=0 /*当运行于ARM状态时*/CPSR6=1 /*禁止新的IRQ中断*/if =Reset or
23、FIQ then CPSR7=1 /*当Reset 或FIQ异常中断时*/*禁止新 的FIQ中断*/PC=exception vector address 31.注意使用异常模式下的特有寄存器F 每个异常模式对应有两个寄存器R13_、R14_分别保存相应模式下的堆栈指针、返回地址;堆栈指针可用来定义一个存储区域保存其它用户寄存器,在程序初始化时应该对各种模式堆栈设置,便于随时使用。F FIQ模式还有额外的专用寄存器R8_fiqR12_fiq,使用这些寄存器可以加快快速中断的处理速度。1.3 ARM异常32.二、异常返回 1、异常返回应执行的操作 异常处理完毕之后,ARM微处理器会执行以下几步操
24、作从异常返回:将返回地址装入PC 把连接寄存器LR的值减去相应的偏移量,然后送到PC中。恢复CPSR的值 将SPSR复制回CPSR中。清除中断屏蔽位 若在进入异常处理时设置了中断禁止位,要在此清除。可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。1.3 ARM异常33.2、各种异常返回方法 FIQ中断返回不管是在ARM状态还是在Thumb状态下进入FIQ模式,FIQ处理程序均可以执行以下指令从FIQ模式返回:SUBS PC,R14-fiq,#4 指令预取中止(Abort)异常返回当指令预取访问存储器失败时,存储器系统向ARM处理器发出存储器中止(Abort)信
25、号,预取的指令被记为无效,但只有当处理器试图执行无效指令时,指令预取中止异常才会发生,如果指令未被执行,例如在指令流水线中发生了跳转,则预取指令中止不会发生。如果发生了指令预取中止异常,无论是在ARM状态还是Thumb状态,其返回指令为:SUBS PC,R14_abt,#4;重新执行被中止的指令1.3 ARM异常34.数据中止(Abort)异常返回如果发生了数据中止异常,无论是在ARM状态还是Thumb状态,其返回指令为:SUBS PC,R14_abt,#8重新执行被中止的指令软件中断指令(SWI)异常返回 用于进入管理模式,常用于请求执行特定的管理功能。软件中断处理程序执行以下指令可以从SW
26、I模式返回,无论是在ARM状态还是Thumb状态:MOVS PC,R14_svc 以上指令恢复PC(从R14_svc)和CPSR(从SPSR_svc)的值,并返回到SWI的下一条指令。1.3 ARM异常35.未定义指令异常返回 当ARM处理器遇到不能处理的指令时,会产生未定义指令异常。采用这种机制,可以通过软件仿真扩展ARM或Thumb指令集。处理器执行以下程序返回,无论是在ARM状态还是Thumb状态:MOVS PC,R14_und 以上指令恢复PC(从R14_und)和CPSR(从SPSR_und)的值,并返回到未定义指令后的下一条指令。1.3 ARM异常36.异常类型模式低向量地址 高向
27、量地址复位管理0 x000000000 xFFFF0000未定义指令未定义0 x000000040 xFFFF0004软件中断(SWI)管理0 x000000080 xFFFF0008预取中止(取指令存储器中止)中止0 x0000000C0 xFFFF000C数据中止(访问数据存储器中止)中止0 x000000100 xFFFF0010IRQ(中断)IRQ0 x000000180 xFFFF0018FIQ(快速中断)FIQ0 x0000001C0 xFFFF001CARM中断向量1.3.4 ARM中断向量和优先级 37.异常中断向量表1.3 ARM的异常 地 址异 常进入模式0 x0000,0
28、0000 x0000,0000复位管理模式0 x0000,00040 x0000,0004未定义指令未定义模式0 x0000,00080 x0000,0008软件中断管理模式0 x0000,000C0 x0000,000C中止(预取指令)中止模式0 x0000,00100 x0000,0010中止(数据)中止模式0 x0000,00140 x0000,0014保留保留0 x0000,00180 x0000,0018IRQIRQIRQIRQ0 x0000,001C0 x0000,001CFIQFIQFIQFIQ38.异常中断向量表说明:存储器的前8个字中除了地址0 x00000014之外,全部被用作异常矢量地址。这是因为在早期的26位地址空间的ARM处理器中,曾使用地址0 x00000014来捕获落在地址空间之外的load和store存储器地址。这些陷阱称为“地址异常”,因为32位的ARM不会产生落在它的32位地址空间之外的地址,所以地址异常在当前的体系结构中没有作用,0 x00000014的矢量地址也就不再使用了。1.3 ARM的异常 39.ARM中断的优先级1.3 ARM异常 优先级异 常1(最高)复位2数据中止3FIQ4IRQ5预取指令中止6(最低)未定义指令、SWI40.