ARM体系结构研讨_第1页
ARM体系结构研讨_第2页
ARM体系结构研讨_第3页
ARM体系结构研讨_第4页
ARM体系结构研讨_第5页
已阅读5页,还剩152页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、体系结构体系结构 :从用户角度看到的计算机属性,计算机的指令集、可见寄存器、存储器管理单元和异常处理模式都是体系结构的一部分。 q THUMB指令是ARM指令的子集q 可以相互调用,只要遵循一定的调用规则q Thumb指令与ARM指令的时间效率和空间效率关系为: 存储空间约为ARM代码的6070 指令数比ARM代码多约3040 存储器为32位时ARM代码比Thumb代码快约40 存储器为16位时Thumb比ARM代码快约4050 使用Thumb代码,存储器的功耗会降低约30进入Thumb状态:F 当操作数寄存器Rm的状态位bit0为1时,执行BX Rm指令进入 Thumb状态F 所有的异常都是

2、再ARM状态下进行,如果处理器在Thumb状态进入异常,则当异常处理(IRQ,FIQ,Undef,Abort和SWI)返回时,自动切换到Thumb状态。 使用BX指令将ARM7TDMI内核的操作状态在ARM状态和Thumb状态之间进行切换(程序如下所示。;从Arm状态切换到Thumb状态 LDR R0,=Lable+1 BX R0;从Thumb状态切换到ARM状态 LDR R0,=Lable BX R0地址最低位为1,表示切换到Thumb状态地址最低位为0,表示切换到ARM状态跳转地址标号两种工作状态存在的问题nARM 状态,指令均是32 位的,性能高。nThumb 状态下,指令均是16 位的

3、,代码密度提高了一倍。nThumb 状态下的指令功能只是ARM 下的一个子集,结果可能需要更多条的指令去完成相同的工作,导致处理性能下降。一般的解决方法n混合编程:arm与thumb结合。n不足:两个方面n1:时间额外开销n2,ARM 代码和Thumb 代码需要以不同的方式编译,这也增加了软件开发管理的复杂度。Cortex m3的解决方法n采用thumb-2指令集,混合32/16位指令,不支持arm状态,只支持thumb状态n减小了状态切换的额外开销,节省了 执行时间和指令空间。n不再需要把源代码文件分成按ARM 编译的和按Thumb 编译的,软件开发的管理大大减负。n无需再反复地求证和测试:

4、究竟该在何时何地切换到何种状态下,我的程序才最有效率。开发软件容易多了ARM技术基础技术基础FARM处理器工作状态处理器工作状态 FARM处理器工作模式处理器工作模式 FARM寄存器组成寄存器组成 FARM的异常中断的异常中断 ARM处理器工作模式处理器工作模式F ARM7处理器共支持所列的7种处理器模式见下表F 表中给出了CPSR4:0与七种工作模式的关系以及各种模式的解释。CPSR4:0模式模式用途用途可访问的寄存器可访问的寄存器10000用户用户正常用户模式,正常用户模式,程序正常执行模式程序正常执行模式PC,R14R0,CPSR10001FIQ处理快速中断处理快速中断,支持高速数支持高

5、速数据传送或通道处理据传送或通道处理PC,R14_fiqR8_fiq,R7R0,CPSR,SPSR_fiq10010IRQ处理普通中断处理普通中断PC,R14_irqR13_fiq,R12R0,CPSR,SPSR_irq10011SVC操作系统保护模式操作系统保护模式处理软件中断(处理软件中断(SWI)PC,R14_svcR13_svc,R12R0,CPSR,SPSR_svc10111中止中止处理存储器故障、实现虚处理存储器故障、实现虚拟存储器和存储器保护拟存储器和存储器保护PC,R14_abtR13_abt,R12R0,CPSR,SPSR_abt11011未定义未定义处理未定义的指令陷阱,处

6、理未定义的指令陷阱,支持硬件协处理器的软件支持硬件协处理器的软件仿真仿真PC,R14_undR13_und,R12R0,CPSR,SPSR_und11111系统系统运行特权操作系统任务运行特权操作系统任务PC,R14R0,CPSR处理器模式说明备注 用户 (usr)正常程序工作模式不能直接切换到其它模式 系统 (sys)用于支持操作系统的特权任务等与用户模式类似,但具有可以直接切换到其它模式等特权 快中断 (fiq)支持高速数据传输及通道处理FIQ异常响应时进入此模式 中断 (irq)用于通用中断处理IRQ异常响应时进入此模式 管理 (svc)操作系统保护代码系统复位和软件中断响应时进入此模式

7、 中止 (abt)用于支持虚拟内存和/或存储器保护在ARM7TDMI没有大用处 未定义 (und)支持硬件协处理器的软件仿真未定义指令异常响应时进入此模式n处理器模式n特权模式处理器模式说明备注 用户 (usr)正常程序工作模式不能直接切换到其它模式 系统 (sys)用于支持操作系统的特权任务等与用户模式类似,但具有可以直接切换到其它模式等特权 快中断 (fiq)支持高速数据传输及通道处理FIQ异常响应时进入此模式 中断 (irq)用于通用中断处理IRQ异常响应时进入此模式 管理 (svc)操作系统保护代码系统复位和软件中断响应时进入此模式 中止 (abt)用于支持虚拟内存和/或存储器保护在A

8、RM7TDMI没有大用处 未定义 (und)支持硬件协处理器的软件仿真未定义指令异常响应时进入此模式 除用户模式外,其它模式均为特权模式。ARM内部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。 未定义 (und) 中止 (abt) 管理 (svc) 中断 (irq) 快中断 (fiq) 系统 (sys)n异常模式处理器模式说明备注 用户 (usr)正常程序工作模式不能直接切换到其它模式 系统 (sys)用于支持操作系统的特权任务等与用户模式类似,但具有可以直接切换到其它模式等特权 快中断 (

9、fiq)支持高速数据传输及通道处理FIQ异常响应时进入此模式 中断 (irq)用于通用中断处理IRQ异常响应时进入此模式 管理 (svc)操作系统保护代码系统复位和软件中断响应时进入此模式 中止 (abt)用于支持虚拟内存和/或存储器保护在ARM7TDMI没有大用处 未定义 (und)支持硬件协处理器的软件仿真未定义指令异常响应时进入此模式 未定义 (und) 中止 (abt) 管理 (svc) 中断 (irq) 快中断 (fiq) 这五种模式称为异常模式。它们除了可以通过程序切换进入外,也可以由特定的异常进入。当特定的异常出现时,处理器进入相应的模式。每种异常模式都有一些独立的寄存器,以避免

10、异常退出时用户模式的状态不可靠。n用户和系统模式处理器模式说明备注 用户 (usr)正常程序工作模式不能直接切换到其它模式 系统 (sys)用于支持操作系统的特权任务等与用户模式类似,但具有可以直接切换到其它模式等特权 快中断 (fiq)支持高速数据传输及通道处理FIQ异常响应时进入此模式 中断 (irq)用于通用中断处理IRQ异常响应时进入此模式 管理 (svc)操作系统保护代码系统复位和软件中断响应时进入此模式 中止 (abt)用于支持虚拟内存和/或存储器保护在ARM7TDMI没有大用处 未定义 (und)支持硬件协处理器的软件仿真未定义指令异常响应时进入此模式 这两种模式都不能由异常进入

11、,而且它们使用完全相同的寄存器组。 系统模式是特权模式,不受用户模式的限制。操作系统在该模式下访问用户模式的寄存器就比较方便,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。 系统 (sys) 用户 (usr)Cortex-M3的工作模式Cortex M3 支持2 个模式和两个特权等级。两种操作模式分别为:处理模式(handler mode)和线程模式(thread mode)。引入两个模式的目的,是用于区别普通应用程序的代码和异常服务例程的代码包括中断服务例程的代码。Cortex M3 的特权分级特权级和用户级。这可以提供一种存储器访问的保护机制,使得普通的用户程序代码不能意外

12、地,甚至是恶意地执行涉及到要害的操作。处理器支持两种特权级,这也是一个基本的安全模型。特权访问和用户访问处理模式线程模式可以特权访问也可以用户访问始终特权访问Cortex-M3的工作模式用户程序中断(异常)程序 特权执行可以访问所有资源。 非特权执行时对有些资源的访问受到限制或不允许访问。 如部分指令的使用 (设置FAULTMASK和PRIMASK的CPS指令 ) 对系统控制空间(SCS)的大部分寄存器的访问。特权访问和用户访问(非特权访问)的区别FAULTMASKPRIMASKSCS用户访问特权访问Cortex-M3的工作模式 1. 线程模式线程模式和处理模式 2.处理模式u 在复位时处理器

13、进入线程模式u 异常返回时处理器进入线程模式u 特权和用户(非特权)代码能够在线程模式下运行u 出现异常时处理器进入处理模式u 在处理模式中,所有代码都是特权访问的Cortex-M3的编程模式线程模式特权访问复位处理模式特权访问异常线程模式用户访问异常异常退出CONTROL0 = 1CONTROL0 = 0MSR指令置位CONTROL0 Cortex-M3的编程模式CONTROL0特权访问用户访问10特权访问和用户访问的切换控制寄存器的第0位 在处理模式下,通过MSR指令清零CONTROL0, 退出处理模式进入线程模式时切换到特权访问 。 MOV R0 #0X00 MSR CONTROL R0

14、 在处理模式下,通过MSR指令置位CONTROL0, 退出处理模式进入线程模式时切换到用户访问 。 在线程模式特权访问下,通过MSR指令置位CONTROL0,即可由特权访问进入用户访问 。 MRS R0 CONTROL ORR R0, R0, #0 x01 MSR CONTROL R0控制寄存器控制寄存器(CONTROL)控制寄存器用于定义特权级别,还用于选择当前使用哪个堆栈指针。CONTROL0仅当在特权级下操作时才允许写该位。一旦进入了用户级,唯一返回特权级的途径,就是触发一个(软)中断,再由服务例程改写该位。堆栈指针这两个堆栈指针分别是: 主堆栈指针(主堆栈指针(MSP),),或写作SP

15、_main。这是缺省的堆栈指针,它由OS 内核、异常服务例程以及所有需要特权访问的应用程序代码来使用。 进程堆栈指针(进程堆栈指针(PSP),),或写作SP_process。用于常规的应用程序代码(不处于异常服用例程中时)。堆栈指针在Cortex M3 中,有专门的指令负责堆栈操作PUSH 和POP。它俩的汇编语言语法如下例所演示:PUSH R0 ; POP R0堆栈指针PUSH 和POP 能一次操作多个寄存器,如下所示:subroutine_1PUSH R0-R7, R12, R14 ; 保存寄存器列表 ; 执行处理POP R0-R7, R12, R14 ; 恢复寄存器列表BX R14 ;

16、返回到主调函数Cortex-M3的编程模式主堆栈和进程堆栈处理模式线程模式可用 MSP始终使用 MSP也可用 PSPCortex-M3的编程模式主堆栈和进程堆栈 结束复位后,所有代码都使用主堆栈 所有异常都使用主堆栈 在线程模式中,使用MSR指令对CONTROL1执行写操作也可以从主堆栈切换到进程堆栈。 在任何时候,进程堆栈和主堆栈中只有一个是可见的,由r13指示。 Cortex-M3的编程模式通过异常进行堆栈切换线程模式主堆栈复位处理模式主堆栈产生异常线程模式线程堆栈产生异常异常退出EXC_RETURN3:0 = 0b1101EXC_RETURN3:0 = 0b1001Cortex-M3的编

17、程模式通过MSR指令修改CONTROL1进行堆栈切换线程模式主堆栈线程模式进程堆栈CONTROL1主堆栈进程堆栈10控制寄存器的第1位CONTROL1在Cortex M3 的handler 模式中,CONTROL1总是0。在线程模式中则可以为0 或1。仅当处于特权级的线程模式下,此位才可写,其它场合下禁止写此位。Cortex-M3的编程模式特权等级和堆栈指针的选择均由CONTROL 负责。当CONTROL0=0 时,在异常处理的始末,只发生了处理器模式的转换,如下图所示。Cortex-M3的编程模式若CONTROL0=1(线程模式+用户级),则在中断响应的始末,处理器模式和特权等极都要发生变化

18、,如下图所示。三种执行模式的比较执行模式进入方式堆栈SP用途特权线程模式1复位2在特权处理模式下使用MSR指令清零CONTROL0使用使用SP_mainSP_main:1复位后默认2. 在退出特权处理模式前,修改返回值EXC_RETURN3:0为0b10013清零CONTROL1使用使用SP_processSP_process:1在退出特权处理模式前,修改返回值EXC_RETURN3:0为0b11012置位CONTROL1线程模式(特权或非特权)SP_process多用于操作系统的任务状态。非特权线程模式在特权线程模式或特权处理模式下使用MSR指令置位CONTROL0特权处理模式出现异常只能使

19、用SP_main特权处理模式SP_main在前后台和操作系统中用于中断状态。前后台系统主堆栈压栈过程数据数据栈顶栈底0 x200004000 x200003FC0 x200003F8数据地址数据增长方向堆栈增长为满递减SP主堆栈前后台系统主堆栈压栈过程数据数据栈底数据地址数据增长方向堆栈增长为满递减产生中断主堆栈SPXPSRPCLRR12R3R00 x200004000 x200003FC0 x200003F8硬件自动压栈前后台系统主堆栈出栈过程数据数据栈底数据地址退出中断主堆栈XPSRPCLRR12R3R2R1R0通用寄存器0 x200004000 x200003FC0 x200003F8S

20、PSPSPSPSPSPSPXPSRPCLRR12R3R2R1R0R1R0SPSPR2XPSRPCLRR12R3退出异常,寄存器恢复为进入前的值。操作系统主堆栈和进程堆栈切换过程主堆栈任务1任务2复位SP初始化数据SP数据数据栈底栈底栈底栈顶栈顶栈顶栈顶栈顶栈顶SP = MSP操作系统主堆栈和进程堆栈切换过程主堆栈任务1任务2进入异常数据SP数据数据栈底栈底栈底R0SPSP = MSP操作系统主堆栈和进程堆栈切换过程主堆栈任务1任务2退出异常时切换到任务1数据数据数据栈底栈底栈底R0SPSP = PSP 在ARM7TDMI处理器内部有37个用户可见的寄存器。 在不同的工作模式和处理器状态下,程序

21、员可以访问的寄存器也不尽相同。ARM状态各模式下的寄存器ARM状态各模式下的寄存器所有的37个寄存器,分成两大类:31个通用32位寄存器;6个状态寄存器。ARM状态各模式下可以访问的寄存器一般的通用寄存器 在汇编语言中寄存器R0R13为保存数据或地址值的通用寄存器。它们是完全通用的寄存器,不会被体系结构作为特殊用途,并且可用于任何使用通用寄存器的指令。一般的通用寄存器 其中R0R7为未分组的寄存器,也就是说对于任何处理器模式,这些寄存器都对应于相同的32位物理寄存器。一般的通用寄存器 寄存器R8R14为分组寄存器。它们所对应的物理寄存器取决于当前的处理器模式,几乎所有允许使用通用寄存器的指令都

22、允许使用分组寄存器一般的通用寄存器 寄存器R8R12有两个分组的物理寄存器。一个用于除FIQ模式之外的所有寄存器模式,另一个用于FIQ模式。这样在发生FIQ中断后,可以加速FIQ的处理速度。一般的通用寄存器 寄存器R13、R14分别有6个分组的物理寄存器。一个用于用户和系统模式,其余5个分别用于5种异常模式。堆栈指针寄存器R13(SP) 寄存器R13常作为堆栈指针(SP)。在ARM指令集当中,没有以特殊方式使用R13的指令或其它功能,只是习惯上都这样使用。但是在Thumb指令集中,只能使用R13作为堆栈指针。链接寄存器R14(LR) R14为链接寄存器(LR),在结构上有两个特殊功能:在每种模

23、式下,模式自身的R14版本用于保存子程序返回地址;当发生异常时,将R14对应的异常模式版本设置为异常返回地址(有些异常有一个小的固定偏移量)。Lable程序A程序BR14BL Lable地址A?MOV PC,LRR14(地址A)Lable?1.程序A执行过程中调用程序B;操作流程2.程序跳转至标号Lable,执行程序B。同时硬件将“BL Lable”指令的下一条指令所在地址存入R14;3.程序B执行最后,将R14寄存器的内容放入PC,返回程序A; 异常发生时,程序要跳转至异常服务程序,对返回地址的处理与子程序调用类似,都是由硬件完成的。 当发生异常嵌套时,这些异常之间可能会发生冲突。例如:如果

24、用户在用户模式下执行程序时发生了IRQ中断,用户模式寄存器不会被破坏。但是如果允许在IRQ模式下的中断处理程序重新使能IRQ中断,并且发生了嵌套的IRQ中断时,外部中断处理程序保存在R14_irq中的任何值都将被嵌套中断的返回地址所覆盖。R14R14_irq用户模式下的程序IRQ模式下的程序AareturnB.XA地址A地址A1.执行用户模式下的程序;2.发生IRQ中断,硬件将某个地址存入IRQ模式下的R14_irq寄存器,用户模式下的R14没有被破坏;3. IRQ服务程序A执行完毕,将R14_irq寄存器的内容减去某个常量后存入PC,返回之前被中断的程序;未被破坏R14R14_irq用户模式

25、下的程序IRQ模式下的程序AaB.XA地址A地址A1.执行用户模式下的程序;2.发生IRQ中断,硬件将某个地址存入IRQ模式下的R14_irq寄存器,用户模式下的R14没有被破坏;3. IRQ服务程序A执行完毕,将R14_irq寄存器的内容减去某个常量后存入PC,返回之前被中断的程序;未被破坏IRQ模式下的程序BareturnB.XA地址B地址B4. 如果在IRQ处理程序中打开IRQ中断,并且再次发生IRQ中断,或者调用子程序;5. 硬件将返回地址保存在R14_irq寄存器中,原来保存的返回地址将被覆盖,造成错误;被破坏6. 在程序B返回到程序A,然后在返回到用户模式下被中断的程序时,发生错误

26、,将不能正确返回;returnreturn 解决办法是确保R14的对应版本在发生中断嵌套时不再保存任何有意义的值(将R14入栈),或者切换到其它处理器模式下。程序计数器R15(PC) 寄存器R15为程序计数器(PC),它指向正在取指的地址。可以认为它是一个通用寄存器,但是对于它的使用有许多与指令相关的限制或特殊情况。如果R15使用的方式超出了这些限制,那么结果将是不可预测的。 正常操作时,从R15读取的值是处理器正在取指的地址,即当前正在执行指令的地址加上8个字节(两条ARM指令的长度)。由于ARM指令总是以字为单位,所以R15寄存器的最低两位总是为0。LDR R0,PC?PCPC-4PC-8

27、正在执行正在译码正在取指流水线状态地址程序代码 当使用STR或STM指令保存R15时,可能将当前执行指令地址加8字节或加12字节保存(将来可能还有其它数字)。偏移量是8还是12取决于具体的ARM芯片,但是对于一个确定的芯片,这个值是一个常量。 所以最好避免使用STR和STM指令来保存R15, 正常操作时,写入R15 的值被当作一个指令地址,程序从这个地址处继续执行(相当于执行一次无条件跳转)。 由于ARM指令以字节为边界,因此写入R15的值最低两位通常为0b00。具体的规则取决于内核结构的版本:在ARM结构V3版及以下版本中,写入R15的值的最低两位被忽略,因此跳转地址由指令的实际目标地址(写

28、入R15的值)和0 xFFFFFFFC相与得到;在ARM结构V4版及以上版本中,写入R15的值的最低两位为0,如果不是,结果将不可预测。程序状态寄存器CPSR 寄存器CPSR为程序状态寄存器,在异常模式中,另外一个寄存器“程序状态保存寄存器(SPSR)”可以被访问。每种异常都有自己的SPSR,在因为异常事件而进入异常时它保存CPSR的当前值,异常退出时可通过它恢复CPSR。 ARM内核包含1个CPSR和5个供异常处理程序使用的SPSR。CPSR反映了当前处理器的状态,其包含:4个条件代码标志(负(N)、零(Z)、进位(C)和溢出(V) );2个中断禁止位,分别控制一种类型的中断; 5个对当前处

29、理器模式进行编码的位;1个用于指示当前执行指令(ARM还是Thumb)的位。 NZCV IM0M1M2M3M4TF. . .31 30 29 28 27 26 8 7 6 5 4 3 2 1 0条件代码标志保留控制位溢出标志进位或借位扩展零负或小于IRQ禁止FIQ禁止状态位模式位NZCVIM0M1M2M3M4TFCPSR寄存器的格式 大多数“数值处理指令”可以选择是否影响条件代码标志位。通常如果指令带S后缀,则该指令的执行会影响条件代码标志;但有一些指令的执行总是会影响条件代码标志。 N、 Z、 C和V位都是条件代码标志。通过算术操作、逻辑操作、MSR或者LDM指令可以对这些位进行设置。所有A

30、RM指令都可按条件来执行,而Thumb指令中只有分支指令可按条件执行。各标志位的含义如下:N 运算结果的最高位反映在该标志位。对于有符号二进制补码,结果为负数时N=1,结果为正数或零时N=0;Z 指令结果为0时Z=1(通常表示比较结果“相等”),否则Z=0;各标志位的含义如下:C 当进行加法运算(包括CMN指令),并且最高位产生进位时C=1,否则C=0。当进行减法运算(包括CMP 指令),并且最高位产生借位时C=0,否则C=1。对于结合移位操作的非加法/减法指令,C为从最高位最后移出的值其它指令C通常不变; V 当进行加法/减法运算,并且发生有符号溢出时V=1,否则V=0,其它指令V通常不变。

31、 CPSR的最低8位为控制位,当发生异常时,这些位被硬件改变。 它们分别是:中断禁止位;T位;模式位。中断禁止位包括I和F位:当I位置位时,IRQ中断被禁止;当F位置位时,FIQ中断被禁止。T位反映了正在操作的状态:当T位置位时,处理器正在Thumb状态下运行;当T位清零时,处理器正在ARM状态下运行。模式位包括M4、M3、M2、M1和M0,这些位决定处理器的操作模式。注意:不是所有模式位的组合都定义了有效的处理器模式,如果使用了错误的设置,将引起一个无法恢复的错误。CPSR模式位设置表 CPSR中的保留位被保留将来使用。为了提高程序的可移植性,当改变CPSR标志和控制位时,请不要改变这些保留

32、位。另外,请确保程序的运行不受保留位的值影响,因为将来的处理器可能会将这些位设置为1或者0。 Thumb状态寄存器集是ARM状态集的子集,程序员可以直接访问的寄存器为:8个通用寄存器R0R7;程序计数器(PC);堆栈指针(SP);链接寄存器(LR);有条件访问程序状态寄存器( CPSR)。Thumb状态各模式下的寄存器Thumb状态下的通用寄存器 在汇编语言中寄存器R0R7为保存数据或地址值的通用寄存器。对于任何处理器模式,它们中的每一个都对应于相同的32为物理寄存器。它们是完全通用的寄存器,不会被体系结构作为特殊的用途,并且可用于任何使用通用寄存器的指令。Thumb状态下的堆栈指针寄存器(S

33、P) 堆栈指针SP对应ARM状态的寄存器R13。每个异常模式都有其自身的SP分组版本,SP通常指向各异常模式所专用的堆栈。 注意:在发生异常时,处理器自动进入ARM状态。Thumb状态下的链接寄存器R14(LR) 链接寄存器LR对应ARM状态寄存器R14,在结构上有两个特殊功能,同“ARM状态下的链接寄存器LR”。 注意:在发生异常时,处理器自动进入ARM状态。 Thumb状态寄存器与ARM状态寄存器有如下的关系:Thumb状态R0R7与ARM状态R0R7相同;Thumb状态CPSR和SPSR与ARM状态CPSR和SPSR相同;Thumb状态SP映射到ARM状态R13;Thumb状态LR映射到

34、ARM状态R14;Thumb状态PC映射到ARM状态PC(R15)。 R1 R2 R3 R4 R5 T humb R6 R7 ( C PSR ) ( SPSR ) R1 R2 R3 R4 R5 A R M R6 R7 R8 ( C PSR ) ( SPSR ) R9 R10 R11 R12 R0 R0 状态 状态 堆栈指针(SP) 连接寄存器(LR) 程序计数器(PC) 当前程序状态寄存器 被保存程序状态寄存器 堆栈指针(R13) 连接寄存器(R14) 程序计数器(R15) 当前程序状态寄存器 被保存程序状态寄存器 Thumb状态寄存器在Arm状态寄存器上的映射R1 R2 R3 R4 R5 R

35、6 R7 R8 R9 R10 R11 R12 R0 堆栈指针 (R13) 连接寄存器 (R14) 程序计数器 (R15) 低寄存器高寄存器 在Thumb状态中,高寄存器(R8R15)不是标准寄存器集的一部分。汇编语言程序员对它们的访问受到限制,但可以将它们用于快速暂存。 可以使用MOV、CMP和ADD指令对高寄存器操作。32位通用寄存器R0R1R2R3R4R5R6R7R8R9R10R11R12R13(SP)R14(LR)R15(PC)XPSRr0r12 ,为13个通用寄存器 低寄存器低寄存器 , r0-r7可以被指定通用寄存器的所有指令访问 高寄存器高寄存器 , r8-r12可以被指定通用寄存

36、器的所有32位指令访问 ,不能被16位指令访问。 SP_ProcessSP_MainCORTEX m3 寄存器组织分组的堆栈指针(SP)R0R1R2R3R4R5R6R7R8R9R10R11R12R13(SP)R14(LR)R15(PC)XPSRSP_MainSP_Process处理模式线程模式可用 MSP始终使用 MSP也可用 PSP复位后默认的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)由用户的应用程序代码使用堆栈指针(SP)分组的堆栈指针(SP)注意:1、不是每个应用都必须用齐两个堆栈指针,简单的应用程序只使用MSP就够了。2、MSP,亦写作SP_main,这是复位后缺省

37、使用堆栈指针,服务于操作系统内核和异常服务例程; PSP,亦写作SP_process,典型地用于普通的用户线程中。3、寄存器的PUSH 和POP 操作永远都是4 字节对齐的也就是说他们的地址必须是0 x4,0 x8,0 xc,。R13 的最低两位被硬线连接到0,并且总是读出0链接寄存器(LR)R0R1R2R3R4R5R6R7R8R9R10R11R12R13(SP)R14(LR)R15(PC)XPSR链接寄存器链接寄存器 (LR) 在执行分支(branch)和链接(BL)指令或带有交换的分支和链接指令(BLX)时,LR用于保存PC的返回地址。 主要用于保存子程序的 返回地址。 也用于异常返回。

38、链接寄存器(LR)R0R1R2R3R4R5R6R7R8R9R10R11R12R13(SP)R14(LR)R15(PC)XPSRint main () . delay(); Set LED1(); void delay() . BL delaydelay: . BX lr .0X20F00X20F4地址R14(LR)0X20F40X10F40X10F4执行BL指令,LR的值同时更新寄存器(PC)R0R1R2R3R4R5R6R7R8R9R10R11R12R13(SP)R14(LR)R15(PC)XPSR程序计数器程序计数器 (PC)程序计数器 总是指向正在取指的指令。该寄存器的位0始终为0,因此,

39、指令始终与字或半字边界对齐。 程序状态寄存器程序状态寄存器 (XPSR)用于指示程序的运行状态。程序状态寄存器 对程序状态寄存器的访问只能使用MRS和MSR指令 MRS MRS从特殊寄存器读出数据,并存入一通用寄存器指令码条件执行用于指示是16位指令还是32位指令目标寄存器(通用寄存器R0R15)操作对象(特殊功能寄存器)程序状态寄存器 对程序状态寄存器的访问只能使用MRS和MSR指令 MRS MRS从特殊寄存器读出数据,并存入一通用寄存器指令码条件执行用于指示是16位指令还是32位指令目标寄存器(通用寄存器R0R15)操作对象(特殊功能寄存器) MRSEQ.W R0, PSP特殊用途程序状态

40、寄存器 应用状态寄存器(APSR)包含条件代码标志。 在进入异常之前,Cortex-M3处理器将条件代码标志保存在堆栈内(硬件压栈)。可以使用MSR和MRS指令来访问APSR。应用状态寄存器应用状态寄存器(APSR)(APSR)APSR的位分配 负数或小于标志:1:结果为负数或小于0:结果为正数或大于 零标志:1:结果为00:结果为非0 进位/借位标志:1:进位或借位0:没有进位或借位 溢出标志:1:溢出0:没有溢出 粘着饱和(sticky saturation)标志 应用状态寄存器应用状态寄存器(APSR)(APSR)中断状态寄存器中断状态寄存器(IPSR)(IPSR) 中断状态寄存器(IP

41、SR)包含当前激活的异常的ISR编号。 IPSR的位分配 ISR NUMBER 基础级别 =0Reset =1NMI =2SVCall 11 .执行状态寄存器执行状态寄存器(EPSR)(EPSR)为什么需要执行状态寄存器为什么需要执行状态寄存器EPSREPSR? LDM、STM和If-then指令,为多周期指令,如果在执行以上多周期指令时发生异常,处理器会暂时停止以上指令的操作,进入异常,这时需要保护现场。LDM指令STEP1STEP2STEP3STEP4异常 异常程序执行状态寄存器执行状态寄存器(EPSR)(EPSR)执行状态寄存器执行状态寄存器PSR(EPSR)PSR(EPSR)包含两个重

42、叠的区域包含两个重叠的区域 :可中断可中断- -可继续指令(可继续指令(ICIICI)区)区 多寄存器加载(LDM)和存储(STM)操作是可中断的。EPSR的ICI区用来保存从产生中断的点继续执行多寄存器加载和存储操作时所必需的信息。 If-thenIf-then状态区状态区 EPSR的IT区包含了If-Then指令的执行状态位。 IT注:ICI区和IT区是重叠的,因此,If-Then模块内的多寄存器加载或存储操作不具有可中断-可继续功能。ICI执行状态寄存器执行状态寄存器(EPSR)(EPSR)EPSR的位分配 可中断-可继续的指令位。如果在执行LDM或STM操作时产生一次中断,则LDM或S

43、TM操作暂停。EPSR使用位15:12来保存该操作中下一个寄存器操作数的编号。在中断响应之后,处理器返回由15:12指向的寄存器并恢复操作。如果ICI区指向的寄存器不在指令的寄存器列表中,则处理器对列表中的下一个寄存器(如果有)继续执行LDM/STM操作。ICI执行状态寄存器执行状态寄存器(EPSR)(EPSR)EPSR的位分配 If-Then位。它们是If-Then指令的执行状态位。包含If-Then模块的指令数目和它们的执行条件。IT执行状态寄存器执行状态寄存器(EPSR)(EPSR)EPSR的位分配 用于指示处理器当前是ARM状态还是Thumb状态。由于ARMV7-M架构仅仅支出Thum

44、b指令,所以T位一直为1。操作EPSR寄存器时必须注意,不能清零T位,否则会引起INVSTATE异常。执行状态寄存器执行状态寄存器(EPSR)(EPSR)不能直接访问EPSR,若想修改EPSR必须发生以下两个事件之一: 在执行LDM或STM指令时产生一次中断 执行If-Then指令如果出现下列情况,LDM/STM操作重新开始而不是继续执行: LDM/STM错误 LDM/STM指令位于IT内特殊功能寄存器特殊功能寄存器中断屏蔽寄存器( PRIMASK )相当于中断总开关,为1,所有中断被屏蔽;为0,中断能正常响应。只有最低位有效。PRIMASK所有中断被屏蔽10中断屏蔽寄存器中断能正常响应特殊功

45、能寄存器特殊功能寄存器BASEPRI这个寄存器最多有9 位(由表达先级的位数决定)。它定义了被屏蔽优先级的阈值。当它被设成某个值后,所有优先级号大于等于此值的中断都被关(优先级号越大,优先级越低)。但若被设成0,则不关闭任何中断,0 也是缺省值。优先级0优先级1优先级2优先级3优先级4.中断被屏蔽中断可响应特殊功能寄存器特殊功能寄存器BASEPRI_MAX用于设置BASEPRI的最大值特殊功能寄存器特殊功能寄存器控制寄存器( CONTROL)控制寄存器用于定义特权级别,还用于选择当前使用哪个堆栈指针。CONTROL寄存器由两个状态位组成:特殊功能寄存器特殊功能寄存器CONTROL1在Corte

46、x M3 的handler 模式中,CONTROL1总是0。在线程模式中则可以为0 或1。仅当处于特权级的线程模式下,此位才可写,其它场合下禁止写此位。改变处理器的模式也有其它的方式:在异常返回时,通过修改LR 的位2,也能实现模式切换。CONTROL0仅当在特权级下操作时才允许写该位。一旦进入了用户级,唯一返回特权级的途径,就是触发一个(软)中断,再由服务例程改写该位。CONTROL 寄存器也是通过MRS 和MSR 指令来操作的:MRS R0, CONTROLMSR CONTROL, R0 只要正常的程序流被暂时中止,处理器就进入异常模式。例如响应一个来自外设的中断。在处理异常之前,ARM7

47、TDMI内核保存当前的处理器状态,这样当处理程序结束时可以恢复执行原来的程序。 如果同时发生两个或更多异常,那么将按照固定的顺序来处理异常, “异常优先级” 。 异常入口/出口汇总注意:“MOVS PC,R14_svc”是指在管理模式执行MOVS PC,R14指令。“MOVS PC,R14_und”、“SUBS PC,R14_abt,#4”等指令也是类似的。 如果异常处理程序已经把返回地址拷贝到堆栈,那么可以使用一条多寄存器传送指令来恢复用户寄存器并实现返回。SUB LR,LR,#4;计算返回地址STMFD SP!,R0-R3,LR;保存使用到的寄存器. . .LDMFD SP!,R0-R3,

48、PC ;中断返回中断处理代码的开始部分和退出部分 如果异常处理程序已经把返回地址拷贝到堆栈,那么可以使用一条多寄存器传送指令来恢复用户寄存器并实现返回。中断处理代码的开始部分和退出部分SUB LR,LR,#4;计算返回地址STMFD SP!,R0-R3,LR;保存使用到的寄存器. . .LDMFD SP!,R0-R3,PC ;中断返回注意:中断返回指令的寄存器列表(其中必须包括PC)后的“”符号表示这是一条特殊形式的指令。这条指令在从存储器中装载PC的同时(PC是最后恢复的),CPSR也得到恢复。这里使用的堆栈指针SP(R13)是属于异常模式的寄存器,每个异常模式有自己的堆栈指针。这个堆栈指针

49、应必须在系统启动时初始化。 在异常发生后,ARM内核会作以下工作:1.在适当的LR中保存下一条指令的地址,当异常入口来自:ARM状态,那么ARM将当前指令地址加4或加8复制(取决于异常的类型)到LR中;Thumb状态,那么ARM7将当前指令地址加4或加8 (取决于异常的类型)复制到LR中;2.将CPSR复制到适当的SPSR中;3. 将CPSR模式位强制设置为与异常类型相对应的值;4.强制PC从相关的异常向量处取指。 ARM7内核在中断异常时置位中断禁止标志,这样可以防止不受控制的异常嵌套。注:异常总是在ARM状态中进行处理。当处理器处于Thumb状态时发生了异常,在异常向量地址装入PC时,会自

50、动切换到ARM状态。当异常结束时,异常处理程序必须:1.将LR中的值减去偏移量后存入PC,偏移量根据异常的类型而有所不同;2.将SPSR的值复制回CPSR;3.清零在入口置位的中断禁止标志。注:恢复CPSR的动作会将T、F和I位自动恢复为异常发生前的值。程序AIRQ服务程序系统模式IRQ模式程序寄存器组图示进入异常过程1. 程序在系统模式下运行用户程序,假定当前处理器状态为Thumb状态、允许IRQ中断;2. 用户程序运行时发生IRQ中断,硬件完成以下动作:LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0. . .? ? ? ?MODTFI. . .N Z C V置

51、位I位(禁止IRQ中断)清零T位(进入ARM状态)设置MOD位,切换处理器模式至IRQ模式将下一条指令的地址存入IRQ模式的LR寄存器将CPSR寄存器内容存入IRQ模式的SPSR寄存器将跳转地址存入PC,实现跳转IRQ0?1. . .? ? ? ?BackAddrJumpAddrJumpSYS1?0. . .?“?”表示对该位不关心在异常处理结束后,异常处理程序完成以下动作:程序AIRQ服务程序系统模式IRQ模式程序寄存器组图示退出异常过程LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0. . .? ? ? ?MODTFI. . .N Z C V将SPSR寄存器的值

52、复制回CPSR寄存器;将LR寄存的值减去一个常量后复制到PC寄存器,跳转到被中断的用户程序。IRQ0?1. . .? ? ? ?BackAddrJumpAddrreturnSYS1?0. . .?SYS1?0. . .? ? ? ?BackAddr-4Jump“?”表示对该位不关心 R14_=return link SPSR_=CPSR CPSR4:0=exception mode number CPSR5=0 /*当运行于当运行于ARM状态时状态时*/ CPSR6=1 /*禁止新的禁止新的IRQ中断中断*/if =Reset or FIQ then CPSR7=1 /*当当Reset 或或F

53、IQ异常中断时,禁止新异常中断时,禁止新 的的FIQ中断中断* PC=exception vector address 所有修改过的用户寄存器必须从处理程序的保护堆栈中恢复(即出栈)。将SPSR_mode寄存器内容复制到CPSR中,使得CPSR从相应的SPSR中恢复,即恢复被中断程序工作状态;根据异常类型将PC变回到用户指令流中相应指令处最后清除CPSR中的中断禁止标志位I/F。异常向量注:表中的I和F表示不对该位有影响,保留原来的指。 不管异常入口是来自ARM状态还是Thumb状态,FIQ处理程序都会通过执行下面的指令从中断返回:SUBS PC,R14_fiq,#4 中止发生在对存储器的访问

54、不能完成时,中止包含两种类型:预取中止 发生在指令预取过程中数据中止 发生在对数据访问时 在处理中止的原因之后,不管处于哪种处理器操作状态,处理程序都会执行下面的指令恢复PC和CPSR并重试被中止的指令: SUBS PC,R14_abt,#4 许多ARM实现在前一条指令的执行尚未完成时将指令从存储器中取出。这个动作称为指令的预取。指令的预取并不是实际执行指令。芯片的生产厂商可以自由选择预取指令的数目。被预取的指令可能得不到运行,可能的原因是:发生异常;发生跳转; 当读取PC时,得到的指令地址比正在执行指令的地址落后两条指令:对于ARM指令,得到的地址是它自身地址+8;对于Thumb指令,得到的地址是它自身地址+4; 虽然生产厂商可以选择预取指令的数目,但是仍然可以保证读取PC所得到地址比它自身地址落后两条指令。?内核流水线执行译码预取 LDR R0,AddInstr STR R

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论