(第2版)
主讲内容 第1章 嵌入式系统概述 第2章 ARM微处理器概述与编程模型 第3章 ARM9指令系统 第4章 嵌入式程序设计基础 第1章 嵌入式系统概述 第2章 ARM微处理器概述与编程模型 第3章 ARM9指令系统 第4章 嵌入式程序设计基础 第5章 嵌入式内部可编程模块 第6章 嵌入式接口技术应用 第7章 软件开发环境
第2章 ARM微处理器概述与编程模型 ARM微处理器概述 ARM微处理器结构 ARM微处理器的工作状态 ARM体系结构的存储器格式 处理器模式 寄存器组织 异常(Exceptions)
2.1 ARM微处理器概述 ARM公司简介 ARM是Advanced RISC Machines的缩写,它是一家微处理器行业的知名企业,该企业设计了大量高性能、廉价、耗能低的RISC (精简指令集)处理器。 公司的特点是只设计芯片,而不生产。它将技术授权给世界上许多著名的半导体、软件和OEM厂商,并提供服务。
2.1 ARM微处理器概述 ARM公司简介 将技术授权给其它芯片厂商 . . . 形成各具特色的ARM芯片
2.1 ARM微处理器概述 一个公司的名称 一类微处理器的通称 一种技术的名称 ARM(Advanced RISC Machines)有3种含义 一个公司的名称 一类微处理器的通称 一种技术的名称
2.1.1 ARM微处理器的特点 采用RISC架构的ARM微处理器一般具有如下特点: 体积小、低功耗、低成本、高性能; 支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件; 大量使用寄存器,指令执行速度更快; 大多数数据操作都在寄存器中完成; 寻址方式灵活简单,执行效率高; 指令长度固定。
2.1.2 ARM微处理器系列 ARM处理器的产品系列非常广,包括ARM7、ARM9、ARM9E、ARM10E、ARM11和SecurCore、Cortex等。以及其它厂商基于ARM体系结构的处理器,除了具有ARM体系结构的共同特点以外,每一系列提供一套特定的性能来满足设计者对功耗、性能、体积的需求。 表2-1总结了ARM各系列处理器所包含的不同类型。
向量浮点运算(Vector Floating Point) 2.1.2 ARM微处理器系列 ARM系列 包含类型 ARM7系列 ARM7EJ-S ARM7TDMI ARM7TDMI-S ARM720T ARM9/9E系列 ARM920T ARM922T ARM926EJ-S ARM940T ARM946E-S ARM966E-S ARM968E-S 向量浮点运算(Vector Floating Point) VFP9-S VFP10
2.1.2 ARM微处理器系列 ARM系列 包含类型 ARM10E系列 ARM1020E ARM1022E ARM1026EJ-S ARM1136J-S ARM1136JF-S ARM1156T2(F)-S ARM1176JZ(F)-S ARM11MPCore SecurCore系列 SC100 SC110 SC200 SC210 其他合作伙伴产品 StrongARM Xscale Cortex-M3 MBX
2.1.2 ARM微处理器系列 ARM Cortex系列简介 基于ARMv7版本的ARM Cortex系列产品由A、R、M三个系列组成,具体分类延续了一直以来ARM面向具体应用设计CPU的思路。 ARM Cortex A应用处理器(Application Processor )系列 R实时控制处理(Real Time Control )系列 M微控制器(Micro Controller )系列
2.1.2 ARM微处理器系列 CortexTM-M3处理器简介 该处理器是首款基于ARMv7-M架构的处理器,采用了纯Thumb2指令的执行方式,具有极高的运算能力和中断相应能力。 Cortex-M3主要应用于汽车车身系统,工业控制系统和无线网络等对功耗和成本敏感的嵌入式应用领域。目前最便宜的基于该内核的ARM单片机售价为1美元。
2.1.2 ARM微处理器系列 CortexTM-R4处理器简介 CortexTM-R4F处理器简介 该处理器是首款基于ARMv7架构的高级嵌入式处理器,其主要目标为产量巨大的高级嵌入式应用系统,如硬盘,喷墨式打印机,以及汽车安全系统等等。 CortexTM-R4F处理器简介 该处理器在CortexTM-R4处理器的基础上加入了代码错误校正(ECC)技术,浮点运算单元(FPU)以及DMA综合配置的能力,增强了处理器在存储器保护单元、缓存、紧密耦合存储器、DMA访问以及调试方面的能力。
2.1.2 ARM微处理器系列 CortexTM-A8处理器简介 众多先进的技术使其适用于家电以及电子行业等各种高端的应用领域。 该处理器是ARM公司所开发的基于ARMv7架构的首款应用级处理器,其特色是运用了可增加代码密度和加强性能的技术、可支持多媒体以及信号处理能力的NEONTM技术、以及能够支持Java和其他文字代码语言的提前和即时编译的Jazelle@RTC技术。 众多先进的技术使其适用于家电以及电子行业等各种高端的应用领域。
2.1.2 ARM微处理器系列 ARM7系列简介 该系列包括ARM7TDMI、ARM7TDMI-S、带有高速缓存处理器宏单元的ARM720T和扩充了Jazelle的ARM7EJ-S。该系列处理器提供Thumb 16位压缩指令集和EmbededICE软件调试方式,适用于更大规模的SoC设计中。 ARM7系列广泛应用于多媒体和嵌入式设备,包括Internet设备、网络和调制解调器设备,以及移动电话、PDA等无线设备。
2.1.2 ARM微处理器系列 ARM9系列主要应用于引擎管理、仪器仪表、安全系统和机顶盒等领域。 ARM9系列简介 该系列包括ARM9TDMI、ARM920T和带有高速缓存处理器宏单元的ARM940T。除了兼容ARM7系列,而且能够更加灵活的设计。 ARM9系列主要应用于引擎管理、仪器仪表、安全系统和机顶盒等领域。
2.1.2 ARM微处理器系列 ARM9E系列主要应用于下一代无线设备、数字消费品、成像设备、工业控制、存储设备和网络设备等领域。 该系列为含有DSP指令集的综合处理器,包括ARM926EJ-S、带有高速缓存处理器宏单元的ARM966E-S/ARM946E-S。其内核在ARM7处理器内核的基础上使用了Jazelle增强技术,该技术支持一种新的Java操作状态,允许在硬件中执行Java字节码。 ARM9E系列主要应用于下一代无线设备、数字消费品、成像设备、工业控制、存储设备和网络设备等领域。
2.1.2 ARM微处理器系列 可以用于视频游戏机和高性能打印机等场合。 ARM10E系列简介 该系列包括ARM1020E和ARM1020E处理器核,其核心在于使用向量浮点(VFP)单元VFP10提供高性能的浮点解决方案,从而极大提高了处理器的整型和浮点运算性能。 可以用于视频游戏机和高性能打印机等场合。
2.1.2 ARM微处理器系列 主要应用于手提式通讯和消费电子类设备。 Xscale简介 Intel Xscale微控制器则提供全性能、高性价比、低功耗的解决方案,支持16位Thumb指令并集成数字信号处理(DSP)指令。 主要应用于手提式通讯和消费电子类设备。
2.2. ARM微处理器结构 2.2.1 RISC体系结构 1.嵌入式CISC微处理器 传统的CISC(Complex Instruction Set Computer,复杂指令集计算机)结构有其固有的缺点,即随着计算机技术的发展而不断引入新的复杂的指令集,为支持这些新增的指令,计算机的体系结构会越来越复杂,然而,在CISC指令集的各种指令中,其使用频率却相差悬殊,大约有20%的指令会被反复使用,占整个程序代码的80%。而余下的80%的指令却不经常使用,在程序设计中只占20%,显然,这种结构是不太合理的。
2.2.1 RISC体系结构 2. 嵌入式RISC微处理器 基于以上的不合理性,1979年美国加州大学伯克利分校提出了RISC(Reduced Instruction Set Computer,精简指令集计算机)的概念, RISC是精简指令集计算机,但RISC并非只是简单地去减少指令,而是把着眼点放在了如何使计算机的结构更加简单合理地提高运算速度上。RISC结构优先选取使用频最高的简单指令,抛弃复杂指令,固定指令长度,减少指令格式和寻址方式,以控制逻辑为主,不用或少用微码控制等措施来达到上述目的。
2.2.1 RISC体系结构 RISC体系结构应具有如下特点: 采用固定长度的指令格式,指令归整、简单、基本寻址方式有2~3种。 使用单周期指令,便于流水线操作执行。 大量使用寄存器,数据处理指令只对寄存器进行操作,只有加载/ 存储指令可以访问存储器,以提高指令的执行效率。 除此以外,ARM体系结构还采用了一些特别的技术,在保证高性能的前提下尽量缩小芯片的面积,并降低功耗.
2.2.1 RISC体系结构 RISC体系结构应具有如下特点: 所有的指令都可根据前面的执行结果决定是否被执行,从而提高指令的执行效率。 可用加载/存储指令批量传输数据,以提高数据的传输效率。 可在一条数据处理指令中同时完成逻辑处理和移位处理。 在循环处理中使用地址的自动增减来提高运行效率。
2.2.1 RISC体系结构 RISC和CISC之间的主要区别: 指令集 指 标 RISC CISC 指令集 一个周期执行一条指令,通过简单指令的组合实理复杂操作;指令长度固定。 指令长度不固定,执行需要多个周期。 流水线 流水线每周期前进一步。 指令的执行需要调用微代码的一个微程序。 寄存器 更多通用寄存器。 用于特定目的的专用寄存器。 Load/Store结构 独立的Load和Store指令完成数据在寄存器和外部存储器之间的传输。 处理器能够直接处理存储器中的数据。
2.2.2 ARM微处理器的寄存器结构 31个通用寄存器,包括程序计数器(PC指针),均为32位的寄存器。 ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄存器包括: 31个通用寄存器,包括程序计数器(PC指针),均为32位的寄存器。 6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位,目前只使用了其中的一部分。
2.2.2 ARM微处理器的寄存器结构 ARM处理器又有7种不同的处理器模式,在每一种处理器模式下均有一组相应的寄存器与之对应。 即在任意一种处理器模式下,可访问的寄存器包括15个通用寄存器(R0~R14)、1~2个状态寄存器和程序计数器。 在所有的寄存器中,有些是在7种处理器模式下共用的同一个物理寄存器,而有些寄存器则是在不同的处理器模式下有不同的物理寄存器。
2.2.3 ARM微处理器的指令结构 ARM微处理器在较新的体系结构中支持两种指令集:ARM指令集和Thumb指令集。 Thumb指令集为ARM指令集的功能子集,但与等价的ARM代码相比较,可节省30%~40%以上的存储空间,同时具备32位代码的所有优点。
2.3 ARM微处理器的工作状态 ARM微处理器的工作状态一般有两种,并可在两种状态之间切换: ARM状态,此时处理器执行32位的字对齐的ARM指令; Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令。 ARM指令集和Thumb指令集均有切换处理器状态的指令,并可在两种工作状态之间切换,但ARM微处理器在开始执行代码时,应该处于ARM状态。
2.3 ARM微处理器的工作状态 进入Thumb状态:当操作数寄存器的状态位(位0)为1时,可以采用执行BX指令的方法,使微处理器从ARM状态切换到Thumb状态。此外,当处理器处于Thumb状态时发生异常(如IRQ、FIQ、Undef、Abort、SWI等),则异常处理返回时,自动切换到Thumb状态。 进入ARM状态:当操作数寄存器的状态位为0时,执行BX指令时可以使微处理器从Thumb状态切换到ARM状态。此外,在处理器进行异常处理时,把PC指针放入异常模式链接寄存器中,并从异常向量地址开始执行程序,也可以使处理器切换到ARM状态。
2.4 ARM处理器状态 状态切换的一个例子 使用BX指令将ARM内核的操作状态在ARM状态和Thumb状态之间进行切换。 从Thumb状态切换到ARM状态的程序代码如下: 地址最低位为1,表示切换到Thumb状态 跳转地址标号 CODE16 LDR R0, =Lable BX R0 CODE32 Lable MOV R1, #10 CODE32 LDR R0, =Lable+1 BX R0 CODE16 Lable MOV R1, #12 ARM指令集 地址最低位为0,表示切换到ARM状态 Thumb 指令集 执行完BX指令,处理器切换到Thumb状态,开始执行Thumb指令 执行完BX指令,处理器切换到ARM状态,开始执行ARM指令 指令集关系 程序代码
2.4 ARM体系结构的存储器格式 大端格式 小端格式 ARM体系结构将存储器看作是从零地址开始的字节的线性组合。 从零字节到三字节放置第一个存储的字数据. 从第四个字节到第七个字节放置第二个存储的字数据,依次排列。 作为32位的微处理器,ARM体系结构所支持的最大寻址空间为4GB(232字节)。 ARM体系结构可以用两种方法存储字数据,称之为 大端格式 小端格式
2.4 ARM体系结构的存储器格式 大端格式 在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中,如图所示。 31 24 23 16 15 8 7 0 字地址 8 4 9 10 11 5 6 7 1 2 3 低地址 高地址
2.4 ARM体系结构的存储器格式 小端格式 在这种格式中,字数据的低字节存储在低地址中,而字数据的高字节则存放在高地址中,如图所示。 31 24 23 16 15 8 7 0 字地址 8 4 11 10 9 7 6 5 3 2 1· 低地址 高地址
2.4.1 指令长度及数据类型 ARM微处理器的指令长度可以是 ARM微处理器中支持字节(8位)、半字(16位)、字(32位)三种数据类型. 2.4.1 指令长度及数据类型 ARM微处理器的指令长度可以是 32位(在ARM状态下) 16位(在Thumb状态下) ARM微处理器中支持字节(8位)、半字(16位)、字(32位)三种数据类型. 其中,字需要4字节对齐(地址的低两位为0)、半字需要2字节对齐(地址的最低位为0)。
2.4.2 存储管理单元-MMU 将主存地址从虚拟存储空间映射到物理存储空间。 存储器访问权限控制。 设置虚拟存储空间的缓冲特性等。
2.4.2 存储管理单元-MMU 虚拟地址存储系统示意图 逻辑地址 对换 主存 辅助存储器 物理地址 MMU 微 处 理 器
2.4.2 存储管理单元-MMU ARM920T微处理器核的MMU采用了分页虚拟存储管理方式。它把虚拟存储空间分成一个个固定大小的页,把物理主存储的空间也分成同样大小的一个个页。 通过查询存放在主存中的页表,来实现虚拟地址到物理地址的转换。但由于页表存储在主存储中,查询页表所花的代价很大,因此,通常又采用快表技术(TLB translation lookaside buffer)来提高地址变换效率。
2.4.2 存储管理单元-MMU TLB技术中,将当前需要访问的地址变换条目存储在一个容量较小(通常8~16个字)、访问速度更快(与微处理器中通用寄存器速度相当)的存储器件中。当微处理器访问主存时,先在TLB中查找需要的地址变换条目,如果该条目不存在,再从存储在主存中的页表中查询,并添加到TLB中。 这样,当微处理器下一次又需要该地址变换条目时,可以从TLB中直接得到,从而提高了地址变换速度。
2.4.2 存储管理单元-MMU 表2-5是ARM920T的写出其CP15中与MMU操作相关的寄存器。设计者编程控制这些寄存器,则可以相应地控制MMU操作。 寄 存 器 作 用 寄存器C1中某些位 用于配置MMU中的一些操作 寄存器C2 保存主存中页表的基地址 寄存器C3 设置域(domain)的访问控制属性 寄存器C4 保留 寄存器C5 主存访问失效状态指示 寄存器C6 主存访问失效时的地址 寄存器C8 控制与清除TLB内容相关的操作 寄存器C10 控制与锁定TLB内容相关的操作
2.4.2 存储管理单元-MMU 1.禁止与使能MMU CP15的寄存器C1的位[0]用于设置禁止/使能MMU。C1的位[0]为0时,禁止MMU;当C1的位[0]为1时,使能MMU。下面指令实现了使能MMU。 MRC P15,0,R0,C1,0,0 ; C1的内容赋给R0 ORR R0,#0x1 ; 逻辑或操作 MCR P15,0,R0,C1,0,0 ;R0的内容赋给C1
2.4.2 存储管理单元-MMU 使能MMU时,其控制存储访问的过程是: 首先在TLB中查找虚拟地址,如果该虚拟地址对应的地址变换条目不在TLB中,则到页表中查询对应的地址变换条目,并把查询到的结果添加到TLB中。如果TLB已满,还需根据一定的淘汰算法进行替换。得到地址变换条目后,进行一下步骤的操作。
2.4.2 存储管理单元-MMU 禁止MMU时,所有的虚拟地址和物理地址是相等的,也不进行存储访问权限的控制。是否支持cache和写缓存由具体芯片设计确定。 在禁止/使能MMU时,应该注意以下几点。 使能MMU之前,要在内存中建立0号页表,同时CP15中的各相关寄存器必须完成初始化. 如果设计的物理地址与虚拟地址空间不相等,在禁止/使能MMU时,虚拟地址和物理地址的对应关系会改变,应清除cache中当前地址变换条目。 完成禁止/使能MMU代码的物理地址最好和虚拟地址相同。
2.4.2 存储管理单元-MMU 2.MMU中的地址变换过程 虚拟存储空间到物理存储空间的映射是以内存块为单位进行的。在页表或TLB中,每个地址变换条目记录了一个虚拟存储空间的存储块的基地址与物理存储空间的一个存储块基地址的对应关系。 ARM920T支持的存储块大小有一下几种: 段(section)是大小为1MB的存储块。 大页(large pages)是大小为64KB的存储块。 小页(small pages)是大小为4KB的存储块。 极小页(tiny pages)是大小为1KB的存储块。
2.4.2 存储管理单元-MMU 3.MMU中的存储访问权限控制 在MMU中,CP15的寄存器C1的R、S控制位和页表中地址转换条目中的访问权限控制位联合作用控制存储访问权限。 具体规则如表2-6所示。
2.4.2 存储管理单元-MMU AP S R 特权级时访问权限 用户级时访问权限 0b00 0 0 没有访问权限 1 0 只读 0 1 0 0 没有访问权限 1 0 只读 0 1 1 1 不可预知 0b01 X X 读/写 0b10 0b11
2.4.2 存储管理单元-MMU 4.MMU中的域 MMU中的域指的是一些段、大页或者小页的集合。ARM920T支持最大16个域,每个域的访问控制特性由CP15的寄存器C3中的两位来控制。 C3寄存器是32位的,每两位控制一个域,其控制编码如表2-7所示。
2.4.2 存储管理单元-MMU 表2-7 MMU中域访问控制字段编码及含义 控制位编码 访问类型 含 义 0b00 没有访问权限 含 义 0b00 没有访问权限 这时访问该域将产生访问失效 0b01 客户类型 根据页表中地址变换条目中的访问权限控制位决定时否允许特定的存储访问 0b10 保留 使用该值会产生不可预知的结果 0b11 管理者权限 不考虑页表中地址变换条件目中的访问权限控制位,这种情况下不会产生访问失效
2.4.2 存储管理单元-MMU 5.快表操作 从虚拟地址到物理地址的变换过程其实就是查询页表的过程,由于页表存放在主存储器中,这个查询代价很大。而程序在执行时其过程具有局部性,对页表中各存储单元的访问并不是随机的,在一段时间内,只局限在少数几个单元中。 因此,采用TLB技术可以提高存储系统的整体性能。
2.4.2 存储管理单元-MMU 6.存储访问失效 在ARM920T中,MMU可以产生4种类型的存储访问失效,即地址对齐失效、地址变换失效、域控制失效和访问权限控制失效。当发生存储访问失效时,存储系统可以中止3种存储访问,即cache内容预取、非缓冲的存储器访问操作和页表访问。
2.4.2 存储管理单元-MMU 有下面两种机制可以检测存储访问失效,并进而中止微处理器的执行。 (1)当MMU检测到存储访问失效时,它可以向微处理器报告该情况,并将存储访问失效的相关信息保存到寄存器C5和C6中。这种机制成为MMU失效。 (2)存储系统也可以向微处理器报告存储访问失效。这种机制称为外部存储访问中止(external abort)。 上述两种情况通称为存储访问中止(abort)。
2.4.2 存储管理单元-MMU 如果存储访问发生在数据访问周期,微处理器将产生数据访问中止异常。 如果存储访问发生在指令预取周期,当该指令执行时,微处理器将产生指令预取异常。 MMU中与存储访问失效相关的寄存器有两个: C5和C6。 C5为失效状态寄存器,C6为失效地址寄存器。
2.5 处理器模式 ARM微处理器支持7种运行模式,分别为: 用户模式(usr): ARM处理器正常的程序执行状态。 2.5 处理器模式 ARM微处理器支持7种运行模式,分别为: 用户模式(usr): ARM处理器正常的程序执行状态。 快速中断模式(fiq):用于高速数据传输或通道处理。 外部中断模式(irq):用于通用的中断处理。 管理模式(svc):操作系统使用的保护模式。 数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。 系统模式(sys):运行具有特权的操作系统任务。 未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。
2.5 处理器模式 特权模式 处理器模式 说明 备注 用户 (usr) 正常程序工作模式 不能直接切换到其它模式 系统 (sys) 用于支持操作系统的特权任务等 与用户模式类似,但具有可以直接切换到其它模式等特权 快中断 (fiq) 支持高速数据传输及通道处理 FIQ异常响应时进入此模式 中断 (irq) 用于通用中断处理 IRQ异常响应时进入此模式 管理 (svc) 操作系统保护代码 系统复位和软件中断响应时进入此模式 中止 (abt) 用于支持虚拟内存和/或存储器保护 在ARM7TDMI没有大用处 未定义 (und) 支持硬件协处理器的软件仿真 未定义指令异常响应时进入此模式 未定义 (und) 中止 (abt) 管理 (svc) 中断 (irq) 快中断 (fiq) 系统 (sys) 除用户模式外,其它模式均为特权模式。ARM内部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。
2.5 处理器模式 异常模式 处理器模式 说明 备注 用户 (usr) 正常程序工作模式 不能直接切换到其它模式 系统 (sys) 用于支持操作系统的特权任务等 与用户模式类似,但具有可以直接切换到其它模式等特权 快中断 (fiq) 支持高速数据传输及通道处理 FIQ异常响应时进入此模式 中断 (irq) 用于通用中断处理 IRQ异常响应时进入此模式 管理 (svc) 操作系统保护代码 系统复位和软件中断响应时进入此模式 中止 (abt) 用于支持虚拟内存和/或存储器保护 在ARM7TDMI没有大用处 未定义 (und) 支持硬件协处理器的软件仿真 未定义指令异常响应时进入此模式 这五种模式称为异常模式。它们除了可以通过程序切换进入外,也可以由特定的异常进入。当特定的异常出现时,处理器进入相应的模式。每种异常模式都有一些独立的寄存器,以避免异常退出时用户模式的状态不可靠。 未定义 (und) 中止 (abt) 管理 (svc) 中断 (irq) 快中断 (fiq)
2.5 处理器模式 用户和系统模式 这两种模式都不能由异常进入,而且它们使用完全相同的寄存器组。 2.5 处理器模式 用户和系统模式 处理器模式 说明 备注 用户 (usr) 正常程序工作模式 不能直接切换到其它模式 系统 (sys) 用于支持操作系统的特权任务等 与用户模式类似,但具有可以直接切换到其它模式等特权 快中断 (fiq) 支持高速数据传输及通道处理 FIQ异常响应时进入此模式 中断 (irq) 用于通用中断处理 IRQ异常响应时进入此模式 管理 (svc) 操作系统保护代码 系统复位和软件中断响应时进入此模式 中止 (abt) 用于支持虚拟内存和/或存储器保护 在ARM7TDMI没有大用处 未定义 (und) 支持硬件协处理器的软件仿真 未定义指令异常响应时进入此模式 系统 (sys) 用户 (usr) 这两种模式都不能由异常进入,而且它们使用完全相同的寄存器组。 系统模式是特权模式,不受用户模式的限制。操作系统在该模式下访问用户模式的寄存器就比较方便,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。
2.5 处理器模式 处理器启动时的模式转换图 主要完成各模式的堆栈设置,注意不要进入用户模式 复位后 一般为用户模式User 缺省模式 2.5 处理器模式 处理器启动时的模式转换图 多种特权模式变化 用户程序的运行模式 管理模式SVC (Supervisor) 主要完成各模式的堆栈设置,注意不要进入用户模式 复位后 缺省模式 一般为用户模式User
2.6 寄存器组织 ARM微处理器中的寄存器不能被同时访问,具体哪些寄存器是可编程访问的,取决微处理器的工作状态及具体的运行模式。 但在任何时候,通用寄存器R14~R0、程序计数器PC、一个或两个状态寄存器都是可访问的。
2.6.1 ARM状态下的寄存器组织 各模式下实际访问的寄存器 寄存器类别 寄存器在汇编中的名称 用户 系统 管理 中止 未定义 中断 快中断 通用寄存器和程序计数器 R0(a1) R0 R1(a2) R1 R2(a3) R2 R3(a4) R3 R4(v1) R4 R5(v2) R5 R6(v3) R6 R7(v4) R7 R8(v5) R8 R8_fiq R9(SB,v6) R9 R9_fiq R10(SL,v7) R10 R10_fiq R11(FP,v8) R11 R11_fiq R12(IP) R12 R12_fiq R13(SP) R13 R13_svc R13_abt R13_und R13_irq R13_fiq R14(LR) R14 R14_svc R14_abt R14_und R14_irq R14_fiq R15(PC) R15 状态寄存器 CPSR SPSR 无 SPSR_abt SPSR_und SPSR_irq SPSR_fiq
2.6.1 ARM状态下的寄存器组织 所有的37个寄存器,分成两大类: 31个通用32位寄存器; 6个状态寄存器。 各模式下实际访问的寄存器 寄存器类别 寄存器在汇编中的名称 各模式下实际访问的寄存器 用户 系统 管理 中止 未定义 中断 快中断 通用寄存器和程序计数器 R0(a1) R0 R1(a2) R1 R2(a3) R2 R3(a4) R3 R4(v1) R4 R5(v2) R5 R6(v3) R6 R7(v4) R7 R8(v5) R8 R8_fiq R9(SB,v6) R9 R9_fiq R10(SL,v7) R10 R10_fiq R11(FP,v8) R11 R11_fiq R12(IP) R12 R12_fiq R13(SP) R13 R13_svc R13_abt R13_und R13_irq R13_fiq R14(LR) R14 R14_svc R14_abt R14_und R14_irq R14_fiq R15(PC) R15 状态寄存器 CPSR SPSR 无 SPSR_abt SPSR_und SPSR_irq SPSR_fiq R15 R14_fiq R14_irq R14_und R14_abt R14_svc R14 R13_fiq R13_irq R13_und R13_abt R13_svc R13 R12_fiq R12 R11_fiq R11 R10_fiq R10 R9_fiq R9 R8_fiq R8 R7 R6 R5 R4 R3 R2 R1 R0 R15 R14_fiq R14_irq R14_und R14_abt R14_svc R14 R13_fiq R13_irq R13_und R13_abt R13_svc R13 R12_fiq R12 R11_fiq R11 R10_fiq R10 R9_fiq R9 R8_fiq R8 R7 R6 R5 R4 R3 R2 R1 R0 所有的37个寄存器,分成两大类: 31个通用32位寄存器; 6个状态寄存器。 SPSR_fiq SPSR_irq SPSR_und SPSR_abt CPSR
2.6.1 ARM状态下的寄存器组织 各模式下实际访问的寄存器 未定义 快中断 系统 管理 用户 中断 中止 寄存器类别 寄存器在汇编中的名称 各模式下实际访问的寄存器 用户 系统 管理 中止 未定义 中断 快中断 通用寄存器和程序计数器 R0(a1) R0 R1(a2) R1 R2(a3) R2 R3(a4) R3 R4(v1) R4 R5(v2) R5 R6(v3) R6 R7(v4) R7 R8(v5) R8 R8_fiq R9(SB,v6) R9 R9_fiq R10(SL,v7) R10 R10_fiq R11(FP,v8) R11 R11_fiq R12(IP) R12 R12_fiq R13(SP) R13 R13_svc R13_abt R13_und R13_irq R13_fiq R14(LR) R14 R14_svc R14_abt R14_und R14_irq R14_fiq R15(PC) R15 状态寄存器 CPSR SPSR 无 SPSR_abt SPSR_und SPSR_irq SPSR_fiq SPSR_und CPSR R15 R14_und R13_und R12 R11 R10 R9 R8 R7 R6 R5 R4 R3 R2 R1 R0 未定义 SPSR_fiq CPSR R15 R14_fiq R13_fiq R12_fiq R11_fiq R10_fiq R9_fiq R8_fiq R7 R6 R5 R4 R3 R2 R1 R0 快中断 SPSR_abt CPSR R15 R14_abt R13_abt R12 R11 R10 R9 R8 R7 R6 R5 R4 R3 R2 R1 R0 中止 无 CPSR R15 R14 R13 R12 R11 R10 R9 R8 R7 R6 R5 R4 R3 R2 R1 R0 系统 SPSR_abt CPSR R15 R14_svc R13_svc R12 R11 R10 R9 R8 R7 R6 R5 R4 R3 R2 R1 R0 管理 无 CPSR R15 R14 R13 R12 R11 R10 R9 R8 R7 R6 R5 R4 R3 R2 R1 R0 用户 SPSR_irq CPSR R15 R14_irq R13_irq R12 R11 R10 R9 R8 R7 R6 R5 R4 R3 R2 R1 R0 中断
2.6.1 ARM状态下的寄存器组织 1.通用寄存器 通用寄存器包括R0~R15,可以分为三类: 未分组寄存器R0~R7; 程序计数器PC(R15)。
2.6.1 ARM状态下的寄存器组织 寄存器类别 寄存器在汇编中的名称 各模式下实际访问的寄存器 用户 系统 管理 中止 未定义 中断 快中断 通用寄存器和程序计数器 R0(a1) R0 R1(a2) R1 R2(a3) R2 R3(a4) R3 R4(v1) R4 R5(v2) R5 R6(v3) R6 R7(v4) R7 R8(v5) R8 R8_fiq R9(SB,v6) R9 R9_fiq R10(SL,v7) R10 R10_fiq R11(FP,v8) R11 R11_fiq R12(IP) R12 R12_fiq R13(SP) R13 R13_svc R13_abt R13_und R13_irq R13_fiq R14(LR) R14 R14_svc R14_abt R14_und R14_irq R14_fiq R15(PC) R15 状态寄存器 CPSR SPSR 无 SPSR_abt SPSR_und SPSR_irq SPSR_fiq R13_fiq R13_irq R13_und R13_abt R13_svc R13 R12_fiq R12 R11_fiq R11 R10_fiq R10 R9_fiq R9 R8_fiq R8 R7 R6 R5 R4 R3 R2 R1 R0 在汇编语言中寄存器R0~R13为保存数据或地址值的通用寄存器。它们是完全通用的寄存器,不会被体系结构作为特殊用途,并且可用于任何使用通用寄存器的指令。
2.6.1 ARM状态下的寄存器组织 2.未分组寄存器R0~R7 在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途,因此,在中断或异常处理进行运行模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计时应引起注意。
2.6.1 ARM状态下的寄存器组织 其中R0~R7为未分组的寄存器,也就是说对于任何处理器模式,这些寄存器都对应于相同的32位物理寄存器。 寄存器类别 寄存器在汇编中的名称 各模式下实际访问的寄存器 用户 系统 管理 中止 未定义 中断 快中断 通用寄存器和程序计数器 R0(a1) R0 R1(a2) R1 R2(a3) R2 R3(a4) R3 R4(v1) R4 R5(v2) R5 R6(v3) R6 R7(v4) R7 R8(v5) R8 R8_fiq R9(SB,v6) R9 R9_fiq R10(SL,v7) R10 R10_fiq R11(FP,v8) R11 R11_fiq R12(IP) R12 R12_fiq R13(SP) R13 R13_svc R13_abt R13_und R13_irq R13_fiq R14(LR) R14 R14_svc R14_abt R14_und R14_irq R14_fiq R15(PC) R15 状态寄存器 CPSR SPSR 无 SPSR_abt SPSR_und SPSR_irq SPSR_fiq R13_fiq R13_irq R13_und R13_abt R13_svc R13 R12_fiq R12 R11_fiq R11 R10_fiq R10 R9_fiq R9 R8_fiq R8 R7 R6 R5 R4 R3 R2 R1 R0 R7 R6 R5 R4 R3 R2 R1 R0 其中R0~R7为未分组的寄存器,也就是说对于任何处理器模式,这些寄存器都对应于相同的32位物理寄存器。
2.6.1 ARM状态下的寄存器组织 3.分组寄存器R8~R14 对于分组寄存器,他们每一次所访问的物理寄存器与处理器当前的运行模式有关。 对于R8~R12来说,每个寄存器对应两个不同的物理寄存器,当使用fiq模式时,访问寄存器R8_fiq~R12_fiq;当使用除fiq模式以外的其他模式时,访问寄存器R8_usr~R12_usr。 对于R13、R14来说,每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式。 采用以下的记号来区分不同的物理寄存器: R13_<mode> R14_<mode> 其中,mode为以下几种模式之一:usr、fiq、irq、svc、abt、und。
2.6.1 ARM状态下的寄存器组织 寄存器类别 寄存器在汇编中的名称 各模式下实际访问的寄存器 用户 系统 管理 中止 未定义 中断 快中断 通用寄存器和程序计数器 R0(a1) R0 R1(a2) R1 R2(a3) R2 R3(a4) R3 R4(v1) R4 R5(v2) R5 R6(v3) R6 R7(v4) R7 R8(v5) R8 R8_fiq R9(SB,v6) R9 R9_fiq R10(SL,v7) R10 R10_fiq R11(FP,v8) R11 R11_fiq R12(IP) R12 R12_fiq R13(SP) R13 R13_svc R13_abt R13_und R13_irq R13_fiq R14(LR) R14 R14_svc R14_abt R14_und R14_irq R14_fiq R15(PC) R15 状态寄存器 CPSR SPSR 无 SPSR_abt SPSR_und SPSR_irq SPSR_fiq 寄存器R8~R14为分组寄存器。它们所对应的物理寄存器取决于当前的处理器模式,几乎所有允许使用通用寄存器的指令都允许使用分组寄存器 R14_fiq R14_irq R14_und R14_abt R14_svc R14 R13_fiq R13_irq R13_und R13_abt R13_svc R13 R12_fiq R12 R11_fiq R11 R10_fiq R10 R9_fiq R9 R8_fiq R8
2.6.1 ARM状态下的寄存器组织 寄存器类别 寄存器在汇编中的名称 各模式下实际访问的寄存器 用户 系统 管理 中止 未定义 中断 快中断 通用寄存器和程序计数器 R0(a1) R0 R1(a2) R1 R2(a3) R2 R3(a4) R3 R4(v1) R4 R5(v2) R5 R6(v3) R6 R7(v4) R7 R8(v5) R8 R8_fiq R9(SB,v6) R9 R9_fiq R10(SL,v7) R10 R10_fiq R11(FP,v8) R11 R11_fiq R12(IP) R12 R12_fiq R13(SP) R13 R13_svc R13_abt R13_und R13_irq R13_fiq R14(LR) R14 R14_svc R14_abt R14_und R14_irq R14_fiq R15(PC) R15 状态寄存器 CPSR SPSR 无 SPSR_abt SPSR_und SPSR_irq SPSR_fiq 寄存器R8~R12有两个分组的物理寄存器。一个用于除FIQ模式之外的所有寄存器模式,另一个用于FIQ模式。这样在发生FIQ中断后,可以加速FIQ的处理速度。 R12_fiq R12 R11_fiq R11 R10_fiq R10 R9_fiq R9 R8_fiq R8
2.6.1 ARM状态下的寄存器组织 寄存器R13、R14分别有6个分组的物理寄存器。一个用于用户和系统模式,其余5个分别用于5种异常模式。 寄存器类别 寄存器在汇编中的名称 各模式下实际访问的寄存器 用户 系统 管理 中止 未定义 中断 快中断 通用寄存器和程序计数器 R0(a1) R0 R1(a2) R1 R2(a3) R2 R3(a4) R3 R4(v1) R4 R5(v2) R5 R6(v3) R6 R7(v4) R7 R8(v5) R8 R8_fiq R9(SB,v6) R9 R9_fiq R10(SL,v7) R10 R10_fiq R11(FP,v8) R11 R11_fiq R12(IP) R12 R12_fiq R13(SP) R13 R13_svc R13_abt R13_und R13_irq R13_fiq R14(LR) R14 R14_svc R14_abt R14_und R14_irq R14_fiq R15(PC) R15 状态寄存器 CPSR SPSR 无 SPSR_abt SPSR_und SPSR_irq SPSR_fiq 寄存器R13、R14分别有6个分组的物理寄存器。一个用于用户和系统模式,其余5个分别用于5种异常模式。 R14_fiq R14_irq R14_und R14_abt R14_svc R14 R13_fiq R13_irq R13_und R13_abt R13_svc R13
2.6.1 ARM状态下的寄存器组织 寄存器R13在ARM指令中常用作堆栈指针,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。 而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。
堆栈指针寄存器R13(SP) 寄存器类别 寄存器在汇编中的名称 各模式下实际访问的寄存器 用户 系统 管理 中止 未定义 中断 快中断 通用寄存器和程序计数器 R0(a1) R0 R1(a2) R1 R2(a3) R2 R3(a4) R3 R4(v1) R4 R5(v2) R5 R6(v3) R6 R7(v4) R7 R8(v5) R8 R8_fiq R9(SB,v6) R9 R9_fiq R10(SL,v7) R10 R10_fiq R11(FP,v8) R11 R11_fiq R12(IP) R12 R12_fiq R13(SP) R13 R13_svc R13_abt R13_und R13_irq R13_fiq R14(LR) R14 R14_svc R14_abt R14_und R14_irq R14_fiq R15(PC) R15 状态寄存器 CPSR SPSR 无 SPSR_abt SPSR_und SPSR_irq SPSR_fiq 寄存器R13常作为堆栈指针(SP)。在ARM指令集当中,没有以特殊方式使用R13的指令或其它功能,只是习惯上都这样使用。但是在Thumb指令集中存在使用R13的指令。
2.6.1 ARM状态下的寄存器组织 R14也称作子程序链接寄存器(Subroutine Link Register)或链接寄存器LR。 当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)的备份。 其他情况下,R14用作通用寄存器。与之类似,当发生中断或异常时,对应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15的返回值。
链接寄存器R14(LR) R14为链接寄存器(LR),在结构上有两个特殊功能: 在每种模式下,模式自身的R14版本用于保存子程序返回地址; 寄存器类别 寄存器在汇编中的名称 各模式下实际访问的寄存器 用户 系统 管理 中止 未定义 中断 快中断 通用寄存器和程序计数器 R0(a1) R0 R1(a2) R1 R2(a3) R2 R3(a4) R3 R4(v1) R4 R5(v2) R5 R6(v3) R6 R7(v4) R7 R8(v5) R8 R8_fiq R9(SB,v6) R9 R9_fiq R10(SL,v7) R10 R10_fiq R11(FP,v8) R11 R11_fiq R12(IP) R12 R12_fiq R13(SP) R13 R13_svc R13_abt R13_und R13_irq R13_fiq R14(LR) R14 R14_svc R14_abt R14_und R14_irq R14_fiq R15(PC) R15 状态寄存器 CPSR SPSR 无 SPSR_abt SPSR_und SPSR_irq SPSR_fiq R14为链接寄存器(LR),在结构上有两个特殊功能: 在每种模式下,模式自身的R14版本用于保存子程序返回地址; 当发生异常时,将R14对应的异常模式版本设置为异常返回地址(有些异常有一个小的固定偏移量)。
2.6.1 ARM状态下的寄存器组织 寄存器R14常用在如下的情况: 在每一种运行模式下,都可用R14保存子程序的返回地址,当用BL或BLX指令调用子程序时,将PC的当前值拷贝给R14,执行完子程序后,又将R14的值拷贝回PC,即可完成子程序的调用返回。
2.6.1 ARM状态下的寄存器组织 以上的描述可用指令完成: (1)执行以下任意一条指令: MOV PC,LR BX LR STMFD SP!,{<Regs>,LR} // FD(Full Descending) 对应的,使用以下指令可以完成子程序返回: LDMFD SP!,{<Regs>,PC}
2.6.1 ARM状态下的寄存器组织 R14寄存器与子程序调用 操作流程 1.程序A执行过程中调用程序B; Lable 程序A 程序B R14 1.程序A执行过程中调用程序B; Lable ??? 2.程序跳转至标号Lable,执行程序B。同时硬件将“BL Lable”指令的下一条指令所在地址存入R14; BL Lable 地址A ??? MOV PC,LR R14(地址A) 3.程序B执行最后,将R14寄存器的内容放入PC,返回程序A;
2.6.1 ARM状态下的寄存器组织 R14寄存器与异常发生 异常发生时,程序要跳转至异常服务程序,对返回地址的处理与子程序调用类似,都是由硬件完成的。区别在于有些异常有一个小常量的偏移。
2.6.1 ARM状态下的寄存器组织 R14寄存器注意要点 当发生异常嵌套时,这些异常之间可能会发生冲突。 例如:如果用户在用户模式下执行程序时发生了IRQ中断,用户模式寄存器不会被破坏。但是如果允许在IRQ模式下的中断处理程序重新使能IRQ中断,并且发生了嵌套的IRQ中断时,外部中断处理程序保存在R14_irq中的任何值都将被嵌套中断的返回地址所覆盖。
2.6.1 ARM状态下的寄存器组织 R14寄存器注意要点 1.执行用户模式下的程序; 3. IRQ服务程序A执行完毕,将R14_irq寄存器的内容减去某个常量后存入PC,返回之前被中断的程序; R14 R14_irq 用户模式下的程序 IRQ模式下的程序A 2.发生IRQ中断,硬件将某个地址存入IRQ模式下的R14_irq寄存器,用户模式下的R14没有被破坏; a B ... X A 地址A return 地址A 未被破坏
2.6.1 ARM状态下的寄存器组织 R14寄存器注意要点 R14_irq 用户模式下的程序 IRQ模式下的程序A IRQ模式下的程序B 6. 在程序B返回到程序A,然后在返回到用户模式下被中断的程序时,发生错误,将不能正确返回; 3. IRQ服务程序A执行完毕,将R14_irq寄存器的内容减去某个常量后存入PC,返回之前被中断的程序; 5. 硬件将返回地址保存在R14_irq寄存器中,原来保存的返回地址将被覆盖,造成错误; 1.执行用户模式下的程序; 解决办法是确保R14的对应版本在发生中断嵌套时不再保存任何有意义的值(将R14入栈),或者切换到其它处理器模式下。 4. 如果在IRQ处理程序中打开IRQ中断,并且再次发生IRQ中断,或者调用子程序; 2.发生IRQ中断,硬件将某个地址存入IRQ模式下的R14_irq寄存器,用户模式下的R14没有被破坏; a a B ... X A 地址A B ... X A 地址B return return return 地址A 地址B 未被破坏 被破坏
2.6.1 ARM状态下的寄存器组织 4.程序计数器PC 寄存器R15用作程序计数器(PC)。 在Thumb状态下,位[0]为0,位[31:1]用于保存PC; 由于ARM体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节。
程序计数器R15(PC) 寄存器R15常作为程序计数器(PC )。 寄存器类别 寄存器在汇编中的名称 各模式下实际访问的寄存器 用户 系统 管理 中止 未定义 中断 快中断 通用寄存器和程序计数器 R0(a1) R0 R1(a2) R1 R2(a3) R2 R3(a4) R3 R4(v1) R4 R5(v2) R5 R6(v3) R6 R7(v4) R7 R8(v5) R8 R8_fiq R9(SB,v6) R9 R9_fiq R10(SL,v7) R10 R10_fiq R11(FP,v8) R11 R11_fiq R12(IP) R12 R12_fiq R13(SP) R13 R13_svc R13_abt R13_und R13_irq R13_fiq R14(LR) R14 R14_svc R14_abt R14_und R14_irq R14_fiq R15(PC) R15 状态寄存器 CPSR SPSR 无 SPSR_abt SPSR_und SPSR_irq SPSR_fiq 寄存器R15常作为程序计数器(PC )。 R15虽然也可用作通用寄存器,但一般不这么使用,因为对R15的使用有一些特殊的限制,当违反了这些限制时,程序的执行结果是未知的。
程序计数器R15(PC) 寄存器类别 寄存器在汇编中的名称 各模式下实际访问的寄存器 用户 系统 管理 中止 未定义 中断 快中断 通用寄存器和程序计数器 R0(a1) R0 R1(a2) R1 R2(a3) R2 R3(a4) R3 R4(v1) R4 R5(v2) R5 R6(v3) R6 R7(v4) R7 R8(v5) R8 R8_fiq R9(SB,v6) R9 R9_fiq R10(SL,v7) R10 R10_fiq R11(FP,v8) R11 R11_fiq R12(IP) R12 R12_fiq R13(SP) R13 R13_svc R13_abt R13_und R13_irq R13_fiq R14(LR) R14 R14_svc R14_abt R14_und R14_irq R14_fiq R15(PC) R15 状态寄存器 CPSR SPSR 无 SPSR_abt SPSR_und SPSR_irq SPSR_fiq 寄存器CPSR为程序状态寄存器,在异常模式中,另外一个寄存器“程序状态保存寄存器(SPSR)”可以被访问。每种异常都有自己的SPSR,在因为异常事件而进入异常时它保存CPSR的当前值,异常退出时可通过它恢复CPSR。
2.6.2 Thumb状态下的寄存器组织 8个通用寄存器R0~R7; 程序计数器(PC); 堆栈指针(SP); 链接寄存器(LR); Thumb状态寄存器集是ARM状态集的子集,程序员可以直接访问的寄存器为: 8个通用寄存器R0~R7; 程序计数器(PC); 堆栈指针(SP); 链接寄存器(LR); 有条件访问程序状态寄存器( CPSR)。
2.6.2 Thumb状态下的寄存器组织 CPSR 状态寄存器 R15 PC R14_fiq R14_irq R14_und R14_abt R14_svc R14 LR R13_fiq R13_irq R13_und R13_abt R13_svc R13 SP R7 R7(v4,wr) R6 R6(v3) R5 R5(v2) R4 R4(v1) R3 R3(a4) R2 R2(a3) R1 R1(a2) R0 R0(a1) 通用寄存器和程序计数器 快中断 中断 未定义 中止 管理 系统 用户 各模式下实际访问的寄存器 寄存器在汇编中的名称 寄存器类别 注意:括号内为ATPCS中寄存器的命名,可以使用RN汇编伪指令将寄存器定义多个名字。其中ADS1.2的汇编程序直接支持这些名称,但注意a1~a4,v1~v4必须用小写。
2.6.2 Thumb状态下的寄存器组织 CPSR 状态寄存器 R15 PC R14_fiq R14_irq R14_und R14_abt R14_svc R14 LR R13_fiq R13_irq R13_und R13_abt R13_svc R13 SP R7 R7(v4,wr) R6 R6(v3) R5 R5(v2) R4 R4(v1) R3 R3(a4) R2 R2(a3) R1 R1(a2) R0 R0(a1) 通用寄存器和程序计数器 快中断 中断 未定义 中止 管理 系统 用户 各模式下实际访问的寄存器 寄存器在汇编中的名称 寄存器类别 R7 R6 R5 R4 R3 R2 R1 R0 在汇编语言中寄存器R0~R7为保存数据或地址值的通用寄存器。对于任何处理器模式,它们中的每一个都对应于相同的32为物理寄存器。它们是完全通用的寄存器,不会被体系结构作为特殊的用途,并且可用于任何使用通用寄存器的指令。
Thumb状态下的堆栈指针寄存器(SP) CPSR 状态寄存器 R15 PC R14_fiq R14_irq R14_und R14_abt R14_svc R14 LR R13_fiq R13_irq R13_und R13_abt R13_svc R13 SP R7 R7(v4,wr) R6 R6(v3) R5 R5(v2) R4 R4(v1) R3 R3(a4) R2 R2(a3) R1 R1(a2) R0 R0(a1) 通用寄存器和程序计数器 快中断 中断 未定义 中止 管理 系统 用户 各模式下实际访问的寄存器 寄存器在汇编中的名称 寄存器类别 堆栈指针SP对应ARM状态的寄存器R13。每个异常模式都有其自身的SP分组版本,SP通常指向各异常模式所专用的堆栈。 注意:在发生异常时,处理器自动进入ARM状态。 R13_fiq R13_irq R13_und R13_abt R13_svc R13
Thumb状态下的链接寄存器R14(LR) CPSR 状态寄存器 R15 PC R14_fiq R14_irq R14_und R14_abt R14_svc R14 LR R13_fiq R13_irq R13_und R13_abt R13_svc R13 SP R7 R7(v4,wr) R6 R6(v3) R5 R5(v2) R4 R4(v1) R3 R3(a4) R2 R2(a3) R1 R1(a2) R0 R0(a1) 通用寄存器和程序计数器 快中断 中断 未定义 中止 管理 系统 用户 各模式下实际访问的寄存器 寄存器在汇编中的名称 寄存器类别 链接寄存器LR对应ARM状态寄存器R14,在结构上有两个特殊功能,详见“ARM状态下的链接寄存器LR”。 注意:在发生异常时,处理器自动进入ARM状态。 R14_fiq R14_irq R14_und R14_abt R14_svc R14
2.6.2 Thumb状态下的寄存器组织 在Thumb状态中访问高寄存器 在Thumb状态中,高寄存器(R8~R15)不是标准寄存器集的一部分。汇编语言程序员对它们的访问受到限制,但可以将它们用于快速暂存。 可以使用MOV、CMP和ADD指令对高寄存器操作。
2.6.2 Thumb状态下的寄存器组织 ARM状态和Thumb状态之间寄存器的关系 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)。
Thumb状态寄存器在ARM状态寄存器上的映射 堆栈指针 (R13) 连接寄存器 (R14) 程序计数器 (R15) 低寄存器 高寄存器
每个异常模式带有一个备份程序状态寄存器,用于保存在异常事件发生之前的CPSR;CPSR和SPSR通过特殊指令进行访问。 2.6.3 程序状态寄存器 程序状态寄存器—CPSR(1)+SPSR(5) CPSR反映了当前处理器的状态: 4个条件代码标志; 2个中断控制位; 5个对当前处理器模式进行编码的位; 1个指示当前执行指令的工作状态位; 保留位。 每个异常模式带有一个备份程序状态寄存器,用于保存在异常事件发生之前的CPSR;CPSR和SPSR通过特殊指令进行访问。 SPSR:备份程序状态字,保存异常事件发 生之前的CPSR.
当进行加法/减法运算,并且发生有符号溢出时V=1,否则V=0,其它指令V通常不变。 2.6.3 程序状态寄存器 当进行加法运算,并且最高位产生进位时C=1,否则C=0。 当进行减法运算,并且最高位产生借位时C=0,否则C=1。 对于移位操作指令,C为从最高位最后移出的值,其它指令C通常不变; 大多数“数值处理指令”可以选择是否影响条件代码标志位(指令带S后缀);但有些指令执行总是影响条件代码标志。 所有ARM指令都可按条件来执行,而Thumb指令中只有分支指令可按条件执行。 当进行加法/减法运算,并且发生有符号溢出时V=1,否则V=0,其它指令V通常不变。 运算结果的最高位反映在该标志位。对于有符号二进制补码,结果为负数时N=1,结果为正数或零时N=0; CPSR寄存器的格式 条件代码标志 保留 控制位 指令结果为0时Z=1(表示比较结果“相等”),否则Z=0; N Z C V — I M0 M1 M2 M3 M4 T F . . . 31 30 29 28 27 26 8 7 6 5 4 3 2 1 0 N Z C V I F T 溢出标志 保留位被保留将来使用。为了提高程序的可移植性,当改变CPSR标志和控制位时,请不要改变这些保留位。另外,请确保您程序的运行不受保留位的值影响,因为将来的处理器可能会将这些位设置为1或者0。 进位或借位扩展 模式位 状态位 零 FIQ禁止 负或小于 IRQ禁止
CPSR模式位设置表 M[4:0] 模式 10000 用户 10111 中止 10001 快中断 11011 未定义 10010 中断 11111 系统 10011 管理 注意:不是所有模式位的组合都定义了有效的处理器模式,如果使用了错误的设置,将引起一个无法恢复的错误。
2.7 异常(Exceptions) 当正常的程序执行流程发生暂时的停止时,称之为异常。 例如处理一个外部的中断请求。在处理异常之前,当前处理器的状态必须保留,这样当异常处理完成之后,当前程序可以继续执行。 处理器允许多个异常同时发生,它们将会按固定的优先级进行处理。 ARM体系结构中的异常,与8位/16位体系结构的中断有很大的相似之处,但异常与中断的概念并不完全等同。
2.7.1 ARM体系结构所支持的异常类型 异常类型 模式 正常地址 复位 管理 0x00000000 未定义指令 未定义 软件中断(SWI) 0x00000008 预取中止(取指令存储器中止) 中止 0x0000000C 数据中止(数据访问存储器中止) 0x00000010 IRQ(中断) IRQ 0x00000018 FIQ(快速中断) FIQ 0x0000001C 2.7.2 异常优先级
2.7.2 异常优先级 当多个异常同时发生时,ARM9处理器将按照异常的优先级高低顺序处理,异常优先级由高到低的排列次序如表所示。 异常类型 复位 1(最高优先级) 数据中止 2 FIQ 3 IRQ 4 预取中止 5 未定义指令 6 SWI 7(最低优先级) 优先级降低
2.7.3 异常的响应及返回 异常发生会使得正常的程序流程被暂时停止,例如ARM9处理器响应IRQ异常。 处理器进入异常处理程序前,应该保存其当前的状态,以便当异常处理程序完成后,处理器能回到原来程序的断点处继续执行。
2.7.3 异常的响应及返回 对异常的响应 (1)将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。 若异常是从ARM状态进入,LR寄存器中保存的是下一条指令的地址(当前PC+4或PC+8,与异常的类型有关); 若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量,这样,异常处理程序就不需要确定异常是从何种状态进入的。
2.7.3 异常的响应及返回 (2)将CPSR复制到相应的SPSR中。 (3)根据异常类型,强制设置CPSR的运行模式位。 2.7.3 异常的响应及返回 (2)将CPSR复制到相应的SPSR中。 (3)根据异常类型,强制设置CPSR的运行模式位。 (4)强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处,同时设置中断禁止位,以禁止中断发生。 注意:如果异常发生时,处理器处于Thumb状态,则当异常向量地址加载入PC时,处理器自动切换到ARM状态。
2.7.3 异常的响应及返回 异常返回 异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回: 2.7.3 异常的响应及返回 异常返回 异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回: ⑴将连接寄存器LR的值减去相应的偏移量后送到PC中。 ⑵将SPSR复制回CPSR中。 ⑶若在进入异常处理时设置了中断禁止位,要在此清除。 注意:恢复CPSR的动作会将T、F和I位自动恢复为异常发生前的值。
2.7.3 异常的响应及返回 表2-14总结了进入异常处理时保存在相应R14中的PC值,及在退出异常处理时推荐使用的指令。 异常 返回指令 2.7.3 异常的响应及返回 表2-14总结了进入异常处理时保存在相应R14中的PC值,及在退出异常处理时推荐使用的指令。 异常 返回指令 以前的状态 注意 ARM R14_x Thumb R14_x BL MOV PC,R14 PC+4 PC+2 1 SWI MOVS PC,R14_svc UDEF MOVS PC,R14_und FIQ SUBS PC,R14_fiq,#4 2 IRQ SUBS PC,R14_irq,#4 PABT SUBS PC,R14_abt,#4 DABT SUBS PC,R14_abt,#8 PC+8 3 RESET NA - 4
2.7.4 应用程序中的异常处理 当系统运行时,异常可能会随时发生,为保证在ARM处理器发生异常时不至于处于未知状态,在应用程序的设计中,首先要进行异常处理,采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序,当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,从而跳转到异常处理程序,当异常处理完成以后,返回到主程序继续执行。
图示进入异常过程 2. 用户程序运行时发生IRQ中断,硬件完成以下动作: 程序A IRQ服务程序 系统模式 IRQ模式 程序 寄存器组 1. 程序在系统模式下运行用户程序,假定当前处理器状态为Thumb状态、允许IRQ中断; Jump 将CPSR寄存器内容存入IRQ模式的SPSR寄存器 置位I位(禁止IRQ中断) 清零T位(进入ARM状态) 设置MOD位,切换处理器模式至IRQ模式 LR_sys SPSR_irq LR_irq LR PC CPSR SPSR SYS 1 ? . . . MOD T F I N Z C V BackAddr JumpAddr 将下一条指令的地址存入IRQ模式的LR寄存器 IRQ ? 1 . . . SYS 1 ? . . . 将跳转地址存入PC,实现跳转 “?”表示对该位不关心
图示退出异常过程 在异常处理结束后,异常处理程序完成以下动作: 将SPSR寄存器的值复制回CPSR寄存器; 程序A IRQ服务程序 系统模式 IRQ模式 程序 寄存器组 将SPSR寄存器的值复制回CPSR寄存器; Jump 将LR寄存的值减去一个常量后复制到PC寄存器,跳转到被中断的用户程序。 return LR_sys SPSR_irq LR_irq LR PC CPSR SPSR SYS 1 ? . . . MOD T F I N Z C V BackAddr BackAddr-4 JumpAddr IRQ ? 1 . . . SYS 1 ? . . . SYS 1 ? . . . “?”表示对该位不关心