第第 11 章章 认认识识 ARMARM
嵌入式技术的快速发展不仅使之成为当前微电子技术与计算机技术中的一个重要分支,
同时也使计算机的分类从以前的巨型机、大型机、小型机、微机之分变为了通用计算机和嵌
入式系统之分。嵌入式的应用更是涉及金融、航天、电信、网络、信息家电、医疗、工业控
制、军事等各个领域,以致一些学者断言嵌入式技术将成为后 PC 时代的主宰。
广义地说,一个嵌入式系统就是一个具有特定功能或用途的计算机软硬件集合体。通常
我们将嵌入式系统分为软件部分和硬件部分,相应的技术也分为嵌入式硬件技术与嵌入式软
件技术两个部分。嵌入式系统发展的最高形式——片上系统 SoC 将是这些技术的集大成者。
而从狭义上讲,嵌入式系统则仅仅指装入另一个设备并且控制该设备的专用计算机系统。
嵌入式系统的最大特点是其目的性和针对性,即每一套嵌入式系统的开发都有其特殊的
应用场合与特定功能,这也是嵌入式系统与通用的计算机系统的最主要区别。另外,嵌入式
技术与实时性有着天然的联系。另外由于嵌入式系统是为特定目的而设计的,且常常受空间、
成本、存储、带宽等的限制,因此它必须最大限度地在硬件和软件上“量身定做”,以提高资
源的利用率,这样的结果也随之导致了实时性的增强。
嵌入式系统包含硬件和软件两部分:硬件架构以嵌入式处理器为中心,配置存储器、I/O
设备、通信模块等必要的外设;软件部分以软件开发平台为核心,向上提供应用编程接口 API,
向下屏蔽具体硬件特性的板级支持包 BSP。嵌入式系统中,软件和硬件紧密配合,协调工作,
共同完成系统预定的功能。
嵌入式系统的功能软件集成于硬件系统之中,系统的应用软件与硬件一体化。在嵌入式
系统硬件设备中,嵌入式处理器是整个系统的核心部件,其性能好坏直接决定整个系统的运
行效果。
由于嵌入式系统应用需求的多样性,市场上基于 RISC 结构的嵌入式处理器提供商也日
渐增多。统计数字表明,2002 年底 32 位嵌入式处理器市场销售额排在前三位的公司分别是
ARM、Motorola 和 MIPS,其中 ARM 公司的芯片销售量达 亿个,市场份额超过 70%。
ARM-Advanced RISC Machines
ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对一
类微处理器的通称,还可以认为是一种技术的名字。1991 年 ARM 公司成立于英国剑桥,主
要出售芯片设计技术的授权。目前,采用 ARM 技术知识产权(IP)核的微处理器,即通常所
说的 ARM 微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统、
军用系统等各类产品市场,基于 ARM 技术的微处理器应用约占据了 32 位 RISC 微处理器
70%以上的市场份额,ARM 技术正在逐步渗入到我们生活的各个方面。ARM 公司是专门
从事基于 RISC 技术芯片设计开发的公司,作为知识产权供应商,本身不直接从事芯片生产,
靠转让设计许可,由合作公司生产各具特色的芯片,世界各大半导体生产商从 ARM 公司购
买其 ARM 微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的
ARM 微处理器芯片进入市场。目前全世界有几十家大的半导体公司都使用 ARM 公司的授
权,因此既使得 ARM 技术获得更多的第三方工具、制造、软件的支持,又使整个系统成本
降低,使产品更容易进入市场并被消费者所接受,更具有竞争力。
ARM 微处理器的应用领域及特点
ARM 微处理器的应用领域
到目前为止,ARM 微处理器及技术的应用几乎已经深入到各个领域:
1) 工业控制领域:作为 32 位的 RISC 架构,基于 ARM 核的微控制器芯片不但占据了
高端微控制器市场的大部分市场份额,同时也逐渐向低端微控制器应用领域扩展,ARM 微
控制器的低功耗、高性价比,向传统的 8 位/16 位微控制器提出了挑战;
2) 无线通讯领域:目前已有超过 85%的无线通讯设备采用了 ARM 技术,ARM 以其高
性能和低成本,在该领域的地位日益巩固;
3) 网络应用:随着宽带技术的推广,采用 ARM 技术的 ADSL 芯片正逐步获得竞争优
势。此外,ARM 在语音及视频处理上进行了优化,并获得广泛的支持,也对 DSP 的应用领
域提出了挑战;
4) 消费类电子产品:ARM 技术在目前流行的数字音频播放器、数字机顶盒和游戏机中
得到广泛采用;
5) 成像和安全产品:现在流行的数码相机和打印机中绝大部分采用了 ARM 技术。手
机中的 32 位 SIM 智能卡也采用了 ARM 技术。
除此以外,ARM 微处理器及技术还应用到许多不同的领域,并会在将来取得更广泛的
应用。
ARM 微处理器的特点
采用 RISC 架构的 ARM 微处理器一般具有如下特点:
1) 体积小、低功耗、低成本、高性能;
2) 支持 Thumb(16 位)/ARM(32 位)双指令集,能很好的兼容 8/16 位器件;
3) 大量使用寄存器,指令执行速度更快;
4) 大多数数据操作都在寄存器中完成;
5) 寻址方式灵活简单,执行效率高;
6) 指令长度固定。
ARM 微处理器系列
ARM 微处理器目前包括 ARM7 系列、ARM9 系列、ARM9E 系列、ARM10E 系列、
SecurCore 系列、Intel 的 StrongARM、Xscale 等多个系列,除了具有 ARM 体系结构的共同
特点以外,每一个系列的 ARM 微处理器都有各自的特点和应用领域。
其中,ARM7、ARM9、ARM9E 和 ARM10 为 4 个通用处理器系列,每一个系列提供一
套相对独特的性能来满足不同应用领域的需求。SecurCore 系列专门为安全要求较高的应用
而设计。以下我们来详细了解一下各种处理器的特点及其应用领域。
ARM7 微处理器系列
ARM7 系列微处理器为低功耗的 32 位 RISC 处理器,最适合用于对价位和功耗要求比
较严格的消费类应用。ARM7 微处理器系列具有如下特点:
1) 具有嵌入式 ICE-RT 逻辑,调试开发方便;
2) 极低的功耗,适合对功耗要求严格的应用,如便携式产品;
3) 能够提供 的三级流水线结构;
4) 代码密度高并兼容 16 位的 Thumb 指令集;
5) 对操作系统的支持广泛,包括 Windows CE、Linux、Palm OS 等;
6) 指令系统与 ARM9、ARM9E 和 ARM10E 系列兼容,便于用户的产品升级换代;
7) 主频最高可达 130MIPS,高速的运算处理能力能胜任绝大多数的复杂应用。
ARM7 系列微处理器的主要应用领域为:工业控制、Internet 设备、网络和调制解调器
设备、移动电话等多种多媒体和嵌入式应用。
ARM7 系列微处理器包括如下几种类型的核:ARM7TDMI、ARM7TDMI-S、
ARM720T、ARM7EJ。其中,ARM7TMDI 是目前使用最广泛的 32 位嵌入式 RISC 处理器,
属低端 ARM 处理器核。TDMI 的基本含义为:
T:支持 16 位压缩指令集 Thumb;
D:支持片上 Debug;
M:内嵌硬件乘法器(Multiplier);
I:嵌入式 ICE,支持片上断点和调试点。
ARM9 微处理器系列
ARM9 系列微处理器在高性能和低功耗特性方面提供最佳的性能。具有以下特点:
1) 提供 级流水线结构;
2) 支持 32 位 ARM 指令集和 16 位 Thumb 指令集;
3) 支持 32 位的高速 AMBA 总线接口;
4) 全性能 MMU,支持 Windows CE、Linux、Palm OS 等主流嵌入式操作系统;
5) MPU 支持实时操作系统;
6) 支持数据 Cache 和指令 Cache,具有更高的指令和数据处理能力。
ARM9 系列微处理器主要应用于无线设备、仪器仪表、安全系统、机顶盒、高端打印机、
数字照相机和数字摄像机等。它包含 ARM920T、ARM922T 和 ARM940T 三种类型。
ARM9E 微处理器系列
ARM9E 系列微处理器为可综合处理器,使用单一的处理器内核提供了微控制器、DSP、
Java 应用系统的解决方案,极大地减少了芯片的面积和系统的复杂程度。ARM9E 系列微处
理器提供了增强的 DSP 处理能力,很适合于那些需要同时使用 DSP 和微控制器的应用场合。
ARM9E 系列微处理器的主要特点如下:
1) 支持 DSP 指令集,适合于需要高速数字信号处理的场合;
2) 5 级整数流水线,指令执行效率更高;
3) 支持 32 位 ARM 指令集和 16 位 Thumb 指令集;
4) 支持 32 位的高速 AMBA 总线接口;
5) 支持 VFP9 浮点处理协处理器;
6) 全性能 MMU,支持 Windows CE、Linux、Palm OS 等主流嵌入式操作系统;
7) MPU 支持实时操作系统;
8) 支持数据 Cache 和指令 Cache,具有更高的指令和数据处理能力;
9) 主频最高可达 300MIPS。
ARM9E 系列微处理器主要应用于下一代无线设备、数字消费品、成像设备、工业控制、
存储设备和网络设备等领域。它包含 ARM926EJ-S、ARM946E-S 和 ARM966E-S 三种类型。
ARM10E 微处理器系列
ARM10E 系列微处理器具有高性能、低功耗的特点,由于采用了新的体系结构,与同
等的 ARM9 器件相比较,在同样的时钟频率下,性能提高了近 50%,同时,ARM10E 系
列微处理器采用了两种先进的节能方式,使其功耗极低。
ARM10E 系列微处理器的主要特点如下:
1) 支持 DSP 指令集,适合于需要高速数字信号处理的场合;
2) 6 级整数流水线,指令执行效率更高;
3) 支持 32 位 ARM 指令集和 16 位 Thumb 指令集;
4) 支持 32 位的高速 AMBA 总线接口;
5) 支持 VFP10 浮点处理协处理器;
6) 全性能 MMU,支持 Windows CE、Linux、Palm OS 等主流嵌入式操作系统;
7) 支持数据 Cache 和指令 Cache,具有更高的指令和数据处理能力;
8) 主频最高可达 400MIPS;
9) 内嵌并行读/写操作部件。
ARM10E 系列微处理器主要应用于下一代无线设备、数字消费品、成像设备、工业控
制、通信和信息系统等领域。它包含 ARM1020E、ARM1022E 和 ARM1026EJ-S 三种类型。
SecurCore 微处理器系列
SecurCore 系列微处理器专为安全需要而设计,提供了完善的 32 位 RISC 技术的安全解
决方案,因此,它除了具有 ARM 体系结构的低功耗、高性能的特点外,还具有其独特的优
势,即提供了对安全解决方案的支持。SecurCore 系列微处理器在系统安全方面具有如下的
特点:
1) 带有灵活的保护单元,以确保操作系统和应用数据的安全;
2) 采用软内核技术,防止外部对其进行扫描探测;
3) 可集成用户自己的安全特性和其他协处理器。
SecurCore 系列微处理器主要应用于一些对安全性要求较高的应用产品及应用系统,如
电子商务、电子政务、电子银行业务、网络和认证系统等领域。它包含 SecurCore SC100、
SecurCore SC110、SecurCore SC200 和 SecurCore SC210 四种类型。
StrongARM 微处理器系列
Intel StrongARM SA-1100 以及 Intel StrongARM SA-1110 处理器是采用 ARM 体系结构,
高度集成的 32 位 RISC 微处理器。融合了 Intel 公司的设计和处理技术以及 ARM 体系结构
的电源效率,采用在软件上兼容 ARMv4 体系结构、同时采用具有 Intel 技术优点的体系结
构。Intel StrongARM 处理器是便携式通讯产品和消费类电子产品的理想选择,已成功应用
于多家公司的掌上电脑系列产品。
Xscale 处理器
Xscale 处理器是基于 ARMv5TE 体系结构的解决方案,是一款全性能、高性价比、低
功耗的处理器。它支持 16 位的 Thumb 指令和 DSP 指令集,已使用在数字移动电话、个人
数字助理和网络产品等场合。Xscale 处理器是 Intel 目前主要推广的一款 ARM 微处理器。
ARM 微处理器结构
RISC 体系结构
传统的 CISC(Complex Instruction Set Computer,复杂指令集计算机)结构有其固有的
缺点,即随着计算机技术的发展而不断引入新的复杂的指令集,为支持这些新增的指令,计
算机的体系结构越来越复杂,然而,在 CISC 指令集的各种指令中,其使用频率却相差悬殊,
大约有 20%的指令被反复使用,占整个程序代码的 80%。而余下的 80%的指令却不经常使
用,在程序设计中只占 20%,显然,这种结构是不太合理的。
基于以上不合理性,1979 年美国加州大学伯克利分校提出了 RISC(Reduced Instruction
Set Computer,精简指令集计算机)的概念,RISC 并非只是简单地去减少指令,而是把着眼
点放在了如何使计算机的结构更加简单合理地提高运算速度上。RISC 结构优先选取使用频
率最高的简单指令,避免复杂指令;将指令长度固定,指令格式和寻址方式种类减少;以控
制逻辑为主。到目前为止,RISC 体系结构也还没有严格的定义,一般认为,RISC 体系结构
应具有如下特点:
1) 采用固定长度的指令格式,指令归整、简单、基本寻址方式有 2~3 种;
2) 使用单周期指令,便于流水线操作执行;
3) 大量使用寄存器,数据处理指令只对寄存器进行操作,只有加载/存储指令可以访问
存储器,以提高指令的执行效率。
除此以外,ARM 体系结构还采用了一些特别的技术,在保证高性能的前提下尽量缩小
芯片的面积,并降低功耗:
1) 所有的指令都可根据前面的执行结果决定是否被执行,从而提高指令的执行效率;
2) 可用加载/存储指令批量传输数据,以提高数据的传输效率;
3) 可在一条数据处理指令中同时完成逻辑处理和移位处理;
4) 在循环处理中使用地址的自动增减来提高运行效率。
当然,和 CISC 架构相比较,尽管 RISC 架构有上述的优点,但决不能认为 RISC 架构
就可以取代 CISC 架构,事实上,RISC 和 CISC 各有优势,而且界限并不那么明显。现代
的 CPU 往往采用 CISC 的外围,内部加入了 RISC 的特性,如超长指令集 CPU 就是融合了
RISC 和 CISC 的优势,成为未来的 CPU 发展方向之一。
ARM 微处理器的寄存器结构
ARM 处理器共有 37 个寄存器,被分为若干个组,这些寄存器包括:
1) 31 个通用寄存器,包括程序计数器(PC 指针),均为 32 位的寄存器;
2) 6 个状态寄存器,用以标识 CPU 的工作状态及程序的运行状态,均为 32 位,目前只
使用了其中的一部分。
同时,ARM 处理器又有 7 种不同的处理器模式,在每一种处理器模式下均有一组相应
的寄存器与之对应。即在任意一种处理器模式下,可访问的寄存器包括 15 个通用寄存器
(R0~R14)、一至二个状态寄存器和程序计数器。在所有的寄存器中,有些是在 7 种处理
器模式下共用的同一个物理寄存器,而有些寄存器则是在不同的处理器模式下有不同的物理
寄存器。
ARM 微处理器的指令结构
ARM 微处理器支持两种指令集:ARM 指令集和 Thumb 指令集。其中,ARM 指令为 32
位的长度,Thumb 指令为 16 位长度。Thumb 指令集为 ARM 指令集的功能子集,但与等价
的 ARM 代码相比较,可节省 30%~40%以上的存储空间,同时具备 32 位代码的所有优点。
ARM 微处理器的应用选型
鉴于 ARM 微处理器的众多优点,随着国内外嵌入式应用领域的逐步发展,ARM 微处
理器必然会获得广泛的重视和应用。但是,由于 ARM 微处理器有多达十几种的内核结构,
几十个芯片生产厂家,以及千变万化的内部功能配置组合,给开发人员在选择方案时带来一
定的困难,所以,对 ARM 芯片做一些对比研究是十分必要的。
以下从应用的角度出发,对在选择 ARM 微处理器时所应考虑的主要问题做一些简要的
探讨。从前面的介绍可知,ARM 微处理器包含一系列的内核结构,以适应不同的应用领域,
用户如果希望使用 WinCE 或标准 Linux 等操作系统,就需要选择 ARM720T 以上带有 MMU
(Memory Management Unit)功能的 ARM 芯片,ARM720T、ARM920T、ARM922T、
ARM946T、Strong-ARM 都带有 MMU 功能。而 ARM7TDMI 则没有 MMU,不支持 Windows
CE 和标准 Linux,但目前有 uCLinux 以及 uC/OS-II 等不需要 MMU 支持的操作系统可运行
于 ARM7TDMI 硬件平台之上。事实上,uCLinux 已经成功移植到多种不带 MMU 的微处理
器平台上,并在稳定性和其他方面都有上佳表现。
本教学实验系统使用的 S3C2410X 为一款带 MMU 的 ARM 微处理器,可在其上运行
Linux、Windows CE 和 uC/OS-II 等操作系统。
1) 系统的工作频率:系统的工作频率在很大程度上决定了 ARM 微处理器的处理能力。
ARM7 系列微处理器的典型处理速度为 ARM7 芯片系统主时钟为
20MHz-133MHz;ARM9 系列微处理器的典型处理速度为 ARM9 的系
统主时钟频率为 100MHz-233MHz;ARM10 最高可以达到 700MHz。不同芯片对时钟的处理
不同,有的芯片只需要一个主时钟频率,有的芯片内部时钟控制器可以分别为 ARM 核和
USB、UART、DSP、音频等功能部件提供不同频率的时钟。
2) 芯片内存储器的容量:大多数 ARM 微处理器片内存储器的容量都不大,需要用户
在设计系统时外扩存储器,但也有部分芯片具有相对较大的片内存储空间,如 ATMEL 的
AT91F40162 就具有高达 2MB 的片内程序存储空间,用户在设计时可考虑选用这种类型,
以简化系统的设计。
3) 片内外围电路的选择:
第第 22 章章 ARMARM 微处理器的编程模型微处理器的编程模型
从本章开始的两章将讲述 ARM 微处理器的编程模型以及指令系统,这些知识是进行
ARM 软件开发的必备基础知识,建议初学者仔细阅读这两章。对于有一定 ARM 编程基础
的读者也可以跳过这两章的学习而直接进入第 4 章。
在开始这两章学习之前,有必要对字(Word)、半字(Half-Word)、字节(Byte)的
概念作一个说明:
字(Word):在 ARM 体系结构中,字的长度为 32 位,而在 8 位/16 位处理器体系结
构中,字的长度一般为 16 位,请读者在阅读时注意区分。
半字(Half-Word):在 ARM 体系结构中,半字的长度为 16 位,与 8 位/16 位处理器
体系结构中字的长度一致。
字节(Byte):在 ARM 体系结构和 8 位/16 位处理器体系结构中,字节的长度均为 8
位。
本章将简单的就 ARM 微处理器编程模型的一些基本概念进行说明。包括:ARM 微处
理器的工作状态、ARM 体系结构的存储器格式、ARM 微处理器的工作模式、ARM 体系结
构的寄存器组织、ARM 微处理器的异常状态等。通过对本章的阅读,希望读者能了解 ARM
微处理器的基本工作原理和一些与程序设计相关的基本技术细节,为后续的软件编程打下基
础。
ARM 微处理器的工作状态
从编程的角度看,ARM 微处理器有两种工作状态,并可在两种状态之间切换:
1、ARM 状态:此时处理器执行 32 位的字对齐的 ARM 指令;
2、Thumb 状态:此时处理器执行 16 位的、半字对齐的 Thumb 指令。
当 ARM 微处理器执行 32 位的 ARM 指令集时,工作在 ARM 状态;当 ARM 微处理器
执行 16 位的 Thumb 指令集时,工作在 Thumb 状态。
在程序的执行过程中,微处理器可以随时在两种工作状态之间切换,并且,处理器工作
状态的转变并不会影响处理器的工作模式和相应寄存器中的内容。
ARM 指令集和 Thumb 指令集都有切换处理器状态的指令,但 ARM 微处理器在开始执
行代码时,总是处于 ARM 状态。
1、从 ARM 状态进入 Thumb 状态:当操作数寄存器的状态位(位 0)为 1 时,可以采
用执行 BX 指令的方法,使微处理器从 ARM 状态切换到 Thumb 状态。此外,当处理器处
于 Thumb 状态时发生异常(如 IRQ、FIQ、Undef、Abort、SWI 等),则异常处理返回时,
自动切换到 Thumb 状态。
2、从 Thumb 状态进入 ARM 状态:当操作数寄存器的状态位为 0 时,执行 BX 指令时
可以使微处理器从 Thumb 状态切换到 ARM 状态。此外,在处理器进行异常处理时,把 PC
指针放入异常模式链接寄存器中,并从异常向量地址开始执行程序,也可以使处理器切换
到 ARM 状态。
ARM 体系结构的存储器格式
ARM 体系结构将存储器看作是从零地址开始的字节的线性组合。从零字节到三字节放
置第一个存储的字数据,从第四个字节到第七个字节放置第二个存储的字数据,依次排列。
作为 32 位的微处理器,ARM 体系结构所支持的最大寻址空间为 4GB(232 字节)。
ARM 体系结构可以用两种方法存储字数据:大端格式和小端格式,具体说明如下:
1、大端格式:
在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中,
如图 所示:
图 以大端格式存储字数据
2、小端格式:
与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址
存放的是字数据的高字节。如图 所示:
图 2. 2 以小端格式存储字数据
指令长度及数据类型
ARM 微处理器的指令长度可以是 32 位(在 ARM 状态下),也可以为 16 位(在 Thumb
状态下)。
ARM 微处理器中支持字节(8 位)、半字(16 位)、字(32 位)三种数据类型,其中,
字需要 4 字节对齐(地址的低两位为 0)、半字需要 2 字节对齐(地址的最低位为 0)。
处理器模式
ARM 微处理器支持 7 种运行模式,分别为:
1、用户模式(usr): ARM 处理器正常的程序执行状态
2、快速中断模式(fiq): 用于高速数据传输或通道处理
3、外部中断模式(irq): 用于通用的中断处理
4、管理模式(svc): 操作系统使用的保护模式
5、数据访问终止模式(abt): 当数据或指令预取终止时进入该模式,可用于虚拟存
储及存储保护。
6、系统模式(sys): 运行具有特权的操作系统任务。
7、未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件
协处理器的软件仿真。
ARM 微处理器的运行模式可以通过软件改变,也可以通过外部中断或异常处理改变。
大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的系统资
源是不能被访问的。除用户模式以外,其余的所有 6 种模式称之为非用户模式,或特权模式
(Privileged Modes);在非用户模式中,除去用户模式和系统模式以外的 5 种又称为异常
模式(Exception Modes),常用于处理中断或异常,以及需要访问受保护的系统资源等情况。
寄存器组织
ARM 微处理器共有 37 个 32 位寄存器,其中 31 个为通用寄存器,6 个为状态寄存器。
但是这些寄存器不能同时被访问,具体哪些寄存器是可编程访问的,取决微处理器的工作状
态及其运行模式。但在任何时候,通用寄存器 R0~R14、程序计数器 PC、一个或两个状态
寄存器都是可访问的。
ARM 状态下的寄存器组织
通用寄存器
ARM 微处理器的通用寄存器可以分为三类:
1、未分组寄存器 R0~R7;
在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊
的用途,因此,在中断或异常处理进行运行模式转换时,由于不同的处理器运行模式均使用
相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计,尤其是编写
中断处理程序时应特别引起注意。
2、分组寄存器 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。
寄存器 R13 在 ARM 指令中常用作堆栈指针,但这只是一种习惯用法,用户也可使用其
他的寄存器作为堆栈指针。而在 Thumb 指令集中,某些指令强制性的要求使用 R13 作为堆
栈指针。
由于处理器的每种运行模式均有自己独立的物理寄存器 R13,在用户应用程序的初始化
部分,一般都要初始化每种模式下的 R13,使其指向该运行模式的栈空间,这样,当程序的
运行进入异常模式时,可以将需要保护的寄存器放入 R13 所指向的堆栈,而当程序从异常
模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行。
R14 也称作子程序连接寄存器(Subroutine Link Register)或连接寄存器 LR。当执行 BL
子程序调用指令时,R14 中得到 R15(程序计数器 PC)的备份。其他情况下,R14 用作通
用寄存器。与之类似,当发生中断或异常时,对应的分组寄存器 R14_svc、R14_irq、
R14_fiq、R14_abt 和 R14_und 用来保存 R15 的返回值。
寄存器 R14 常用在如下的情况:
在每一种运行模式下,都可用 R14 保存子程序的返回地址,当用 BL 或 BLX 指令调用
子程序时,将 PC 的当前值拷贝给 R14,执行完子程序后,又将 R14 的值拷贝回 PC,即可
完成子程序的调用返回。以上的描述可用指令完成:
(1)执行以下任意一条指令:
MOV PC,LR
BX LR
(2)在子程序入口处使用以下指令将 R14 存入堆栈:
STMFD SP!,{<Regs>,LR}
对应的,使用以下指令可以完成子程序返回:
LDMFD SP!,{<Regs>,PC}
3、程序计数器 PC(R15)
寄存器 R15 用作程序计数器(PC)。在 ARM 状态下,位[1:0]为 0,位[31:2]用于保存
PC;在 Thumb 状态下,位[0]为 0,位[31:1]用于保存 PC;虽然可以用作通用寄存器,但是
有一些指令在使用 R15 时有一些特殊限制,若不注意,执行的结果将是不可预料的。在 ARM
状态下,PC 的 0 和 1 位是 0,在 Thumb 状态下,PC 的 0 位是 0。
R15 虽然也可用作通用寄存器,但一般不这么使用,因为对 R15 的使用有一些特殊的
限制,当违反了这些限制时,程序的执行结果是未知的。
由于 ARM 体系结构采用了多级流水线技术,对于 ARM 指令集而言,PC 总是指向当前
指令的下两条指令的地址,即 PC 的值为当前指令的地址值加 8 个字节。
图 ARM 状态下的寄存器组织
在 ARM 状态下,任一时刻可以访问以上所讨论的 16 个通用寄存器和一到两个状态寄
存器。在非用户模式(特权模式)下,则可访问到特定模式分组寄存器,图 说明在每一
种运行模式下,哪一些寄存器是可以访问的。
状态寄存器 CPSR 和 SPSR
寄存器 R16 用作 CPSR(Current Program Status Register,当前程序状态寄存器),CPSR
可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以
及其他一些相关的控制和状态位。
每一种运行模式下又都有一个专用的物理状态寄存器,称为 SPSR(Saved Program
Status Register,备份的程序状态寄存器),当异常发生时,SPSR 用于保存 CPSR 的当前值,
从异常退出时则可由 SPSR 来恢复 CPSR。
由于用户模式和系统模式不属于异常模式,他们没有 SPSR,当在这两种模式下访问
SPSR,结果是未知的。
Thumb 状态下的寄存器组织
Thumb 状态下的寄存器集是 ARM 状态下寄存器集的一个子集,程序可以直接访问 8 个
通用寄存器(R7~R0)、程序计数器(PC)、堆栈指针(SP)、连接寄存器(LR)和
CPSR。同时,在每一种特权模式下都有一组 SP、LR 和 SPSR。图 表明 Thumb 状态下
的寄存器组织。
图 Thumb 状态下的寄存器组织
Thumb 状态下的寄存器组织与 ARM 状态下的寄存器组织的关系:
1、Thumb 状态下和 ARM 状态下的 R0~R7 是相同的。
2、Thumb 状态下和 ARM 状态下的 CPSR 和所有的 SPSR 是相同的。
3、Thumb 状态下的 SP 对应于 ARM 状态下的 R13。
4、Thumb 状态下的 LR 对应于 ARM 状态下的 R14。
5、Thumb 状态下的程序计数器对应于 ARM 状态下 R15
以上的对应关系如图 所示:
图 Thumb 状态下的寄存器组织
访问 THUMB 状态下的高位寄存器(Hi-registers):
在 Thumb 状态下,高位寄存器 R8~R15 并不是标准寄存器集的一部分,但可使用汇编
语言程序受限制的访问这些寄存器,将其用作快速的暂存器。使用带特殊变量的 MOV 指令,
数据可以在低位寄存器和高位寄存器之间进行传送;高位寄存器的值可以使用 CMP 和 ADD
指令进行比较或加上低位寄存器中的值。
程序状态寄存器
ARM 体系结构包含一个当前程序状态寄存器(CPSR)和五个备份的程序状态寄存器
(SPSRs)。备份的程序状态寄存器用来进行异常处理,其功能包括:
1、保存 ALU 中的当前操作信息
2、控制允许和禁止中断
3、设置处理器的运行模式
程序状态寄存器的位定义如图 所示:
图 程序状态寄存器格式
条件码标志(Condition Code Flags)
N、Z、C、V 均为条件码标志位。它们的内容可被算术或逻辑运算的结果所改变,并且
可以决定某条指令是否被执行。
在 ARM 状态下,绝大多数的指令都是有条件执行的。
在 Thumb 状态下,仅有分支指令是有条件执行的。
条件码标志各位的具体含义如表 2-1 所示:
表 2-1 条件码标志的具体含义
标志位 含 义
N 当用两个补码表示的带符号数进行运算时,N=1 表示运算的结果为负数;N=0 表示运算的
结果为正数或零;
Z Z=1 表示运算的结果为零;Z=0 表示运算的结果为非零;
C 可以有 4 种方法设置 C 的值:
─ 加法运算(包括比较指令 CMN):当运算结果产生了进位时(无符号数溢出),C=1,
否则 C=0。
─ 减法运算(包括比较指令 CMP):当运算时产生了借位(无符号数溢出),C=0,否则
C=1。
─ 对于包含移位操作的非加/减运算指令,C 为移出值的最后一位。
─ 对于其他的非加/减运算指令,C 的值通常不改变。
V 可以有 2 种方法设置 V 的值:
─ 对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1 表
示符号位溢出。
─ 对于其他的非加/减运算指令,V 的值通常不改变。
Q 在 ARM v5 及以上版本的 E 系列处理器中,用 Q 标志位指示增强的 DSP 运算指令是否发生
了溢出。在其他版本的处理器中,Q 标志位无定义。
PSR 的低 8 位(包括 I、F、T 和 M[4:0])称为控制位,当发生异常时这些位可以被改
变。如果处理器运行特权模式,这些位也可以由程序修改。
1、中断禁止位 I、F:
I=1 禁止 IRQ 中断;
F=1 禁止 FIQ 中断。
2、T 标志位:该位反映处理器的运行状态。
对于 ARM 体系结构 v5 及以上的版本的 T 系列处理器,当该位为 1 时,程序运行于
Thumb 状态,否则运行于 ARM 状态。
对于 ARM 体系结构 v5 及以上的版本的非 T 系列处理器,当该位为 1 时,执行下一条
指令以引起为定义的指令异常;当该位为 0 时,表示运行于 ARM 状态。
3、运行模式位 M[4:0]:M0、M1、M2、M3、M4 是模式位。这些位决定了处理器的
运行模式。具体含义如表 2-2 所示:
表 2-2 运行模式位 M[4:0]的具体含义
M[4:0] 处理器模式 可访问的寄存器
0b10000 用户模式 PC,CPSR,R0-R14
0b10001 FIQ 模式 PC,CPSR, SPSR_fiq,R14_fiq-R8_fiq, R7~R0
0b10010 IRQ 模式 PC,CPSR, SPSR_irq,R14_irq,R13_irq,R12~R0
0b10011 管理模式 PC,CPSR, SPSR_svc,R14_svc,R13_svc,,R12~R0,
0b10111 中止模式 PC,CPSR, SPSR_abt,R14_abt,R13_abt, R12~R0,
0b11011 未定义模式 PC,CPSR, SPSR_und,R14_und,R13_und, R12~R0,
0b11111 系统模式 PC,CPSR(ARM v4 及以上版本), R14~R0
由表 2-2 可知,并不是所有的运行模式位的组合都是有效地,其他的组合结果会导致处
理器进入一个不可恢复的状态。
PSR 中的其余位为保留位,当改变 PSR 中的条件码标志位或者控制位时,保留位不要
被改变,在程序中也不要使用保留位来存储数据。保留位将用于 ARM 版本的扩展。
异常(Exceptions)
当正常的程序执行流程发生暂时的停止时,称之为异常,例如处理一个外部的中断请求。
在处理异常之前,当前处理器的状态必须保留,这样当异常处理完成之后,当前程序可以继
续执行。处理器允许多个异常同时发生,它们将会按固定的优先级进行处理。
ARM 体系结构中的异常,与 8 位/16 位体系结构的中断有很大的相似之处,但异常与
中断的概念并不完全等同。
ARM 体系结构所支持的异常类型
ARM 体系结构所支持的异常及具体含义如表 2-3 所示。
表 2-3 ARM 体系结构所支持的异常
异常类型 具体含义
复位 当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程序处
执行。
未定义指令 当 ARM 处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。可
使用该异常机制进行软件仿真。
软件中断 该异常由执行 SWI 指令产生,可用于用户模式下的程序调用特权操作指令。可
使用该异常机制实现系统功能调用。
指令预取中止 若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向
处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。
数据中止 若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生
数据中止异常。
IRQ(外部中断请求) 当处理器的外部中断请求引脚有效,且 CPSR 中的 I 位为 0 时,产生 IRQ 异常。
系统的外设可通过该异常请求中断服务。
FIQ(快速中断请求) 当处理器的快速中断请求引脚有效,且 CPSR 中的 F 位为 0 时,产生 FIQ 异常。
对异常的响应
当一个异常出现以后,ARM 微处理器会执行以下几步操作:
1、将下一条指令的地址存入相应连接寄存器 LR,以便程序在处理异常返回时能从正确
的位置重新开始执行。若异常是从 ARM 状态进入,LR 寄存器中保存的是下一条指令的地
址(当前 PC+4 或 PC+8,与异常的类型有关);若异常是从 Thumb 状态进入,则在 LR
寄存器中保存当前 PC 的偏移量,这样,异常处理程序就不需要确定异常是从何种状态进入
的。例如:在软件中断异常 SWI,指令 MOV PC,R14_svc 总是返回到下一条指令,不管 SWI
是在 ARM 状态执行,还是在 Thumb 状态执行。
2、将 CPSR 复制到相应的 SPSR 中。
3、根据异常类型,强制设置 CPSR 的运行模式位。
4、强制 PC 从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程
序处。
还可以设置中断禁止位,以禁止中断发生。
如果异常发生时,处理器处于 Thumb 状态,则当异常向量地址加载入 PC 时,处理器
自动切换到 ARM 状态。
ARM 微处理器对异常的响应过程用伪码可以描述为:
R14_<Exception_Mode> = Return Link
SPSR_<Exception_Mode> = CPSR
CPSR[4:0] = Exception Mode Number
CPSR[5] = 0 ;当运行于 ARM 工作状态时
If <Exception_Mode> == Reset or FIQ then
;当响应 FIQ 异常时,禁止新的 FIQ 异常
CPSR[6] = 1
CPSR[7] = 1
PC = Exception Vector Address
从异常返回
异常处理完毕之后,ARM 微处理器会执行以下几步操作从异常返回:
1、将连接寄存器 LR 的值减去相应的偏移量后送到 PC 中。
2、将 SPSR 复制回 CPSR 中。
3、若在进入异常处理时设置了中断禁止位,要在此清除。
可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要
返回。
各类异常的具体描述
FIQ(Fast Interrupt Request)
FIQ 异常是为了支持数据传输或者通道处理而设计的。在 ARM 状态下,系统有足够的
私有寄存器,从而可以避免对寄存器保存的需求,并减小了系统上下文切换的开销。
若将 CPSR 的 F 位置为 1,则会禁止 FIQ 中断,若将 CPSR 的 F 位清零,处理器会在指
令执行时检查 FIQ 的输入。注意只有在特权模式下才能改变 F 位的状态。
可由外部通过对处理器上的 nFIQ 引脚输入低电平产生 FIQ。不管是在 ARM 状态还是
在 Thumb 状态下进入 FIQ 模式,FIQ 处理程序均会执行以下指令从 FIQ 模式返回:
SUBS PC,R14_fiq ,#4
该指令将寄存器 R14_fiq 的值减去 4 后,复制到程序计数器 PC 中,从而实现从异常处
理程序中的返回,同时将 SPSR_mode 寄存器的内容复制到当前程序状态寄存器 CPSR 中。
IRQ(Interrupt Request)
IRQ 异常属于正常的中断请求,可通过对处理器的 nIRQ 引脚输入低电平产生,IRQ 的
优先级低于 FIQ,当程序执行进入 FIQ 异常时,IRQ 可能被屏蔽。
若将 CPSR 的 I 位置为 1,则会禁止 IRQ 中断,若将 CPSR 的 I 位清零,处理器会在指
令执行完之前检查 IRQ 的输入。注意只有在特权模式下才能改变 I 位的状态。
不管是在 ARM 状态还是在 Thumb 状态下进入 IRQ 模式,IRQ 处理程序均会执行以下
指令从 IRQ 模式返回:
SUBS PC , R14_irq , #4
该指令将寄存器 R14_irq 的值减去 4 后,复制到程序计数器 PC 中,从而实现从异常处
理程序中的返回,同时将 SPSR_mode 寄存器的内容复制到当前程序状态寄存器 CPSR 中。
ABORT(中止)
产生中止异常意味着对存储器的访问失败。ARM 微处理器在存储器访问周期内检查是
否发生中止异常。
中止异常包括两种类型:
1、指令预取中止:发生在指令预取时。
2、数据中止:发生在数据访问时。
当指令预取访问存储器失败时,存储器系统向 ARM 处理器发出存储器中止(Abort)
信号,预取的指令被记为无效,但只有当处理器试图执行无效指令时,指令预取中止异常才
会发生,如果指令未被执行,例如在指令流水线中发生了跳转,则预取指令中止不会发生。
若数据中止发生,系统的响应与指令的类型有关。
当确定了中止的原因后,Abort 处理程序均会执行以下指令从中止模式返回,无论是在
ARM 状态还是 Thumb 状态:
SUBS PC, R14_abt, #4 ;指令预取中止
SUBS PC, R14_abt, #8 ;数据中止
以上指令恢复 PC(从 R14_abt)和 CPSR(从 SPSR_abt)的值,并重新执行中止的指
令。
Software Interruupt(软件中断)
软件中断指令(SWI)用于进入管理模式,常用于请求执行特定的管理功能。软件中断
处理程序执行以下指令从 SWI 模式返回,无论是在 ARM 状态还是 Thumb 状态:
MOV PC , R14_svc
以上指令恢复 PC(从 R14_svc)和 CPSR(从 SPSR_svc)的值,并返回到 SWI 的下一
条指令。
Undefined Instruction(未定义指令)
当 ARM 处理器遇到不能处理的指令时,会产生未定义指令异常。采用这种机制,可以
通过软件仿真扩展 ARM 或 Thumb 指令集。
在仿真未定义指令后,处理器执行以下程序返回,无论是在 ARM 状态还是 Thumb 状
态:
MOVS PC, R14_und
以上指令恢复 PC(从 R14_und)和 CPSR(从 SPSR_und)的值,并返回到未定义指令
后的下一条指令。
异常进入/退出
表 2-4 总结了进入异常处理时保存在相应 R14 中的 PC 值,及在退出异常处理时推荐使
用的指令。
表 2-4 异常进入/退出
以前的状态返回指令
ARM R14_x Thumb R14_x
注意
BL MOV PC,R14 PC+4 PC+2 1
SWI MOVS PC,R14_svc PC+4 PC+2 1
UDEF MOVS PC,R14_und PC+4 PC+2 1
FIQ SUBS PC,R14_fiq,#4 PC+4 PC+4 2
IRQ SUBS PC,R14_irq,#4 PC+4 PC+4 2
PABT SUBS PC,R14_abt,#4 PC+4 PC+4 1
DABT SUBS PC,R14_abt,#8 PC+8 PC+8 3
RESET NA - - 4
注意:
1、在此 PC 应是具有预取中止的 BL/SWI/未定义指令所取的地址。
2、在此 PC 是从 FIQ 或 IRQ 取得不能执行的指令的地址。
3、在此 PC 是产生数据中止的加载或存储指令的地址。
4、系统复位时,保存在 R14_svc 中的值是不可预知的。
异常向量(Exception Vectors)
表 2-5 显示异常向量地址。
表 2-5 异常向量表
地 址 异 常 进入模式
0x0000,0000 复位 管理模式
0x0000,0004 未定义指令 未定义模式
0x0000,0008 软件中断 管理模式
0x0000,000C 中止(预取指令) 中止模式
0x0000,0010 中止(数据) 中止模式
0x0000,0014 保留 保留
0x0000,0018 IRQ IRQ
0x0000,001C FIQ FIQ
异常优先级(Exception Priorities)
当多个异常同时发生时,系统根据固定的优先级决定异常的处理次序。异常优先级由高
到低的排列次序如表 2-6 所示。
表 2-6 异常优先级
优先级 异 常
1(最高) 复位
2 数据中止
3 FIQ
4 IRQ
5 预取指令中止
6(最低) 未定义指令、SWI
应用程序中的异常处理
当系统运行时,异常可能会随时发生,为保证在 ARM 处理器发生异常时不至于处于未
知状态,在应用程序的设计中,首先要进行异常处理,采用的方式是在异常向量表中的特定
位置放置一条跳转指令,跳转到异常处理程序,当 ARM 处理器发生异常时,程序计数器 PC
会被强制设置为对应的异常向量,从而跳转到异常处理程序,当异常处理完成以后,返回到
主程序继续执行。