版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第2章ARM体系结构硅谷芯微技术贡献网址:本章中,将着眼于ARM9内核、处理器状态与模式、内部寄存器、程序状态寄存器、异常、中断及其向量表和存储系统的学习,这是成为一个应用工程师必备的基础。本章中程序范例除非特别声明,否则处理器均处于ARM状态,执行字方式的ARM指令。第2章目录q1. ARM9TDMIq2. ARM的模块、内核和功能框图q3. ARM处理器状态q4. ARM处理器模式q5.ARM内部寄存器q6.当前程序状态寄存器q7. ARM体系的异常、中断及向量表q8. ARM体系的存储系统q9. 课后练习2.1 ARM9TDMIARM9TDMI是基于ARM体系结构v4版本的高端ARM核(
2、注意:核并非芯片,ARM核与其他部件(如RAM、ROM、片内外设)组合在一起才构成现实的芯片)。ARM9TDMI是从ARM7核发展而来的。ARM9TDMI后缀的涵义如下:T:支持高密度Thumb指令集扩展;D:支持片上调试;M:支持64位乘法指令;I:带Embedded ICE硬件仿真功能模块。ARM9TDMI-S是ARM9TDMI的可综合(synthesizable)版本(软核),对应用工程师来说,除非芯片生产厂商对ARM9TDMI-S进行了裁剪,否则在逻辑上ARM9TDMI-S与ARM9IDMI没有太大区别,其编程模型与ARM7TDMI一致。2.1.1 存储器的字与半字(1)ARM处理器使
3、用了冯·诺依曼(von Neumann)结构,提供单一的主存接口。比如ARM7处理器就是标准的冯·诺依曼(von Neumann)结构。而ARM9处理器的CPU/MMU/CACHE系统是指令和数据分开的,不过通常也还是提供单一的主存接口,因此ARM9处理器也可以看成是哈佛(Harvard)结构。从大的方面讲,无论哪种ARM处理器结构,都可以看成是是冯·诺依曼(von Neumann)结构,指令和数据共用一条32位总线,因此只有装载、存储和交换指令可以对存储器中的数据进行访问。ARM处理器直接支持8位字节、16位半字或者32位字的数据类型。其中,以能被4整除的地址开
4、始连续的4个字节构成1个字,字的数据类型为4个连续的字节。从偶数地址开始连续的2个字节构成一个半字,半字的数据类型为2个连续的字节。ARM指令的长度刚好是1个字,Thumb指令的长度刚好是一个半字。2.1.1 存储器的字与半字(2)如果一个数据是以字方式存储的,那么它就是字对齐的,否则就是非字对齐的。如果一个数据是以半字方式存储的,那么它就是半字对齐的,否则就是非半字对齐的,半字与字对齐的实际情况见表2.1。表2.1 半字与字对齐2.1.1 存储器的字与半字(3)注意:ARM处理器直接支持对齐的半字或字数据的存取,也就是可以使用一条相应的指令来实现对应操作(详见第三章)。如果访问非对齐的半字或
5、字数据,将需要多条指令组合才能实现对应的操作,这对程序的执行效率影响较大。因此,在C语言编程中,定义的多字节变量或结构体,最好使其为对齐存放。2.1.2 5级流水线(1)ARM处理器使用流水线来增加处理指令流的速度,这样可使几个操作同时进行,并使处理和存储器之间的操作更加流畅、连续,能提供1.1MIPS/MHz的指令执行速度。相比ARM7(3级流水线),ARM9增加了2个功能部件分别访问存储器并写回结果,且将读寄存器的操作转移到译码部件上,使流水线各部件在功能上更平衡。5级流水线如图2.1所示(其中PC为程序计数器),流水线使用5个阶段,因此指令分为5个阶段执行。取指:从存储器装载一条指令;译
6、码:识别将要被执行的指令;执行:处理指令,产生ALU运算结果或产生存储器地址(对于存储器访问指令来讲);访存:访问数据存储器;回写:将执行结果写回寄存器。2.1.2 5级流水线(2)图2.1 ARM9的5级指令流水线ARMPCPC-4PC-8PC-12PC-16ThumbPCPC-2PC-4PC-6PC-8从存储器取出指令对指令使用的寄存器进行译码,并从从寄存器组只能感读出寄存器产生ALU运算结果或产生存储器地址(对于存储器访问指令来讲)访问存储器将执行结果写回到寄存器2.1.2 5级流水线(3)在传统的80C51单片机中,处理器只有完成一条指令的读取和执行后,才会开始下一条指令的处理所以PC
7、总是指向正在“执行”的指令。而ARM9处理器采用5级流水线,具有5个工位,将指令的处理分为5个阶段,分别是取指、译码、执行、访存和回写。因此ARM“正在执行”第3条指令的同时对第4条指令进行译码,将第5条指令从存储器中取出,对第2条指令完成访存操作,对第1条指令完成回写操作。那么一条ARM9流水线只有在取第6条指令的时,第一条指令才算完成执行。也就是说,在流水线中同时存在5条指令,它们分别处于不同的处理阶段。下面用图2.2来进一步阐述5级流水线的处理机制,这样更加形象和具体。该图反映了处理器处于第三个周期时的PC指向。在执行“指令1”的同时对“指令2”进行译码,并将“指令3”从存储器中取出。也
8、就是说当“指令1”2.1.2 5级流水线(4)完成执行时,才开始对“指令4”的取指处理。由此可见,与PC有关的阶段只有取指、译码和执行,即执行PC-8处的指令的同时,对PC-4处的指令进行译码操作,对PC处的指令进行取指操作。而访存与回写则与PC无关。图2.2 ARM9的5级最佳流水线指令执行顺序指令1指令2指令3指令4PC-8PC-4PCPC+4时钟2.1.2 5级流水线(5)无论处理器处于何种状态,程序计数器R15(即PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第1条指令。因此,PC总
9、是指向第3条指令,或者说PC总是指向当前正在执行的指令地址再加2条指令的地址。当处理器处于ARM状态时,每条指令长为4字节,所以PC的值为正在执行的指令地址加8字节,即:PC值 = 当前程序执行位置 + 8字节当处理器处于Thumb状态时,每条指令长为2字节,所以PC的值为正在执行的指令地址加4字节,即:PC值 = 当前程序执行位置 + 4字节2.1.2 5级流水线(6)下面通过示例程序来进一步了解实际读取PC时要注意的问题,如程序清单2.1所示:程序清单2.1 PC的读取0x4000 ADD PC,PC,#4 ;正在被执行的指令,将地址值PC+4写到PC0x4004 . ;正在被译码的指令0
10、x4008 . ;正在被取指的指令,PC = 0x40080x400C . ;PC+4 = 0x400C假设地址0x4000上的ADD指令是处理器“正在执行”的第1条指令,该指令的功能是把PC+4的值放到PC寄存器里(通常用于程序跳转)。由于PC总是指向第三条指令,即0x4008就是“正在取指”的指令的地址,从而可以得出地址:PC+4 = 0x4008+4 = 0x400C,于是将地址值0x400C写入PC寄存器,千万不要误认为是写入地址值0x4004。2.1.2 5级流水线(7)注意:从上面的描述可以发现只有流水线被指令填满时才能发挥最大效能,即每时钟周期完成一条指令的执行(仅指单周期指令)
11、。如果程序发生跳转,流水线会被清空,这将需要几个时钟才能使流水线再次填满。因此,尽量少地使用跳转指令可以提高程序执行效率,解决方案就是尽量使用指令的“条件执行功能”,详见第三章。2.2 ARM的模块、内核和功能框图ARM的模块框图见图2.3,功能框图见图2.4,内核框图见图2.5。ARM模块包含了CPU协处理器接口信号、读与写数据总线(WDATA和RDATA)、Embedded ICE硬件仿真功能模块和片上调试系统等必备的功能。数据总线上没有双向路径,图2.3对这些作了简化。如图2.4所示,ARM微处理器与传统的8位单片机相比,在很多地方都有相似之处。例如,同样也包含了时钟、存储器接口、存储器
12、管理接口、总线控制、仲裁等基本功能模块;所不同的是增加了功能更加强大的协处理器接口、调试接口、同步的Embedded ICE-RT扫描调试访问接口等。图2.3 ARM模块框图DBGRNG(0)DBGRNG(1)DBGEXT(0)DBGEXT(1)LOCKWRITESIZE1:0PORT1:0TRANS1:0ADDR31:0WDATA31:0RDATA31:0协处理器接口信号DBGTCKENDBGTMSDBGnTRSTDBGTDIDBGTDO图2.4 ARM功能框图时中调式接口处理器接口储器管理接口储器接口步的Embedded ICE-RT扫描调试访问接口总图2.5 ARM内核框图ADDR31:
13、0CLKCLKENCFGBJGENCnIRQnFIQnRESETABORTLOCKWRITESIZE1:0PROT1:0TRANS1:0DBG输出DBG输入CP控制CP握手WDATA31:0RDATA31:02.3 ARM处理器状态嵌入式系统在某些应用场合对存储成本或空间要求比较苛刻,为了让用户更好地控制代码量,于是设计了2套指令系统,分别为ARM指令集和Thumb指令集。其中ARM指令集为32位(字)长度,具有最完整的功能;Thumb指令集为16位(半字)长度,能实现ARM指令集的大部分功能。在功能上可以认为Thumb是ARM指令集的子集(见图2.6),图2.6 两种指令集的关系但其却具有极
14、高的代码密度(平均缩减30%的代码量)。既然ARM处理器共存2种指令集,那么到底何时执行ARM指令集,何时执行Thumb指令集呢?ARM处理器有2个处理器状态与这2套指令集分别对应。以“当前程序状态寄存器CPSR”中的控制位T反映处理器正在操作的状态,即哪种指令集正在执行。当T=0时,处理器处于ARM状态,执行ARM指令;当T=1时,处理器处于Thumb状态,执行Thumb指令。由此可见,ARM处理器的2种操作状态分别为:ARM状态:32位,处理器执行字方式的ARM指令,处理器在系统上电时默认为ARM状态;Thumb状态:16位,处理器执行半字方式的Thumb指令。注意:ARM和Thumb状态
15、间的切换并不影响处理器模式或寄存器内容。只有当处理器处于ARM状态时,ARM指令集才有效,反之只能使用Thumb指令集。当处理器处于Thumb状态,处理器“只能”执行16位的Thumb指令;也就是说,无论处理器处于何种状态,ARM指令集与Thumb指令集不能同时混合使用。从一个ARM例程调用另一个Thumb例程时,内核必须切换状态,反之亦然。下面使用BX分支指令将ARM内核的操作状态在ARM和Thumb之间进行切换,见程序清单2.2。程序清单2.2 状态的切换;从ARM状态切换到Thumb状态CODE32 ;下面的指令为ARM指令LDR R0,=Lable+1 ;R0的bit0=1,BX自动将
16、CPSR中的T置1 BX R0 ;切换到Thumb状态,并跳转到Lable处执行 CODE16 ;下面的指令为Thumb指令Lable MOV R1,#12;从Thumb状态切换到ARM状态CODE16 ;下面的指令为Thumb指令LDR R0,=Lable ;R0的bit0=0,BX自动将CPSR中的T置0 BX R0 ;切换到ARM状态,并跳转到Lable处执行 CODE32 ;下面的指令为ARM指令Lable MOV R1,#10注意:BX指令是在程序跳转的同时进行状态切换。前面提到,在程序发生跳转时流水线会被清空,所以使用BX指令进行状态切换后,流水线中按原来处理器状态进行取指和译码的
17、指令(与当前处理器状态不符的指令)会被清除,也就不会引起处理器的错误。在第三章会介绍一条可以直接修改CPSR/SPSR寄存器的“MSR写状态寄存器指令”,通过它来修改T位可以实现状态切换;但是,因为它不会清空流水线,所以这种方法是不安全的。因此强烈推荐使用BX指令进行安全的状态切换。2.4 ARM处理器模式ARM处理器共支持7种处理器模式,并以当前程序状态寄存器CPSR中的控制位M4:0反映处理器正在操作的模式,如表2.2所列。除了用户(user,usr)模式之外的其他6种处理器模式称之为特权(privileged)模式,它们分别是系统(system,sys)模式和异常模式。其中,管理(sup
18、ervisor,svc)模式、中止(abort,abt)模式、未定义(undefined,und)模式、中断(interrupt request,irq)模式及快速中断(fast interrupt request,irq)模式都是异常模式。只有在特权模式下才允许对当前程序状态寄存器(CPSR)的所有控制位直接进行读/写访问,而在非特权模式下只允许对CPSR的控制位进行间接访问(SWI方式)。表2.2 ARM处理器模式2.4.1异常模式(1)管理模式、中止模式、未定义模式、中断模式和快速中断模式这5种处理器模式统称之为异常模式。通过程序修改CPSR可以进入异常,程序清单2.3就是从系统模式切换
19、到管理模式的示例。除此之外,也可以在内核对异常或者中断响应时由硬件切换到异常模式。程序清单2.3 从系统模式切换到管理模式MSR CPSR_c,# (NoInt | SVC32Mode) /从系统模式切换到管理模式注意:当一个异常发生时,处理器总是切换到ARM状态而非Thumb状态。2.4.1异常模式(2)每一种异常与处理器的一种模式相对应,一旦应用程序发生特定的异常中断时,处理器便进入相应的异常模式,处理器内核立即跳转到向量表中的某个入口地址,执行相应的处理程序。与此同时,在每一种异常模式中都有对应的寄存器,供相应的异常处理程序使用,从而可以保证处理器在进入异常模式时,用户模式下的寄存器不被
20、破坏。究竟何时进入异常模式,具体规定如下:处理器复位之后进入管理模式,操作系统内核通常处于管理模式;当处理器访问存储器失败时,进入数据访问中止模式;当处理器遇到不支持的指令时,进入未定义模式;中断模式与快速中断模式分别对ARM处理器两种不同级别的中断作出响应。2.4.2 系统模式用户模式是程序正常运行的工作模式。系统模式与用户模式具有完全相同的寄存器,由于系统模式是一种特权模式,因此可以访问所有的系统资源,也可以直接进行处理器模式切换;但系统模式主要供操作系统的任务使用,允许对CPSR进行读/写访问。通常操作系统的任务需要访问所有的系统资源,有了系统模式,操作系统就可以访问用户模式下相应的寄存
21、器了,而不是使用异常模式下相应的寄存器,这样就可以保证当异常中断发生时任务的状态不被破坏。注意:用户模式与系统模式不能由异常进入,也就是说要想进入系统模式,必须通过修改CPSR才能实现,程序清单2.4就是从管理模式切换到系统模式的示例。程序清单2.4 从管理模式切换到系统模式MSR CPSR_c,# (NoInt | SYS32Mode) /从管理模式切换到系统模式2.5 ARM内部寄存器在ARM处理器内部共有37个用户可访问的32位寄存器,其中有6个32位宽的状态寄存器目前只使用了其中12位。37个寄存器分别为:31个通用32位寄存器:R0 R15、R13_svc、R14_svc、R13_a
22、bt、R14_abt、R13_und、R14_und、R13_irq、R14_irq、R8_fiq、R9_fiq、R10_fiq、R11_fiq、R12_fiq、R13_fiq、R14_fiq;6个状态寄存器:CPSR、SRSR_svc、SPSR_abt、SPSR_und、SPSR_irq、SPSR_fiq。注意:这些寄存器不能在同一时间同时被访问,究竟何时才能访问上述寄存器完全取决于处理器状态和处理器模式。2.5.1 ARM状态下的寄存器(1)(1)各种模式下实际访问的寄存器:寄存器文件包含了程序员实际能访问的所有寄存器,但是究竟哪些寄存器对程序员来说当前是可用的,则完全取决于当前的处理器模
23、式。因此,在各种处理器模式下,程序员实际能访问的寄存器的权限是完全不一样的。在ARM状态中,可在任何时候同时访问R0 R15这16个通用寄存器和1个或2个状态寄存器(CPSR和SPSR)。用户模式与系统模式具有完全相同的寄存器,其中R0 R7为所有模式所共享的通用寄存器。具有特殊用途的寄存器R13(堆栈指针SP)、R14(链接寄存器LR)、R15(程序计数器PC)尽管也可以作为通用寄存器来使用,但由于程序编译器通常认为R13始终指向一个有效的堆栈结构,所以一定要注意将R13当作通用寄存器来使用是非常危险的。在特权模式中,可以访问与2.5.1 ARM状态下的寄存器(2)模式相关的寄存器组,如表2
24、.3所列为每种模式所能访问的寄存器。表2.3 ARM状态各种模式下的寄存器2.5.1 ARM状态下的寄存器(3)注意:括号内为ATPCS中寄存器的命名,可以使用Rn汇编伪指令将寄存器定义多个名字。其中,ADS1.2的汇编程序直接支持这些名称,但注意a1a4、v1v8必须用小写字母。2.5.1 ARM状态下的寄存器(4)(2)一般的通用寄存器:寄存器R0 R7为保存数据或地址值的通用寄存器,这是因为在任何处理器模式下,R0 R7 中的每一个寄存器都是同一个32位物理寄存器。寄存器R0 R7是完全通用的寄存器,不会被体系结构作为特殊的用途,并且可用于任何使用通用寄存器的指令。寄存器R8 R14所对
25、应的物理寄存器取决于当前的处理器模式,几乎所有允许使用通用寄存器的指令都允许使用寄存器R8 R14。寄存器R8 R12有2组不同的物理寄存器,如表2.4所列。其中,一组用于除FIQ模式之外的所有寄存器模式(R8 R12),另一组用于FIQ模式(R8_fiq R12_fiq)。在进入FIQ模式后就不必为保护寄存器而浪费时间,程序可以直接使用R8_fiq R12_fiq来执行操作了,从而实现快速的中断处理。2.5.1 ARM状态下的寄存器(5)寄存器R13和R14分别有6个不同的物理寄存器,其中的一个是用户模式和系统模式共用的,其余的5个分别对应于其他5种异常模式。表2.4 分组寄存器2.5.1
26、ARM状态下的寄存器(6)(3)堆栈指针R13(SP):严格来说,“堆栈”实际上是指“堆”和栈,这是两个不同的概念,但是为了符合通常的表述习惯,在以后的内容中如果没有特别指出,堆栈一词仅表示“栈”的意思。堆栈是在内存中划分出的一段存储空间,这个存储空间就像是一个大的数据仓库,用于暂时保存一些数据。堆栈操作通常会发生在子程序调用、异常发生或是程序运行过程中寄存器数量不够时。在前两种情况下,通常是把子程序或者异常服务程序将要用到的寄存器内容保存到堆栈中。在子程序或者异常处理程序结束返回时再将保存在堆栈中的值重载到相应的寄存器中,这样便可确包原有的程序状态不会被破坏。还有一种情况是,如果程序运行过程
27、中,局部变量的数量太多,以至于处理器内部的寄存器无法全部装下2.5.1 ARM状态下的寄存器(7)时,程序员或者编译器会使用堆栈来作为数据暂存空间,将暂时未用到的数据压栈处理,当需要用到时再取出来。通常称堆栈指针指向的存储单元为“栈顶”,而堆栈区域中保存第一个堆栈数据的存储单元被称之为“栈底”。如果把堆栈比作是一个水桶,那么桶底就相当于栈底,而桶中的水面就相当于栈顶。在ARM处理器只能感通常将寄存器R13作为堆栈指针(SP),用于保存堆栈的出入口处地址。ARM处理器一共有6个堆栈寄存器,其中用户模式和系统模式共用一个,每种异常模式都有专用的R13寄存器。它们通常指向各模式所对应的专用堆栈,也就
28、是说ARM处理器允许用户程序有6个不同的堆栈空间。这些堆栈指针分别为R13、R13_svc、R13_abt、R13_und、R13_irq、R13_fiq,如表2.5所列。2.5.1 ARM状态下的寄存器(8)表2.5 堆栈指针ARM处理器的堆栈操作具有非常大的灵活性,根据堆栈指针的增减方向和指针指向的存储单元是否为空,共有4种堆栈方式:满递增、空递增、满递减和空递减。2.5.1 ARM状态下的寄存器(9)(4)链接寄存器R14(LR):寄存器R14也称为链接寄存器(LR),子程序的返回地址将自动地存入到R14中。每种异常模式都有专用的R14寄存器用于保存子程序返回地址,它们分别是R14、R1
29、4_svc、R14_abt、R14_und、R14_irq、R14_fiq,如表2.6所列。表2.6 链接寄存器2.5.1 ARM状态下的寄存器(10)在结构上R14有2种特殊功能:当使用BL指令调用子程序时,返回地址将自动存入R14中。在子程序结束时,将R14复制到程序计数器PC中实现子程序的返回。通常有2种方式实现子程序的返回操作。执行下列任何一条指令:MOV PC,LRBX LR在子程序入口,使用STMFD指令将R14和其他寄存器的内容保存到堆栈SP中:STMFD SP!, <registers>, LR2.5.1 ARM状态下的寄存器(11)在子程序结束时,使用批量寄存器读
30、取指令LDMFD,将返回地址从堆栈中复制到程序计数器PC中,即可实现子程序的返回。LDMFD SP!, <registers>, PC当发生异常中断时,应注意保证异常处理程序不会破坏LR,因为LR保存的是异常处理程序的返回地址,即将异常处理程序的返回地址保存到LR对应的异常模式寄存器中。异常处理程序完成后的返回是通过将LR的值写入PC,同时从SPSR寄存器中恢复CPSR来实现的。寄存器R14在其他任何时候可作为一个通用寄存器。2.5.1 ARM状态下的寄存器(12)(5)程序计数器R15(PC):寄存器R15保存程序计数器(PC),也就是说,R15总是指向正在“取指”的指令。读R1
31、5:由于ARM指令是字对齐的,PC值的结果bit1:0总为0。当使用STR或STM指令保存R15时,R15保存的可能是当前指令地址加8字节,后者是当前指令地址加12字节(将来还可能出现别的数据)。偏移量究竟是8还是12(或是其他数值)取决于ARM的芯片设计。对于某个具体的芯片,它是个常量。由于上述原因,最好避免使用STR和STM指令来保存R15,否则会影响程序的可移植性。如果确实很难做到,那么应当在程序中使用一些合适的指令代码来确定当前使用的芯片所使用的便移量。例如,使用程序清单2.5.1 ARM状态下的寄存器(13)2.5所示的指令代码将这个偏移量存入R0中。程序清单2.5 测试具体芯片关于
32、存储PC时的偏移量SUB R1, PC, #4 ;R1存放下面STR指令的地址STR PC, R0 ;保存“STR指令地址+便移量”到R0中LDR R0, R0 ;然后重装SUB R0, R0, R1 ;计算偏移量=PC-STR地址写R15:当执行一条写R15的指令时,写入R15的正常结果值被当成一个指令地址,程序从这个地址处继续执行(相当于执行一次无条件跳转)。由于ARM指令是字对齐的,写入R15值的结果bit1:0必须为0b00,否则结果将不可预测。在Thumb指令集中,指令是半字对齐的,处理器将忽略bit0,即写入R15的地址值必须首先与“0xFFFF FFFE”做“与”操作再写入R15
33、当中。2.5.1 ARM状态下的寄存器(14)(6)CPSR与SPSR:所有模式全部共享一个程序状态寄存器CPSR,ARM内核就是通过使用CPSR来监视和控制内部操作的。在异常模式中,允许访问用于保存CPSR当前值的备份程序状态寄存器SPSR,每种异常都有对应的SPSR,它们分别是SPSR_svc、SPSR_abt、SPSR_und、SPSR_irq、SPSR_fiq,如表2.7所列。表2.7 CPSR与SPSR状态寄存器2.5.1 ARM状态下的寄存器(15)注意:由于用户模式和系统模式不是异常中断,所以它们没有SPSR。因此用户模式和系统模式不要访问SPSR,否则将会产生不可预知的结果。除
34、用户模式之外,每一种处理器模式都可以通过改写CPSR中的模式位来改变。除用户模式和系统模式共用一组分组寄存器之外,所有处理器模式都有一组自己的分组寄存器。如果改变处理器的模式,新模式的分组寄存器将取代原来模式的分组寄存器组。例如,当处理器处于中断模式时,执行的指令可访问的名字仍然是R13和R14寄存器,但实际上是访问分组寄存器R13_irq和R14_irq,而用户模式下的R13_usr和R14_usr不会受到任何影响,程序仍然可以正常访问R0 R12寄存器。2.5.1 ARM状态下的寄存器(16)CPSR与SPSR相互之间的关系:当一个特定的异常中断发生时,将CPSR的当前值保存到相应异常模式
35、下的SPSR,然后设置CPSR为相应的异常模式;从异常中断程序退出返回时,可通过保存在SPSR中的值来恢复CPSR。2.5.1 ARM状态下的寄存器(17)注意1:当通过程序直接改写CPSR来切换模式时,CPSR不会被保存到SPSR,因此只有发生异常或者中断时,才需要将CPSR备份到SPSR。注意2:根据ATPCS规定(规定了子程序间调用的基本规则),子程序中的局部变量使用内部寄存器R4R11来保存(Thumb状态为R4R7,如果寄存器不够用则存放在内存中)。因为这些寄存器都是32位的,所以程序处理32位长度的变量时效率最高。如果把局部变量定义为8位或者16位,它们也独占着一个32位寄存器,非
36、但没有减少寄存器的使用量,还会导致编译器使用额外的指令来限定变量的内容。比如,使用“与”指令来屏蔽32位寄存器中的高位。因此,在定义局部变量时请尽量定义为32位长度的,比如用于循环计数的变量。2.5.2 Thumb状态下的寄存器(1)(1)各种模式下实际访问的寄存器:Thumb状态寄存器集是ARM状态集的子集,程序可直接访问:8个通用寄存器(R0R7);程序计数器(PC);堆栈指针(SP);链接寄存器(LR);程序状态寄存器(CPSR);每个特权模式都有分组的SP和LR,Thumb寄存器的详细情况见表2.8。2.5.2 Thumb状态下的寄存器(2)表2.8 Thumb状态各种模式下的寄存器注
37、意:括号内为ATPCS中寄存器的命名,可以使用Rn汇编伪指令将寄存器定义多个名字。其中,ADS1.2的汇编程序直接支持这些名称,但注意a1a4、v1v8必须用小写字母。2.5.2 Thumb状态下的寄存器(3)(2)一般的通用寄存器:在汇编语言中寄存器R0 R7为保存数据或地址值的通用寄存器,对于任何处理器模式,它们中的每一个都对应于相同的32位物理寄存器。它们是完全通用的寄存器,不会被体系结构做为特殊的用途,并且可用于任何使用通用寄存器的指令。2.5.2 Thumb状态下的寄存器(4)(3)堆栈指针SP:堆栈指针SP对应ARM状态的寄存器R13,Thumb指令集带有传统的PUSH和POP指令
38、用于堆栈操作处理,它们以“满递减堆栈”的方式来实现,详见2.5.1小节关于“堆栈指针R13”部分和第三章指令集部分内容。2.5.2 Thumb状态下的寄存器(5)(4)链接寄存器LR:链接寄存器LR对应ARM状态寄存器R14,在结构上有2种功能,详见2.5.1小节关于“链接寄存器R14”部分。2.5.2 Thumb状态下的寄存器(6)(5)ARM状态寄存器与Thumb状态寄存器之间的关系:ARM状态寄存器与Thumb状态寄存器有如下的关系:Thumb状态R0 R7与ARM状态R0 R7相同。Thumb状态CPSR(无SPSR)与ARM状态CPSR相同。由于Thumb指令集不包含MSR和MRS指
39、令,如果用户需要修改CPSR的任何标志位,必须回到ARM模式。通过BX和BLX指令来改变指令集模式,而且当完成复位(Reset)或者进入到异常模式时,将会被自动切换到ARM状态。注意:所有的异常处理都是在ARM状态下执行的,在Thumb状态下,如果有任何中断或者异常标志出现,那么处理器就会自动切换到ARM状态去进行异常处理,当异常处理完毕返回时,处理器又会自动切换返回到Thumb状态,状态切换过程如图2.7所示。2.5.2 Thumb状态下的寄存器(7)图2.7 状态切换过程异Thumb状态SP映射到ARM状态R13;Thumb状态LR映射到ARM状态R14;Thumb状态PC映射到ARM状态
40、R15(PC)。2.5.2 Thumb状态下的寄存器(8)这些关系入图2.8所示。图2.8 Thumb寄存器在ARM状态寄存器上的映射Thumb状态注意:寄存器R0R7为低端寄存器,寄存器R8R12为高端寄存器。2.5.2 Thumb状态下的寄存器(9)(6)Thumb状态中访问高端寄存器:Thumb指令集并不能访问寄存器机构中的所有寄存器,但所有数据处理处理指令都可以访问R0 R7;然而,可以对R8 R12访问的指令只有以下几条,它们分别为MOV、ADD、CMP。可以使用MOV指令的特殊变量将一个值从低端寄存器(R0 R7)转移到高端寄存器,或者从高端寄存器转移到低端寄存器。CMP指令可用于
41、比较高端寄存器和低端寄存器的值。ADD指令可用于将高端寄存器的值与低端寄存器的值相加。2.6 当前程序状态寄存器ARM内核包含1个CPSR和5个仅供异常处理模式使用的SPSR。由于所有模式全部共享一个程序状态寄存器CPSR,因此处理器所有的状态全部都保存在CPSR中,也就是说ARM内核是通过CPSR来监视和控制内部操作的。每种异常模式都有一个对应的程序状态保存寄存器SPSR,用于保存任务在异常发生之前的CPSR状态的当前值,CPSR和SPSR可以通过特殊指令进行访问,详细的信息将在第三章介绍。图2.9给出了CPSR的基本格式,CPSR具体含义如下:4个条件代码标志(负标志N、零标志Z、进位标志
42、C和溢出标志V);2个中断禁止位(IRQ禁止与FIQ禁止);5个对当前处理器模式进行编码的位(M4 : 0);1个用于指示当前执行指令状态的位(ARM指令还是Thumb指令)。图2.9 程序状态寄存器的格式条件代码标志保留控制位注意:为了保持与将来的ARM处理器兼容,并且作为一种良好的习惯,在更改CPSR时,建议使用读修改写的方法。2.6.1 条件代码标志(1)大多数数值处理指令可以选择是否修改条件代码标志。一般地,如果指令带S后缀,则指令会修改条件代码标志;但有一些指令总是改变条件代码标志。N、Z、C和V位都是条件代码标志,可以通过算术和逻辑操作来设置这些位。这些标志还可通过MSR和LDM指
43、令进行设置。ARM处理器对这些位进行测试以决定是否执行一条指令,这样就可以不用程序跳转也能实现条件执行。各标志位的含义如下:负标志N:运算结果的第31位值。对于有符号二进制补码,结果为负数时,N=1;结果为正数或零时,N=0;零标志Z:指令结果为0时,Z=1(通常表示比较结果“相等”);否则,Z=0;2.6.1 条件代码标志(2)进位标志C:使用加法运算(包括CMN指令),b31位产生进位时,C=1;否则C=0。使用减法运算(包括CMP指令),b31位产生借位时,C=0;否则,C=1。对于结合移位操作的非加法/加法指令,C为b31位最后的移出值,其他指令C通常不变;溢出标志V:使用加法/减法运
44、算,当发生有符号溢出时,V=1;否则V=0。其他指令V通常不变。在ARM状态中,所有指令都可按条件来执行。在Thumb状态中,只有分支指令可条件执行。2.6.2 控制标志位(1)CPSR的最低8位为控制位,它们分别是:中断禁止位I和F;处理器状态位T;处理器模式位M0M4。当发生异常时,控制位改变。当处理器在一个特权模式下操作时,可用软件操作这些位。(1)中断禁止位:标志位I和F都是禁止标志位,用来使能或禁止ARM的2种外部中断源。以后可以看到,所有S3C2440的外设都会与这2条中断线线相连。针对这2位编程时应当格外小心。为了禁止任一个中断源,该位必须设置为1而不是想象中的0。具体设置如下:
45、当控制位I置位时,IRQ中断被禁止,否则允许IRQ中断使能;当控制位F置位时,FIQ中断被禁止,否则允许FIQ中断使能。2.6.2 控制标志位(2)注意:当I或者F控制位为0时,则允许IRQ或者FIQ中断(使能),即CPU内核可以响应中断了。那么到底需要满足什么条件,CPU才能响应外设中断?到底需要满足什么条件,CPU外设才能产生中断?这里的关键词是“响应中断”、“响应外设中断”与“产生中断”,具体的内容可以参考中断相关章节。在后面的学习中将会了解到,以中断为主线贯穿整个CPU渗透到各个功能不见,起到了极其重要的纽带作用,由内核到外设以中断为主干线、外设为枝构成“中断关联多叉树”,这是学习和设
46、计ARM嵌入式应用系统的关键所在,希望能够引起大家的关注。剩下的问题比较简单,那就是如何使用外设。显而易见,只要抓住了中断和外设的使用,一切问题将迎刃而解。2.6.2 控制标志位(3)(2)控制位T:控制位T反映了正在操作的状态:当控制位T置位时,处理器正在Thumb状态下运行;当控制位T清零时,处理器正在ARM状态下运行。注意:绝对不要强制改变CPSR寄存器中的控制位T。如果这样做,处理器会进入一个无法预知的状态。2.6.2 控制标志位(4)(3)模式控制位:M4、M3、M2、M1和M0位(即M4:0)都是模式控制位,这些位决定处理器的操作模式,见表2.9。不是所有模式位的组合都定义了有效的
47、处理器模式,因此不要使用表中没有列出的组合。表2.9 CPSR模式位值注意:如果将非法值写入M4 : 0中,处理器将进入一个无法恢复的模式。2.6.3 保留位CPSR中的保留位被保留,以便将来使用。当改变CPSR标志和控制位时,请确认没有改变这些保留位。另外,请确保程序不依赖于包含特定值的保留位,因为将来的处理器可能会将这些位设置为1或者0。2.7 ARM体系的异常、中断及其向量表只要正常的程序被暂时中止,处理器就进入异常模式。例如,在用户模式下执行程序时,外设向处理器内核发出中断请求,将导致内核从用户模式切换到异常中断模式。如果同时发生两个或更多异常,那么将按照固定的顺序来处理异常。详见2.
48、7.3小节。2.7.1 异常入口/出口汇总如表2.10所列为异常退出以及退出异常处理程序所推荐使用的指令。表2.10 异常入口/出口指令汇总注意:“MOVS PC,R14_svc”是指在管理模式下执行“MOVS PC,R14”指令。同样类似的指令还有“MOVS PC,R14_und”、“SUBS PC,R14_abt,#4”等。2.7.2 异常向量表(1)如表2.11所列为异常向量地址一览表。其中,I和F表示先前的值。每种处理器操作模式都有一个相关联的中断向量,当一个异常发生时,ARM将改变模式,而程序计数器PC将会被强行指向异常向量。异常向量表从地址0的复位向量开始,然后每4个字节就是一个异
49、常向量。表2.11 异常向量地址一览表2.7.2 异常向量表(2)在异常向量表中有一个保留的异常入口,其位于0x0000 0014地址处。这个位置在早期的ARM结构中会被用到,而在ARM9中则是保留的。以确保软件能与不同的ARM结构兼容。注意:在发生异常后,为了让ARM内核可以转移到对应的中断服务程序上,必须在异常入口地址(0x000x1C)处放置一些跳转指令。这些指令组成的一段代码,称之为“异常向量表”。2.7.3 异常优先级(1)当多个异常同时发生时,一个固定的优先级系统决定它们被处理的顺序,见表2.12。表2.12 异常优先级下面介绍有些异常不能同时发生:由于未定义指令与SWI优先级相同
50、,所以未定义的指令和SWI不能同时发生,也就是说正在执行的指令不可能既是一条未定义的指令,又是一条SWI指令;2.7.3 异常优先级(2)在一个数据中止处理程序中,由于没有禁止FIQ异常中断,所以可以发生FIQ异常。当FIQ使能,并且在发生FIQ的同时产生了一个数据中止时,ARM内核进入数据中止处理程序,然后立即转到FIQ向量。当FIQ服务完成之后,恢复执行数据中止处理程序。2.7.4 异常中断的进入与退出(1)当多个异常同时发生时,一个固定的优先级系统决定它们被处理的顺序,见表2.12。(1)进入异常:当一个异常导致模式切换时,内核自动地做如下处理:将当前PC保存到相应异常模式下的LR,异常
51、处理程序完成后的返回可通过将LR的值减去偏移量以得到异常处理程序返回地址,然后写入PC;将CPSR的当前值保存到相应异常模式下的SPSR,异常处理程序完成后的返回可通过保存在SPSR中的值来恢复CPSR;设置CPSR为相应的异常模式;设置PC为相应异常处理程序的中断入口向量地址,跳转到相应的异常中断处理程序执行。ARM内核在中断异常时置位中断禁止控制位,这样可防止不受控制的异常嵌套。2.7.4 异常中断的进入与退出(2)注意:异常总是在ARM状态中进行处理,当处理器处于Thumb状态时发生了异常,在异常向量地址装入PC时,会自动切换到ARM状态。2.7.4 异常中断的进入与退出(3)(2)退出
52、异常:当异常处理程序结束时,异常处理程序必须执行如下操作:返回到发生异常中断的指令的下一条指令处执行,也就是说,将LR中的值减去偏移量后移入PC,偏移量根据异常的类型而有所不同,见表2.10;将SPSR的值复制回CPSR;在入口处置位的置位的中断禁止控制位清零。注意:恢复CPSR的动作会将控制位T、F和I自动恢复为异常发生前的值。2.7.5 复位异常当nRESET信号被拉低时(一般外部复位引脚电平的变化和芯片其他复位源会改变这个内核信号),ARM处理器放弃正在执行的指令。当nRESET信号再次变为高电平时,ARM处理器执行以下操作:强制M4 : 0变为b100011,系统进入管理模式;将CPS
53、R中的控制位I和F置位,IRQ和FIQ中断禁止;将CPSR中的控制位T清零,处理器处于ARM状态;强制PC从地址0x00开始对下一条指令进行取指;返回到ARM状态并恢复执行。在系统复位后,进入管理模式对系统初始化。复位后,除PC和CPSR之外的所有寄存器的值都是随机的。2.7.6 中断请求异常IRQ (1)只有当CPSR中相应的中断屏蔽被清除时,才可能发生中断请求(IRQ)异常,IRQ异常是一个由nIRQ输入端的低电平所产生的正常中断。当一个IRQ异常中断发生时,内核切换到中断模式,表明产生了中断。内核自动地做如下处理:将异常处理程序的返回地址保存到异常模式下的R14(R14_irq或者LR)
54、中。如图2.11所示,由于ARM处理器的5级流水线结构,当异常发生时,程序计数器PC总是指向返回位置的下一条指令即第3条指令,也就是说异常处理程序的正确返回地址为PC-4,且在PC-8的地址处发生异常中断服务程序跳转,由此可见,R14(R14_irq或者LR)保存的是指向第3条指令的程序计数器PC(地址),即“中断返回地址+4”。2.7.6 中断请求异常IRQ (2)图2.11 中断和返回指令指令1指令2指令3指令4PC-8PC-4PCPC+4时钟该指令的执行不会中断。异常程序结束时返回到该指令。进入中断服务程序时,该指令地址被保存在R14中。用户模式的CPSR被保存到新的IRQ中断异常模式S
55、PSR_irq中。2.7.6 中断请求异常IRQ (3)修改CPSR。将I位置1,禁止新的IRQ中断产生,但是不限制FIQ中断的发生(F位保持原有状态)。清零T标志位,CPU进入ARM状态。修改模式位,设置为IRQ模式,此时用户模式下的R13和R14将不可操作,而IRQ模式下的R13和R14变为可操作,即R13_irq保存IRQ中断模式的堆栈指针,R14_irq保存了“IRQ中断返回地址+4”。设置IRQ模式下的PC为IRQ异常处理程序的中断入口向量地址,在IRQ模式下,该向量地址为0x0000 0018。由用户模式进入IRQ异常模式的流程示例如图2.12所示,按照上述说明完成步流程后,软件处理程序开始执行,并且调用适当的中断服务程序来为中断源服务。2.7.6 中断请求异常IRQ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 热硫化硅橡胶生产工成果转化模拟考核试卷含答案
- 特种动物养殖员安全理论能力考核试卷含答案
- 玻纤制品后处理工安全培训效果知识考核试卷含答案
- 锁具装配工常识模拟考核试卷含答案
- 露天采矿吊斗铲司机岗中班组协作考核试卷含答案
- 丙烯腈装置操作工工作改进强化考核试卷含答案
- 电切削工岗前生产安全技能考核试卷含答案
- 道路客运乘务员诚信水平考核试卷含答案
- 民间工艺品艺人技术传承模拟考核试卷含答案
- 绘图仪器制作工安全生产能力模拟考核试卷含答案
- 2026年会展运营(运营管理技巧)试题及答案
- 2026中国新能源汽车热管理系统技术发展现状及趋势
- 2025天津一中高一入学语文分班考试真题含答案
- 2026-2030中国便携式肺功能仪行业需求规模与前景动态预测报告版
- 基层医疗卫生机构急重患者判断及转诊技术标准(WS-T 810-2022)
- 2026年度实验室管理评审附新版《评审准则》内审检查表
- 2026年高考高校招收华侨港澳台生化学试卷试题(含答案详解)
- 2026年公立医院行政后勤招聘试题及答案解析
- 2025年平顶山工业职业技术学院辅导员招聘笔试试题及答案解析
- 高中数学知识点总结 第十三、四章极限与导数
- 2026西藏阿里地区革吉县人力资源和社会保障局(医疗保障局)补聘基层劳动就业社会保障公共服务平台工作人员1人备考题库及参考答案详解【满分必刷】
评论
0/150
提交评论