一、前言

课程内容

  • ARM体系介绍
  • ARM程序设计模型
  • ARM汇编语言程序设计
  • ARM C/C++语言程序设计
  • ARM连接器的使用
  • ARM集成开发环境CodeWarrior IDE的介绍及高性能的调试工具ADW的使用
  • 一些典型的基于ARM体系的嵌入式应用系统设计时的基本技术。

嵌入式系统

嵌入式系统(Embedded System)是指以应用为中心以计算机技术为基础软件硬件可裁剪,适应应用系统对功能可靠性成本体积功耗严格要求专用计算机系统

一个中心:用户需求

两个基本点:硬件,软件

四个要求:性能,功耗,体积,价格

特点

  • 嵌入
  • 计算机
  • 专用

它并不是最近出现的新技术,只是随着微电子技术与计算机技术的发展,微控制芯片功能越来越强大,而嵌入微控制芯片的设备和系统越来越多,从而使得这种技术越来越引人注目。

嵌入式系统与通用的计算机系统有相似之处,也有明显的区别。

通常嵌入式系统中的系统程序(包括操作系统)和应用程序是浑然一体的,这些程序被编译连接成一个可以执行的二进制映像文件(image),这个二进制映像文件被固化在系统中,在系统复位后自动执行。

嵌入式系统的开发系统和实际运行的系统并不相同,需要交叉编译系统和适当的调试系统。

嵌入式系统是面向用户、面向应用的系统,这就决定了嵌入式系统的组成。一般来讲,一个嵌入式系统由应用软件、嵌入式操作系统和硬件设备组成。

第一章 ARM概述机器基本编程模型 - 图1

嵌入式系统各部分的功能如下

  • 应用软件可以具体实现用户的需求,是开发者在操作系统上基于硬件接口所开发的软件,其功能是完成嵌入式系统的功能应用;
  • 嵌入式操作系统是整个系统的核心,它负责整个系统的软、硬资源的分配,任务的调度和控制等,可实现系统所要求的功能;
  • 硬件设备包括嵌入式处理器及其外围设备,其中嵌入式处理器是硬件设备中的核心,外围设备是嵌入式系统用于实现存储、通信、显示等功能的辅助部件。

做嵌入式产品就是做硬件和软件,根基在于用户的需求!

将来做产品可以做高端也可以做低端!

如何做一个嵌入式产品呢?如何做硬件和软件呢?

一个实际开发场景:一台电脑,一块开发板,一周的时间,在开发板上运行一个程序出来

嵌入式系统发展

第一阶段:嵌入技术的早期阶段。嵌入式系统以功能简单的专用计算机或单片机为核心的可编程控制器形式存在,具有监测、伺服、设备指示等功能。这种系统大部分应用于各类工业控制和飞机、导弹等武器装备中。

第二阶段:以高端嵌入式CPU和嵌入式操作系统为标志。这一阶段系统的主要特点是计算机硬件出现了高可靠、低功耗的嵌入式CPU,如ARM、PowerPC等,且支持操作系统,支持复杂应用程序的开发和运行。

第三阶段:以芯片技术和Internet技术为标志。微电子技术发展迅速,SOC(片上系统)使嵌入式系统越来越小,功能却越来越强。目前大多数嵌入式系统还孤立于Internet之外,但随着Internet的发展及Internet技术与信息家电、工业控制技术等结合日益密切,嵌入式技术正在进入快速发展和广泛应用的时期。

嵌入式微处理器分类

第一章 ARM概述机器基本编程模型 - 图2

嵌入式微控制器(Microcontroller Unit, MCU)

嵌入式微控制器的典型代表是单片机,这种8位的电子器件目前在嵌入式设备中仍然有着极其广泛的应用。单片机芯片内部集成ROM/EPROM、RAM、总线、总线逻辑、定时/计数器、WatchDog、I/O、串行口、脉宽调制输出、A/D、D/A、Flash RAM、EEPROM等各种必要功能和外设。为适应不同的应用需求,一般一个系列的单片机具有多种衍生产品,每种衍生产品的处理器内核都是一样的,不同的是存储器和外设的配置及封装。这样可以使单片机最大限度地和应用需求相匹配,功能不多不少,从而减少功耗和成本。

微控制器是目前嵌入式系统工业的主流。微控制器的片上外设资源一般比较丰富,适合于控制,因此称为微控制器。

嵌入式DSP处理器(Embedded Digital Signal Processor, EDSP)

DSP处理器是专门用于信号处理方面的处理器,其在系统结构和指令算法方面进行了特殊设计,在数字滤波、FFT、谱分析等各种仪器上DSP获得了大规模的应用。目前最为广泛应用的嵌入式DSP处理器是TI的TMS320C2000/C6000系列,AD、和Intel的MCS-296和Siemens的TriCore也有各自的应用范围。

嵌入式DSP处理器有两个发展来源,一是DSP处理器经过单片化、EMC改造、增加片上外设成为嵌入式DSP处理器,TI的TMS320C2000 /C5000等属于此范畴;二是在通用单片机或SOC中增加DSP协处理器,例如Intel的MCS-296和Infineon(Siemens)的TriCore。

嵌入式微处理器(Embedded Microprocessor Unit, EMPU)

MPU嵌入式微处理器是由通用计算机中的的CPU演变而来的,与计算机处理器不同的是,在实际嵌入式应用中,只保留和嵌入式应用有关的母板功能,这样可以大幅度减小系统体积和功耗。为了满足嵌入式应用的特殊要求,嵌入式微处理器虽然在功能上和标准微处理器基本是一样的,但在工作温度、抗电磁干扰、可靠性等方面一般都做了各种增强。

和工业控制计算机相比,嵌入式微处理器具有体积小、重量轻、成本低、可靠性高的优点,但是在电路板上必须包括ROM、RAM、总线接口、各种外设等器件,从而降低了系统的可靠性,技术保密性也较差。嵌入式微处理器及其存储器、总线、外设等安装在一块电路板上,称为单板计算机。如STD-BUS、PC104等。

目前主要的嵌入式处理器类型有Am186/88、386EX、SC-400、Power PC、68000、MIPS、ARM/ StrongARM系列等。

嵌入式片上系统(System On Chip)

SOC就是System on Chip,片上系统。它结合了许多功能块,将功能做在一个芯片上,像是ARM RISC、MIPS RISC、DSP或是其他的微处理器核心,加上通信的接口单元,像是通用串行端口(USB)、TCP/IP通信单元、GPRS通信接口、GSM通信接口、IEEE1394、蓝牙模块接口等等,这些单元以往都是依照各单元的功能做成一个个独立的处理芯片。

SOC可以分为通用和专用两类。通用系列包括Infineon的TriCore,Motorola的M-Core,某些ARM系列器件,Echelon和Motorola联合研制的Neuron芯片等。专用SOC一般专用于某个或某类系统中,不为一般用户所知。一个有代表性的产品是Philips的Smart XA,它将XA单片机内核和支持超过2048 位复杂RSA算法的CCU单元制作在一块硅片上,形成一个可加载JAVA或C语言的专用的SOC,可用于公众互联网如Internet安全方面。

ARM嵌入式处理器

  • ARM嵌入式处理器是一种高性能、低功耗的RISC芯片。

体系结构:

RISC:Reduced Instruction Set Computer,精简指令集计算机)

RISC结构优先选取使用频最高的简单指令,避免复杂指令;将指令长度固定,指令格式和寻址方式种类减少;以控制逻辑为主,不用或少用微码控制等
RISC体系结构应具有如下特点:
1 采用固定长度的指令格式,指令归整、简单、基本寻址方式有2~3种。
2 使用单周期指令,便于流水线操作执行。
3 大量使用寄存器,数据处理指令只对寄存器进行操作,只有加载/存储指令可以访问存储器,以提高指令的执行效率。
除此以外,ARM体系结构还采用了一些特别的技术,在保证高性能的前提下尽量缩小芯片的面积,并降低功耗:
4 所有的指令都可根据前面的执行结果决定是否被执行,从而提高指令的执行效率。
5 可用加载/存储指令批量传输数据,以提高数据的传输效率。
6 可在一条数据处理指令中同时完成逻辑处理和移位处理。
7 在循环处理中使用地址的自动增减来提高运行效率。

CISC(Complex Instruction Set Computer,复杂指令集计算机)X86
在CISC指令集的各种指令中,大约有20%的指令会被反复使用,占整个程序代码的80%。而余下的指令却不经常使用,在程序设计中只占20%。

  • ARM处理器是英国Acorn有限公司设计。
  • 全称为Advanced RISC Machine。
  • ARM处理器是一种16/32位的高性能、低成本、低功耗的嵌入式RISC微处理器,由ARM公司设计,然后授权给各半导体厂商生产基于ARM体系结构的通用芯片或在其专用芯片中嵌入ARM的相关技术。
  • 它目前已经成为应用最为广泛的嵌入式处理器。
  • TI、Motorola、Intel、NS、Ateml、Philips、Altera、Agilent、Hynix、Nec、Sharp、Triscend、NEC、CirrusLogic、SAMSUNG、LINKUP

ARM处理器的三大特点

  • 耗电少功能强
  • 16位/32位双指令集
  • 合作伙伴众多

二、ARM体系结构的命名规则

提到的命名规则,应该分成两类。

  1. 基于ARM Architecture版本的“指令集架构”命名规则;
  2. 基于ARM Architecture版本的“处理器系列”命名规则。

1、“指令集架构”命名

基于ARM Architecture的版本命名规则

第一章 ARM概述机器基本编程模型 - 图3

(1)ARMv:固定字符串,即ARM Version
(2)n:指令集版本号,目前主要是 1~8的 8个数字的版本,即 n=[1:8]。其中最新的版本是第8版。
(3)variants:表示某种变种的字符。如 T(Thumb)变种,M 变种,版本 4出来以后,M 变种已经成为系统的标准配置,因此通常并不列出。
(4)x(variants):用字符 x 后面所跟的字符来表示被排除的某种功能,就是缺少某种功能的意思。

常见的variants有以下字母可选:

  • T — Thumb指令集
  • M — 长乘法指令
  • E — 增强型DSP指令
  • J — Java加速器Jazelle
  • SIMD — ARM媒体功能扩展

例如:ARMv5TxM 表示的是

  • 体系版本为第 5 版,
  • 支持T变种,
  • 不支持 M 变种。

2、“处理器系列”命名

在 ARMv3 ~ ARMv6 时期

第一章 ARM概述机器基本编程模型 - 图4

另外,还有一些附加的要点:
① ARM7TDMI 之后的所有 ARM 内核,即使“ARM”标志后没有包含“TDMI”字符,也都默认包含了
TDMI 的功能特性;
② JTAG 是由 IEEE 1149.1 标准测试访问端口和边界扫描结构来描述的,它是 ARM 用来发送和接收处理
器内核与测试仪器之间调试信息的一系列协议;
③ 嵌入式 ICE 宏单元是建立在处理器内部用来设置断点和观察点的调试硬件;
④ 可综合,意味着处理器内核是以源代码形式提供的。这种源代码形式可被编译成一种易于 EDA 工具使
用的形式。


ARM版本信息如下表所示

内核(架构)版本 处理器版本
ARMv1 ARM1
ARMv2 ARM2、ARM3
ARMv3 ARM6、ARM7
ARMv4 StrongARM、ARM7TDMI、ARM9TDMI
ARMv5 ARM7EJ、ARM9E、ARM10E、XScale
ARMv6 ARM11、ARM Cortex-M
ARMv7 ARM Cortex-A、ARM Cortex-M、ARM Cortex-R
ARMv8 ARM Cortex-A30、ARM Cortex-A50、ARM Cortex-A70

1、ARM体系结构的版本

  1. 版本1
    本版本在ARM1中实现,但没有在商业产品中使用。它包括下列指令:
    • 处理乘法指令之外的基本数据处理指令;
    • 基于字节、字和多字的读取和写入指令(Load/Store);
    • 包括子程序调用指令BL在内的跳转指令;
    • 供操作系统使用的软件中断指令SWI

本版本中地址空间是26位,目前已经不再使用。

  1. 版本2
    与版本1相比,版本2增加了下列指令:
    • 乘法指令和乘加法指令;
    • 支持协处理器的指令;
    • 对于FIQ模式,提供了额外的两个备份寄存器;
    • SWP指令及SWPB指令。

本版本中地址空间是26位,臼前己经不再使用。

  1. 版本3
    版本3较以前的版本发生了比较大的变化。主耍改进部分如下:
    • 处理器的地址空间扩展到了32位,但除了版本3G(版本3的一个变种)外的其他版本是向前兼容的,.支持26位的地址空间;
    • 当前程序状态信息从原来的 R15寄存器移到一个新的寄存器中,新寄存器名为CPSR(Current Program Status Register,当前程序状态寄存器)。
    • 增加了SPSR(Saved Program Status Register,备份的程序状态寄存器),用于在程序异常中断程序时,保存被中断的程序的程序状态。
    • 增加了两种处理器模式,使操作系统代码可以方便地使用数据访问中止异常、指令预取中止异常和未定义指令异常。
    • 增加了指令 MRS和指令MSR,用于访问CPSR寄存器和SPSR寄存器。
    • 修改了原来的从异常中返问的指令。
  2. 版本4
    与版本3相比,版本4增加了下列指令:
    • 半字的读取和写入指令。
    • 读取(Load)带符号的字节和半字数据的指令。
    • 增加了T变种,可以使处理器状态切换到Thumb 状态,在该状态下指令集是16位的Thumb指令集。
    • 增加了处理器的特权模式。在该模式下,使用的是用户模式下的寄存器。

另外,在版本4中明确定义了哪些指令会引起未定义指令异常。版本4不再强制要求与以前的26位地址空间兼容。

  1. 版本5
    与版本4相比,版本5增加或者修改了下列指令:
    • 提高了T变种中ARM/Thumb 混合使用的效率。
    • 对于T变种的指令和非T变种的指令使用相同的代码生成技术。

同时,版本5还具有以下的特点。

  • 增加了前导零计数(count leading zeros)指令,该指令可以使整数除法和中断优先
    级排队操作更为有效。
  • 增加了软件断点指令。
  • 为协处理器设计提供了更多的可选择的指令。
  • 更加严格地定义了乘法指令对条件标志位的影响。
    1. 版本6
      ARM体系版本6是2001年发布的。其主要特点是增加了SIMD 功能扩展。它适合使用电池供电的高性能的便携式设备。这些设备一方面需要处理器提供高性能,另一方面又需要功耗很低。SIMD 功能扩展为包括音频/视频处理在内的应用系统提供了优化功能。它可以使音频/视频处理性能提高4倍。
      ARM体系版本6首先在2002年春季发布的ARM11处理器中使用。
    2. 版本7
      2004年发布了新的ARMv7体系结构。在这个版本中,内核架构首次从单一款式变成3种款式。
      1)款式A:设计用于高性能的”开放应用平台”—越来越接近电脑了。
      款式A(ARMv7‐A):需要运行复杂应用程序的”应用处理器”。支持大型嵌入式操作系统,比如Symbian,Linux,以及微软的 WindowsCE和智能手机操作系统WindowsMobile。这些应用需要劲爆的处理性能,并且需要硬件MMU实现的完整而强大的虚拟内存机制,还 基本上会配有Java支持,有时还要求一个安全程序执行环境。典型的产品包括高端手机和手持仪器,电子钱包以及金融事务处理机。
      2)款式R:用于高端的嵌入式系统,尤其是那些带有实时要求的—又要快又要实时。
      款式R(ARMv7‐R):硬实时且高性能的处理器。标的是高端实时市场。那些高级的玩意,像高档轿车的组件,大型发电机控制器,机器手臂控制器等,它们 使用的处理器不但要很好很强大,还要极其可靠,对事件的反应也要极其敏捷。
      3)款式M:用于深度嵌入的,单片机风格的系统中。
      款式M(ARMv7‐M):认准了旧世代单片机的应用而量身定制。在这些应用中,尤其是对于实时控制系统,低成本、低功耗、极速中断反应以及高处理效率, 都是至关重要的。
      Cortex系列是v7架构的第一次亮相,其中Cortex‐M3就是按款式M设计的。
      到目前为止,Cortex‐M3也是款式M中被抚养成人的独苗。其它Cortex家族的处理器包括款式A的Cortex‐A8(应用处理器),款式R的 Cortex‐R4(实时处理器)。
    3. 版本8
      ARM公司首款支持64位指令集的处理器架构,包括64位通用寄存器SP (堆栈指针)和PC (程序计数器)。
      64位数据处理和扩展的虚拟寻址
      两种主要执行状态:
  • AArch64 ——64 位执行状态,包括该状态的异常模型、内存模型、程序员模型和指令集支持
  • AArch32 ——32 位执行状态,包括该状态的异常模型、内存模型、程序员模型和指令集支持

V8版架构支持三个主要指令集:
A32 (或ARM) : 32位固定长度指令集,通过不同架构变体增强部分32位执行架构,是一种AArch32指令集
T32 (Thumb) :以16位固定长度指令集的形式引入。在引|入Thumb-2技术时增强为16位和32位混合长度指令集;
A64:提供与ARM和Thumb指令集类似功能的32位固定长度指令集,是一种AArch64指令集。

2、ARM体系的变种

这里将某些特定功能称为ARM体系的某种变种(variant),例如支持Thumb指令集,称为T变种。目前ARM定义了一些变种。

  1. Thumb指令集(T变种)
    Thumb指令集是将ARM指令集的一个子集重新编码而形成的一个指令集。ARM 指令长度为32位,Thumb指令长度位为16位。这样,使用Thumb 指令集可以得到密度更高的代码,这对于需要严格控制产品成本的设计是非常有意义的。
    与ARM指令集相比,Thumb指令集具有以下局限:
    • 完成相同的操作,Thumb指令通常需要更多的指令。因此,在对系统运行时间要求苛刻的应用场合,ARM指令集更为适合。
    • Thumb指令集没有包含进行异常处理时需要的一些指令,因此在异常中断的低级处理时,还是需要使用ARM 指令。这种限制决定了Thumb 指令需要和ARM指令配合使用。对于支持 Thumb 指令的ARM体系版本,使用字符T来表示。

目前 Thumb指令集具有以下两个版本:

  • Thumb指令集版本1—本版本用于ARM体系版本4的T变种。
  • Thumb指令集版本2—本版本用于ARM体系版本5的T变种。

与版本1相比,Thumb指令集的版本2具有以下特点:

  • 通过增加指令和对已有指令的修改,提高ARM指令和Thumb指令混合使用时的效率。
  • 增加了软件断点指令。
  • 更加严格地定义了Thumb 乘法指令对条件标志位的影响。

这些特点和ARM体系版本4到版本5进行的扩展密切相关。实际上,通常并不使用Thumb 版本号,而是使用相应的ARM版本号。

  1. 长乘法指令(M变种)
    M变种增加了两条用于进行长乘法操作的 ARM 指令。其中一条指令用于实现32位整数乘以32位整数,生成64位整数的长乘法操作;另一条指令用于实现32位整数乘以32位整数,然后在加上32位整数,生成64位整数的长乘加操作。在需要这种长乘法的应用场合M变种很适合。
    然而,在有些应用场合中,乘法操作的性能并不重要,但对于尺寸要求很苛刻,在系统实现时就不适合增加M变种的功能。
    M变种首先在 ARM体系版本3中引入。如果没有上述的设计方面的限制,在ARM体系版本4及其以后的版本中,M变种是系统中的标准部分。对于支持长乘法ARM 指令的ARM体系版本,使用字符M来表示。
  2. 增强型DSP指念(E变种)
    E变种包含了些附加的指令,这些指令用于增强处理器对一些典型的DSP算法的处理性能。主要包括:
    • 几条新的实现16位数据乘法和乘加操作的指令。
    • 实现饱和的带符号数的加减法操作的指令。所谓饱和的带符号数的加减法操作是在加减法操作溢出时,结果并不进行卷绕(wrapping around),而是使用最大的整数或最小的负数来表示。
    • 进行双字数锯操作的指令,包括双字读取指令LDRD、双字写入指令STRD和协处理器的寄存器传输指令MCRR/MRRC。
    • cache 预取指令PLD。

E变种首先在ARM体系版本5T中使用,用字符E表示。在ARM 体系版本5以前的版本中,以及在非M变种和非T变种的版本中,E变种是无效的。
在早期的一些E变种中,未包含双学读取指令LDRD、双字写入指令STRD、协处理器的寄存器传输指令MCRR/MRRC 以及 cache预取指令 PLD。这种E变种记作ExP,其中x表示缺少,Р代表上述的几种指令。

  1. Java加速器Jazelle(J变种)
    ARM 的Jazelle技术将Java 的优势和先进的32位RISC芯片完美地结合在一‘起,Jazelle技术提供了Java加速功能,可以得到比普通Java虚拟机高得多的性能。普通的Java虚拟机相比,Jazelle使Java代码运行速度提高了8倍,而功耗降低了80%。
    Jazelle技术使得程序员可以在一个单独的处理器上同时运行Java 应用程序、已经建立好的操作系统、中间件以及其他的应用程序。与使用协处理器和双处理器相比,使用单独的处理器可以在提供高性能的同时,保证低功耗和低成本。
    J变种首先在ARM体系版本4TEJ中使用,用字符J表示J变种。
  2. ARM媒体功能扩展(SIMD变种)
    ARM媒体功能扩展为嵌入式应用系统提供了高性能的音频/视频处理技术。
    新一代的 Internet应用系统、移动电话和PDA等设备需要提供高性能的流式媒体,包括音频和视频等;而且这些设备需要提供更加人性化的界面,包括语音识别和手写输入识别等。这样,就要求处理器能够提供很强的数字信号处理能力,同时还必须保持低功耗、以延长电池的使用时间。ARM 的 SIMD 媒休功能扩展为这些应用系统提供了解决方案。它为包括音频/视频处理在内的应用系统提供了优化功能。它可以使音频/视顿处理性能提高4倍。其主要特点如下:
    • 将音频/视频处理性能提高了2~4倍。
    • 可以同时进行两个16位操作数或者4个8位操作数的运算。
    • 提供了小数算术运算。
    • 用户可以定义饱和运算的模式。
    • 两套16位操作数的乘加/乘减运算。
    • 32位乘以32位的小数MAC。
    • 同时8位/16位选择操作。

它的主要应用领域包括:

  • Internet应用系统。
  • 流式媒体应用系统。
  • MPEG4编码/解码系统。
  • 语音和手写输入识别。
  • FFT处理。
  • 复杂的算术运算。
  • Viterbi 处理。

3、ARM/Thumb体系版本的命名格式

表示ARM/Thumb体系版本的字符串是由下面几部分组成的:

  • 字符串ARMv。
  • ARM 指令集版本号。目前是1~6的数字字符。
  • 表示变种的字符。由于在ARM体系版本4以后,M变种成为系统的标准功能,字符M通常不需要列出来。
  • 使用字符x表示排除某种写功能。比如,在早期的一些E变种中,未包含双字读取指令LDRD、双字写入指令STRD、协处理器的寄存器传输指令MCRR/MRRC以及cache预取指令PLD。这种E变种记作ExP,其中x表示缺少,Р代表上述的几种指令。

目前有效的 ARM/Thumb体系版本名称及其含义如表中所列。这些名称描述了各版本的具体特点。

名称 ARM指令集版本号 Thumb指令集版本号 M变种 E变种
ARMv3 3
ARMv3M 3
ARMv4xM 4
ARMv4 4
ARMv4TxM 4 1
ARMv4T 4 1
ARMv5xM 5
ARMv5 5
ARMv5TxM 5 2
ARMv5T 5 2
ARMv5TexP 5 2 处理LDRD、MCRR、MRRC、PLD、STRD指令外的指令
ARMv5TE 5 2
ARMv5TEJ
ARMv6

三、ARM处理器系列

ARM 处理器目前包括下面几个系列的处理器产品以及其他厂 商实现的基于ARM体系结构的处理器:

  • ARM7系列
  • ARM9系列
  • ARM9E系列
  • ARM10E系列
  • SecurCore系列(专门为安全设备而设计的)
  • StrongARM/Xscale(来自于合作伙伴lntel)
  • ARM11

这些处理器广泛应用于以下的应用领域:

  • 开放应用平台包括无线系统、消费产品以及成像设备等。
  • 实时嵌入式应用包括存储设备、汽车、工业和网络设备。
  • 安全系统包括信用卡和SIM卡等。

1、ARM7系列

ARM7系列处理器是低功耗的 32位RISC处理器。内核采用冯·诺伊曼体系结构,数据和指令使用同一条总线。内核有一条 3 级流水线,执行 ARMv4指令集。

它主要用于对功耗和成本要求比较苛刻的消费类产品。其最高主频可以达到 130 MIPS。

ARM7系列处理器支持16 位的Thumb 指令集,使用Thumb指令集可以以16位的系统开销得到32位的系统性能。

ARM7系列包括ARM7TDMI、ARM7TDMl-S、ARM7EJ-S和ARM720T 四种类型,主要用于适应不同的市场需求。

ARM7系列处理器具体应用于以下场合:

  • 个人音频设备(MP3播放器、WMA播放器、AAC播放器)。
  • 接入级的无线无线设备。
  • 喷墨打印机。
  • 数字照相机。
  • PDA。

ARM7系列处理器具有以下主要特点:

  • 成熟的大批量的32位RICS芯片。
  • 最高主频达到130 MIPS。
  • 功耗很低。
  • 代码密度很高,兼容16位的微处理器。
  • 得到广泛的操作系统和实时操作系统支持,包括Window CE、 Palm Os、Symbian Os、 Linux以及业界领先的实时操作系统。
  • 众多的开发工具。
  • EDA仿真模型。
  • 优秀的调试机制。
  • 业界众多领先的IC制造商生产这类芯片。
  • 提供0.25μm、0.18μm及0.13μm的生产工艺。
  • 代码于ARM9系列、ARM9E、ARM10E兼容。

2、ARM9 系列

ARM9 系列于 1997 年问世。由于采用了 5 级指令流水线,ARM9 处理器能够运行在比 ARM7 更高的时钟频率上,改善了处理器的整体性能;存储器系统根据哈佛体系结构(程序和数据空间独立的体系结构)重新设计,区分了数据总线和指令总线。

ARM9系列处理器使用ARM9TDMI处理器核,其中包含了16位的Thumb 指令集。使用Thumb指令集可以以16位的系统开销得到32位的系统性能。

ARM9系列包括ARM920TARM922TARM940T 3种类型,主要用于适应不同的市场需求。

  • ARM9 系列的第一个处理器是 ARM920T,包含独立的数据指令 Cache 和 MMU。此处理器能够被用在要
    求有虚拟存储器支持的操作系统上。
  • 此系列的 ARM922T 是 ARM920T 的变种,只有一半大小的数据指令Cache。
  • ARM940T 包含一个更小的数据指令 Cache 和一个 MPU。它是针对不要求运行操作系统的应用而设计的。
  • ARM920T、ARM940T 都执行 v4T 架构指令。

ARM9系列处理器的具体应用于以下场合:

  • 下一代的无线设备,包括视频电话和 PDA等。
  • 数字消费品,包括机顶盒、家庭网关、MP3播放器和MPEG4播放器等。
  • 成像设备,包括打印机、数字照相机和数字摄像机等。
  • 汽车、通信和信息系统。

ARM9系列处理器具有以下主要特点:

  • 支持32位ARM指令集和16位Thumb指令集的32位RISC处理器。
  • 五级整数流水线。
  • 单―的32位AMBA总线接口。
  • MMU支持Window CE、Palm OS、Symbian OS、 Linux等。
  • MPU支持实时操作系统,包括Vxworks。
  • 统一的数据cache和指令cache。
  • 提供0.18μm、0.15μm及 0.13μm的生产工艺。

3、ARM9E 系列

ARM9 系列的下一个处理器是基于 ARM9E-S 内核的。这个内核是 ARM9 内核带有 E 扩展的一个可综合版
本。它有 ARM946E-SARM966E-S 两个变种。两者都执行 v5TE 架构指令。它们也支持可选的嵌入式跟
踪宏单元,支持开发者实时跟踪处理器上指令和数据的执行。当调试对时间敏感的程序段时,这种方法非
常重要。

  • ARM946E-S 包括 TCM、Cache 和一个 MPU。TCM 和 Cache 的大小可配置。该处理器是针对要求有确定
    的实时响应的嵌入式控制而设计的。
  • ARM966E-S 有可配置的 TCM,但没有 MPU 和 Cache 扩展。
  • ARM9 系列的 ARM926EJ-S 内核为可综合的处理器内核,发布于 2000 年。它是针对小型便携式 Java 设备,
    诸如 3G 手机和 PDA 应用而设计的。ARM926EJ-S 是第一个包含 Jazelle 技术,可加速 Java 字节码执行的
    ARM 处理器内核。它还有一个 MMU、可配置的 TCM 以及具有零或非零等待存储器的数据/指令 Cache。

ARM9E系列处理器具体应用在以下场合:

  • 下一代的无线没备,包括视频电话利lPDA等。
  • 数字消费品,包括机顶盒、家庭网关、MP3播放器和MPEG4播放器等。
  • 成像设备,包括打印机、数字照相机和数字摄像机等。
  • 存储设备,包括DVD域HDD等。
  • 工业控制,包括马达控制和能量控制等。
  • 汽车,通信和信息系统的ABS和车体控制等。
  • 网络设备,包括VoIP、WirelessLAN、xDSL等。

ARM9E系列处理器具有以下主要特点:

  • 支持32位的ARM指令集和16位的Thumb指令集的32位RISC处理器。
  • 包括了DSP指令集。
  • 五级整数流水线。
  • 在典型的0.13μm工艺下,主频叮以达到300 MIPS的性能。
  • 集成的实时跟踪和调试功能。
  • 单一的32位AMBA总线接口。
  • 可选的VFP9浮点处理协处理器。
  • 在实时控制和三维图像处理时主频可达到215 MFLOPS。
  • 高性能的AHB系统。
  • MMU支持Window CE、 Palm Os、Symbian OS、Linux等。
  • MPU 支持实时操作系统,包括Vxworks。
  • 统一的数据cache和指令cache。
  • 提供0.18μm、0.15μm及0.13μm的生产工艺。

4、ARM10 系列

ARM10 发布于 1999 年,具有高性能、低功耗的特点。它所采用的新的体系使其在所有 ARM 产品中具有最高的 MIPS/MHz。它将 ARM9 的流水线扩展到 6 级,也支持可选的向量浮点单元 VFP,对 ARM10 的流水线加入了第 7 段。VFP 明显增强了浮点运算性能并与 IEEE 754.1985 浮点标准兼容。

ARM10E 系列处理器采用了新的节能模式,提供了 64 位的 Load/Store 体系,支持包括向量操作的满足 IEEE 754 的浮点运算协处理器,系统集成更加方便,拥有完整的硬件和软件开发工具。ARM10E 系列包括ARM1020E、ARM1022E 和 ARM1026EJ-S三种类型。

ARM10E 系列处理器具体应用于以下场合:

  • 下一代的无线设备,包括视频电话、PDA、笔记本电脑和 Internet设备等。
  • 数字消费品,包括机顶盒、家庭网关、MP3播放器和MPEG4播放器等。
  • 成像设备,包括激光打印机、数字照相机和数字摄像机等。
  • 工业控制,包括马达控制和能量控制等。
  • 汽车,通信和信息系统等。

ARM10E系列处理器具有以下主要特点:

  • 支持32位的ARM指令集和16位的Thumb指令集的32位RISC处理器。
  • 包括了DSP指令集。
  • 六级整数流水线。
  • 在典型的0.13um 工艺下,主频可以达到400 MIPS的性能。
  • 单一的32位AMBA总线接口。
  • 可选的VFP10浮点处理协处理器。
  • 在实时控制和三维图像处理时主频可达到650 MFLOPS。
  • 高性能的AHB系统。
  • MMU支持Window CE、Palm Os、Symbian OS、Linux 等。
  • 统一的数据cache和指令cache。
  • 提供0.18um、0.15um及 0.13um 的生产工艺。
  • 并行读取/写入(load/store)部件。

5、ARM11 系列

ARM1136J-S 发布于 2003 年,是针对高性能和高能效应而设计的。ARM1136J-S 是第一个执行 ARMv6 架

构指令的处理器。它集成了一条具有独立的 Load/Stroe 和算术流水线的 8 级流水线。ARMv6 指令包含了

针对媒体处理的单指令流多数据流扩展,采用特殊的设计改善视频处理能力。

该系列主要有ARM1136J,ARM1156T2和ARM1176JZ三个内核型号,分别针对不同应用领域。

ARM11处理器系列可以在使用130nm代工厂技术、小至2.2mm2芯片面积和低 至0.24mW/MHz的前提下达到高达500MHz的性能表现。ARM11处理器系列以众多消费产品市场为目标,推出了许多新的技术,包括针对媒体处理 的SIMD,用以提高安全性能的TrustZone技术,智能能源管理(IEM),以及需要非常高的、可升级的超过2600 Dhrystone 2.1 MIPS性能的系统多处理技术。主要的ARM11处理器有ARM1136JF-S、ARM1156T2F-S、ARM1176JZF-S、ARM11 MCORE等多种。

6、SecurCore 系列

SecurCore 系列处理器提供了基于高性能的 32 位 RISC 技术的安全解决方案。SecurCore 系列处理器除了具

有体积小、功耗低、代码密度高等特点外,还具有它自己特别优势,即提供了安全解决方案支持。下面总

结了 SecurCore 系列的主要特点:

① 支持 ARM 指令集和 Thumb 指令集,以提高代码密度和系统性能;

② 采用软内核技术以提供最大限度的灵活性,可以防止外部对其进行扫描探测;

③ 提供了安全特性,可以抵制攻击;

④ 提供面向智能卡和低成本的存储保护单元 MPU;

⑤ 可以集成用户自己的安全特性和其他的协处理器。

SecurCore 系列包含 SC100、SC110、SC200 和 SC210 4 种类型。

SecurCore 系列处理器主要应用于一些安全产品及应用系统,包括电子商务、电子银行业务、网络、移动媒体和认证系统等。

7、Cortex系列处理器

Cortex-A系列

Cortex-A,代表的是先进意义(Advanced),目标是以最佳功耗实现最高性能,主要应用领域包括汽车、工业、医学、调制解调器、存储等。Cortex-A也是目前应用最广的处理器版本。

该系列处理器主要包括Cortex-A5、Cortex-A7、Cortex-A8、Cortex-A9、Cortex-A15、Cortex-A17、Cortex-A32、Cortex-A35、Cortex-A53、Cortex-A57、Cortex-A72、Cortex-A73。

Cortex-A8只支持单核。

其中,

Cortex-A5、Cortex-A7、Cortex-A8、Cortex-A9、Cortex-A15、Cortex-A17基于ARMv7-A架构;

Cortex-A32、Cortex-A35、Cortex-A53、Cortex-A57、Cortex-A72、Cortex-A73基于ARMv8-A架构,

除了Cortex-A32为32位结构,其它支持64位结构。

Cortex-A处理器从高到低可排序为:Cortex-A73、Cortex-A72、Cortex-A57、Cortex-A53、Cortex-A35、Cortex-A32、Cortex-A17、Cortex-A15、Cortex-A7、Cortex-A9、Cortex-A8、Cortex-A5。

Cortex-R系列

Cortex-R,代表实时的意义(Real-Time),目标是实时任务处理,主要应用领域包括汽车、相机、工业、医学等。

该系列处理器主要包括Cortex-R4、Cortex-R5、Cortex-R7、Cortex-R8、Cortex-R52、Cortex-A17。

Cortex-M系列

Cortex-M,代表微处理器的意义(Microcontrollers),目标是最节能的嵌入式设备,主要应用领域包括汽车、能源网、医学、嵌入式、智能卡、智能设备。传感器融合、穿戴设备等。

该系列处理器主要包括Cortex-M0、Cortex-M0+、Cortex-M3、Cortex-M4、Cortex-M7、Cortex-M23、Cortex-M33、Cortex-M35P。

ARM Cortex-M系列支持Thumb-2指令集(Thumb指令集的扩展集),可以执行所有已存的为早期处理器编写的代码。通过一个前向的转换方式, 为ARM Cortex-M系列处理器所写的用户代码可以与ARM Cortex-R系列微处理器完全兼容。

ARMCortex-M系列系统代码(如实时操作系统)可以很容易地移植到基于ARM Cortex-R系列的系统上。

ARMCortex-A和Cortex-R系列处理器还支持ARM 32位指令集,向后完全兼容早期的ARM处理器,包括从1995年发布的ARM7TDMI处理器到2002年发布的ARMll处理器系列。

ARM7、ARM9、ARM10 及 ARM11 内核之间属性的比较

项 目 ARM7 ARM9 ARM10 ARM11
流水线深度 3级 5级 6级 8级
典型频率(MHz) 80 150 260 335
功耗(mw/MHz) 0.06 0.19(+Cache) 0.5(+Cache) 0.4(+Cache)
MIPS/ MHz 0.97 1.1 1.3 1.2
架构 冯诺伊曼 哈佛 哈佛 哈佛
乘法器 8×32 8×32 16×32 16×32

四、ARM处理器模式

ARM处理器共有7种运行模式

处理器模式 描述
用户模式(User,user) 正常程序执行的模式
快速中断模式(FIQ,fiq) 用于高速数据传输和通道处理
外部中断模式(IRQ,irq) 用于通常的中断处理
特权模式(Supervisor,sve) 供探作系统使用的一种保护模式
数据访问中止模式(Abort,abt) 用于虚拟存储及存储保护
未定义指令中止模式(Undefined,und) 用于支持通过软件方针硬件的协处理器
系统模式(System.sys) 用于运行特权级的操作系统任务

除了用户模式之外的其他6种处理器模式称为特权模式(Privileged Modes)。在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切换。其中,除系统模式外,其他5种特权模式又称为异常模式。

处理器模式可以通过软件控制进行切换,也可以通过外部中断或异常处理过程进行切换。大多数的用户程序运行在用户模式下。这时,应用程序不能够访问―些受操作系统保护的系统资源。应用程序也不能直接进行处理器模式的切换。需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理过程中进行处理器模式的切换。这种体系结构可以使操作系统控制整个系统的资源。

当应用程序发生异常中断时,处理器进入相应的异常模式。在每以种异常模式中都有一组寄存器,供相应的异常处理程序使用,这样就可以保证在进入异常模式时,用户模式下的寄存器(保存了程序运行状态)不被破坏。

系统模式并不是通过异常过程进入的,它和用户模式具有完全一样的寄存器。但是系统模式属于特权模式,可以访问所用的系统资源,也可以直接进行处理器模式切换。它主要供操作系统任务使用。通常操作系统的任务需要访问所有的系统资源,同时该任务仍然使用用户模式的寄存器组,而不是使用异常模式下相应的寄存器组,这样可以保证当钟常中断发生时任务状态不被破坏。

五、ARM寄存器介绍

ARM处理器共有37个寄存器。其中包括:

  • 31个通用寄存器,包括程序计数器(PC)在内。这些寄存器都是32位寄存器。
  • 6个状态寄存器。这些寄存器都是32位寄存器,但F前只使用了其中12位。

ARM处理器共有7种不同的处理器模式,在每一种处理器模式中有一组对应的寄存器组。任意时刻(也就是任意的处理器模式下),可见的寄存器包括15个通用寄存器(R0~R14)、一个或两个状态寄存器及程序计数器(PC)。在所有的寄存器中,有些是各模式共用的同一个物理寄存器;有一些寄存器是各模式白己拥有的独立的物理寄存器。

下表列出了各处理器模式下可见的寄存器情况。

第一章 ARM概述机器基本编程模型 - 图5

通用寄存器

通用寄存器可以分为下面3类:

  • 未备份寄存器,包括R0~R7;
  • 备份寄存器,包括R8~R14;
  • 程序计数器,即R15。

1、 未备份寄存器:

未备份寄存器包括R0~R7。对于每一个未备份寄存器来说,在所有的处理器模式下指的都是同一个物理寄存器。在异常中断造成处理器模式切换时,由于不同的处理器模式使用相同的物理寄存器,可能造成寄存器中数据被破坏。未备份寄存器没有被系统用于特别的用途,任何采用通用寄存器的应用场合都可以使用未备份寄存器。

2、 备份寄存器:

对于备份寄存器R8~R12来说,每个寄存器对应两个不同的物理寄存器。例如,当使用快速中断模式下的寄存器时,寄存器R8和寄存器R9分别记作为R8_FIQ、R9_FIQ;当使用用户模式下的寄存器时,寄存器R8和R9分别记作R8_USR、R9_USR等。在这两种情况下,使用的是不同的物理寄存器。系统没有将这几个寄存器用于特殊的用途,但是当中断处理非常简单,仅仅使用R8~R14寄存器时,FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而可以使中断处理过程非常迅速。

对于备份寄存器R13和R14来说,每个寄存器对应6种不同的物理寄存器,其中的一个是用户模式和系统模式共用的,另外5个对应于其他的5种处理器模式。采用下面的记号来区分各个物理寄存器。

R13_<mode>

其中,<mode>可以是下面几种情况之一:usr、svc、abt、und、irq和fiq。

寄存器R13在ARM中常用作栈指针(sp)。在ARM指令集中,这只是一种习惯的用法,并没有任何指令强制性地使用R13作为栈指针,用户也可以使用其他的寄存器作为栈指针;而在Thumb指令集中,有一些指令强制使用R13作为栈指针。

每一种异常模式拥有自己的物理的R13。应用程序初始化该R13,使其指向该异常模式专用的栈地址。当进入异常模式时,可以将需要使用的寄存器保存在R13所指的栈中;当退出异常处理程序时,将保存在R13所指的栈中的寄存器值弹出。这样就使异常处理程序不会破坏被其中断程序的运行现场。

寄存器R14又被称为连接寄存器(LR),在ARM体系中具有下面两种特殊的作用:

  • 每一种处理器模式自己的物理R14中存放着当前子程序的返回地址。当通过BL跳转指令调用子程序是,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到程序计数器PC中时,子程序即返回。可以通过下面的两种方式实现这种子程序的返回操作。

    • 执行下面的任何一条指令:

      1. MOV PC, LR
      2. BX LR
      • 在子程序入口使用下面的指令将PC保存到栈中:
        STMFD SP!, {<registers>, LR}
        相应的,下面的指令可以实现子程序的返回:
        LDMFD SP!, {<register>, PC}
  • 当异常中断发生时,该异常模式特定的物理寄存器R14被设置成该异常模式将要返回的地址,对于有些异常模式,R14的值可能与将返回的地址有一个常数的偏移量。具体的返回方式与上面的子程序返回方式基本相同。

R14寄存器也可以作为通用寄存器来使用。

3、程序计数器R15(PC):

程序计数器R15又被记作PC。它虽然可以作为一般的通用寄存器使用,但是有一些指令在使用R15时有一些特殊限制。当违反了这些限制时,该指令执行的结果将是不可预料的。

由于ARM采用流水线机制,当正确读取了PC的值时,该值为当前指令的地址加8个字节。也就是说,对于ARM指令集来说,PC指向当前指令的下两条指令的地址。由于ARM指令是字节对齐的,PC值的第0位和第1位总是0。

需要注意的是,当使用指令STR/STM保存R15时,保存的可能是当前指令地址值加8字节,也可能保存的是当前指令地址加12字节。到底是哪种方式,取决于芯片的具体设计方式。无论如何,在同一芯片中,要么采用当前指令地址加8,要么采用当前指令地址加12字节,不能有些指令采用当前指令地址加8,另一些指令采用当前指令地址加12。因此对于用户来说,尽量避免使用STM/STR指令来保存R15的值。当不可避免这种使用方式时,可以先通过一些代码来确定所用的芯片使用的是哪种方式。假设R0指向可用的一个内存字,下面的代码可以在R0指向的内存字中返回该芯片所采用的地址偏移量。

  1. SUB R1, PC ,#4 @R1中存放下面STR指令的地址
  2. STR PC, [R0] @PC=STR地址加offset保存到R0
  3. LDR R0, [R0]
  4. SUB R0, R0, R1 @offset=PC-STR地址

在上面的讨论中,都是针对指令返回的值。该值并非在指令读取期间出现在数据总线上的值。在指令读取期间出现在数据总线上的值取决于芯片的具体实现方式。

当成功的向R15中写入一个地址值时,程序将跳转到该地址执行。由于ARM指令是字对齐的,写入R15的地址值应该满足bits[1:0]=0b00,至于具体的要求,ARM各版本有所不同。

  • 对于ARM版本3以及更低的版本,写入 R15的地址值的 bits[1∶0]被忽略,即写入R15的地址值将与OxFFFFFFFC做与操作。
  • 对于ARM版本4以及更高的版本,程序必须保证写入 R15寄存器的地址值的bits[ 1∶0]为0b00;否则将会产生不可预知的结果。

对于Thumb指令集来说,指令是半字节对齐的。处理器将忽略bit[0],即写入R15的地址值首先与0xFFFFFFFE做与操作,再写入R15中。

还有一些指令对R15的用法有一些特殊的要求。比如,指令BX利用bit[0]来确定是ARM指令,还是Thumb指令。

这种读取PC值和写入PC值的不对称的操作需要特别注意。这一点在以后的章节还有介绍。如指令”MOV PC, PC”将程序跳转到当前指令下面第2条指令处执行。因为指令中,第2个PC寄存器读出的值为当前指令的地址值加8,这样对ARM指令而言,写入PC寄存器的是当前指令下面第2条指令的地址。类似的指令还有”ADD PC, PC, #0”。

程序状态寄存器

CPSR(当前程序状态寄存器)可以在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。每一种处理器模式下都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存器)。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断程序退出时,可以用SPSR中保存的值来恢复CPSR。

由于用户模式和系统模式不是异常中断模式,所以它们没有SPSR。当在用户模式或系统模式中访问SPSR时,将会产生不可预知的结果。

CPSR的格式如下所示。SPSR格式与CPSR的格式相同。

31 30 29 28 27 26 7 6 5 4 3 2 1 0
N Z C V Q DNM I F T M4 M3 M2 M1 M0

1、条件标志位

N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)统称为条件标志位。大部分的ARM指令可以根据CPSR中的这些条件标志位来选择性地执行。各条件标志位的具体含义如下表所示。

CPSR中的条件标志位

标志位 含义
N 本位设置成当前指令运算结果的bit[31]的;当两个补码表示的有符号整数运算时,N=1表示运算的结果的为负数,N=0表示结果为正数或零。
Z Z=1表示运算结果为零;Z=0表示运算的结果不为零,对于CMP指令,Z=1表示进行比较的两个数大小相等
C 下面分4种情况讨论C的设置方法:
在加法指令中,当结果产生了进位,则C=1,表示无符号数运算发生了上溢;其他情况下为0;
在减法指令中,当运算发生了借位,则C=0,表示无符号数运算发生下溢出,其他情况下为0;
对于其他非加/减运算指令,C位的值通常不受影响。
V 对于加/减法指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。

以下指令会影响CPSR中的条件标志位:

  • 比较指令,如CMP、CMN、TEQ和TST等;
  • 当一些算数运算指令和逻辑指令的目标寄存器不是R15时,这些指令会影响CPSR中的条件标志位;
  • MSR指令可以向CPSR/SPSR中写入新值;
  • MSC指令将R15作为目标寄存器时,可以把协处理器产生的条件标志位的值传送到ARM处理器;
  • 一些LDM指令的变种指令可以将SPSR的值复制到CPSR中,这种操作注意用于从异常中断程序中返回;
  • 一些带“位设置”的算术和逻辑指令的变种指令,也可以将SPSR的值复制到CPSR中,这种操作主要用于从异常中断程序中返回。

2、Q标志位

在ARMv5的E系列处理器中,CPSR的bit[27]称为Q标志位,主要用于指示增强的DSP指令是否发生了溢出。同样的SPSR中的bit[27]也称为Q标志位,用于在异常中断发生时保存和恢复CPSR中的Q标志位。

3、CPSR中的控制位

CPSR的低8位I、F、T及M[4:0]统称为控制位。当异常中断发生时,这些位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。

  1. 中断禁止位:
    当I=1时禁止IRQ中断;
    当F=1时禁止FIQ中断;
  2. T控制位:
    T控制位用于控制指令执行的状态,即说明指令是ARM指令,还是Thumb指令。对于不同版本的ARM处理器,T控制位的含义不同。
    对于ARMv4以及更高的版本的T系列的ARM处理器,T控制位的含义如下:
    • T=0表示执行的ARM指令;
    • T=1表示执行的Thumb指令;
  3. M控制位:
    控制位M[4:0]控制处理器模式,具体含义如下表所示:
    | M[4:0] | 处理器模式 | 可访问的寄存器 | | —- | —- | —- | | 0b10000 | User | PC,R0~R14,CPSR | | 0b10001 | FIQ | PC,R0R7,R8_fiqR14_fiq,CPSR,SPSR_fiq | | 0b10010 | IRQ | PC,R0R7,R8_irqR14_irq,CPSR,SPSR_irq | | 0b10011 | Supervisor | PC,R0R7,R8_svcR14_svc,CPSR,SPSR_svc | | 0b10111 | Abort | PC,R0R7,R8_abtR14_abt,CPSR,SPSR_abt | | 0b11011 | Undefined | PC,R0R7,R8_undR14_und,CPSR,SPSR_und | | 0b11111 | System | PC,R0~R14,CPSR |

4、CPSR中其他位

CPSR中的其它位用于将来ARM版本的扩展,应用软件不要操作这些位,以免与ARM将来版本的扩展冲突。

六、ARM体系的异常中断

在ARM体系中通常有以下3种方式控制程序的执行流程:

  • 在正常程序执行过程中,每执行一条ARM 指令,程序计数器寄存器(PC)的值加4个字节;每执行一条Thumb指令,程序计数器寄存器(PC)的值加两个字节。整个过程是按顺序执行。
  • 通过跳转指令,程序可以跳转到特定的地址标号处执行,或者跳转到特定的了程序处执行。
    • B指令用于执行跳转操作;
    • BL指令在执行跳转操作的同时,保存子程序的返回地址;
    • BX 指令在执行跳转操作的同时,根据目标地址的最低位可以将程序状态切换到Thumb 状态;
    • BLX 指令执行3个操作,跳转到只标地址处执行,保存子程序的返回地址,根据目标地址的最低位可以将程序状态切换到Thumb状态。
  • 当异常中断发生时,系绕执行完当前指令后,将跳转到相应的异常中断处理程序处执行。在当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序退出时,要恢复被中断的程序的执行现场。

1、ARM中异常中断种类

ARM体系中的异常中断如表所示。

异常中断名称 含义
复位(reset) 当处理器的复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行,复位异常中断通常用于下面几种情况:系统加电时;系统复位时;跳转到复位中断向量处执行,称为软复位;
未定义指令 当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断,可以通过异常中断机制仿真浮点向量运行;
软件中断 这是一个用户定义的中断指令,可用于用户模式下的程序调用特权操作指令。
指令预取中止 如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当该被取的指令执行时,处理器产生指令预取中止异常中断;
数据访问中止 如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问中止异常中断;
外部中断请求 当处理器的外部中断请求引脚有效时,而且CPSR寄存器的I控制位被清除时,处理器产生外部中断请求异常中断,系统中各外设通常通过异常中断请求处理器服务;
快速中断请求 当处理器的外部快速中断请求引脚有效时,而且CPSR寄存器的F控制位被清除时,处理器产生外部中断请求异常中断;

各种异常中断对具有各自的备份的寄存器组,在前面己经有了比较详细的介绍,这里不再重复。

当多个异常中断同时发生时,可以根据各异常中断的优先级选择响应优先级最高的异常中断。关于异常中断的优先级将在后面详细介绍。

2、ARM 处理器对异常中断的响应过程

ARM处理器对异常中断的响应过程如下所述。

  • 保存处理器当前状态、中断屏蔽位以及各条件标志位。这是通过将当前程序状态寄存器CPSR的内容保存到将要执行的异常中断对应的SPSR寄存器中实现的。各异常中断有自己的物理SPSR寄存器。
  • 设置当前程序状态寄存器CPSR中相应的位。包括:设置CPSR 中的位,使处理器进入相应的执行模式;设置CPSR中的位,禁止RQ中断,当进入FIQ模式时,禁止FIQ中断。
  • 将寄存器lr_mode设置成返回地址。
  • 将程序计数器值(PC),设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。
    上述的处理器对异常中断的响应过程可以用如下的伪代码描述。
  1. R14_<exception_rnode> = return link
  2. SPSR_<exception_rnode> = CPSR
  3. CPSR[4:0] = exception mode runber
  4. /*当运行于ARM状态时*/
  5. CPSR[5] = 0
  6. *当相应FIQ异常中断时,禁止新的FIQ中断*/
  7. if <exception_ mode> == Reset or FIQ then
  8. CPSR[6] = 1
  9. /*禁止新的FtQ中断*/
  10. CPSR[7] = 1
  11. PC = exception vector address

3、从异常中断处理程序中返回

从异常中断处理程序中返回包括以下两个基本操作:

  • 恢复被中断的程序的处理器状态,即将SPSR_mode寄存器内容复制到CPSR中。
  • 返回到发生异常中断的指令的下一条指令处执行,即将lr_mode寄存器的内容复制到程序计数器PC中。

复位异常中断处理程序不需要返回。在复位异常中断处理程序开始整个用户程序的执行,因而它不需要返回。

实际上,当异常中断发生时,程序计数器PC所指的位置对于各种不同的异常中断是不同的。同样,返回地址对于务种不同的异常中断也是不同的。

七、ARM体系中存储系统

1、ARM体系中的存储空间

ARM体系使用单一的平板地址空间。该地址空间的大小为232个8位字节。这些字节单元的地址是一个无符号的32位数值,其取值范围为0到232-1。

ARM的地址空间也可以看作是230个32位的字单元。这些字单元的地址可以被4整除,也就是说该地址的低两位为0b00。地址为A的字数据包括地址为A、A+1、A+2、A+3四个字节单元的内容。

在ARM版本4及以上的版本中,ARM的地址空间也可以看作是231个16位的半宁单元。这些半字单元的地址可以被⒉整除,也就是说该地址的最低位为0b0。地址为A的半字数括包括地址为A、A+1两个字节单元的内容。

各存储单元的地址作为32位的无符号数,可以进行常规的整数运算。这些运算的结果进行232取模。也就是说,运算结果发生上溢出和下溢出时,地址将会发生卷绕。

2、ARM存储器格式

在ARM体系中,每个字单元中包含4个字节单元或者两个半字单元;1个半字单元巾包含两个字节单元。但是在字单元中,4个字节哪一个是高位字节,哪一个是低位字节则有两种不同的格式:big-endian格式和 little-endian格式。

在big-endian格式中,对于地址为A的字单元包括字节单元A、A+1、A+2及A+3,其中字节单元由高位到低位字节顺序为A、A+1、A+2、A-3;地址为A 的字单元包括半字单元A、A+2,其中半字单元由高位到低位字节颇序为A、A+2;地址为A的半字单元包括字节单元A、A+1,其中字节单元由高位到低位字节顺序为A、A+1。这种存储器格式如图所示。

31 24 23 16 15 8 7 0

第一章 ARM概述机器基本编程模型 - 图6

在little-endian格式中,地址为A的字单元包括字节单元A、A+1、A+2及A+3,其中字节单元由高位到低位字节顺序为A+3、A+2、A+1、A;地址为A 的半字单元包括半字单元A、A+2,其中半字单元由高位到低位字节顺序为A+2、A;地址为A的半字单元包括字节单元A、A+1,其中字节单元由高位到低位字节顺序为A+1、A。这种存储器格式如图所示。

31 24 23 16 15 8 7 0

第一章 ARM概述机器基本编程模型 - 图7

3、 非对齐的存储访问操作

在ARM 中,通常希望字单元的地址是字对齐的(地址的低两位为0b00)、半字单元的地址是半字对齐的(地址的最低位为0b0)。在存储访问操作中,如果存储单元的地址没有遵守上述的对齐规则,则称为非对齐(unaligned)的存储访问操作。

  1. 非对齐的指令预取操作
    当处理器处于ARM状态期间,如果写入到寄存器PC中的值是非字对齐的(低两位不为0b00),要么指令执行的结果不可预知,要么地址值中最低两位被忽略;当处理器处于Thumb 状态期间,如果写入到寄存器PC中的值是非半字对齐的(最低位不为 0b0),要么指令执行的结果不可预知,要么地址值中最低位被忽略。
    如果系统中指定,当发生非对齐的指令预取操作时,忽略地址值中相应的位,则由存储系统实现这种“忽略”。也就是说,这时该地址值原封不动地送到存储系统。
  2. 非对齐的数据访问操作
    对于Load/Store操作,如果是非对齐的数据访问操作,系统定义了下面3种可能的结果。
    • 执行的结果不可预知。
    • 忽略字单元地址的低两位的值,即访问地址为(address AND OXFFFFFFC)的字单元;忽略半字单元地址的最低位的值,即访问地址为(address AND 0XFFFFFFE)的半字单元。
    • 忽略字单元地址值中的低两位的值;忽略半字单元地址的最低位的值。由存储系统实现这种“忽略”。也就是说,这时该地址值原到不动地送到存储系统。

当发生非对齐的数据访问时,到底采用上述3种处理方法中的哪一种,是由各指令指定的。

4、指令预取和自修改代码

在 ARM中允许指令预取。在CPU执行当前指令的同时,可以从存储器中预取其后若干条指令,具体预取多少条指令,不同的ARM实现中有不同的数值。

预取的指令并不一定能够得到执行。比如当前指令完成后,如果发生了异常中断,程序将会跳转到异常中断处理程序处执行,当前预取的指令将被抛弃。或者如果执行了跳转指令,则当前预取的指令也将被抛弃。

正如在不同的 ARM实现中,预取的指令条数可能不同,当发生程序跳转时,不同的ARM 实现中采用的跳转预测算法也可能不同。

自修改代码指的是代码在执行过程中可能修改自身。对于支持指令预取的ARM 系统,自修改代码可能带来潜在的问题。当指令被预取后,在该指令被执行前,如果有数据访问指令修改了位于主存中的该指令,这时被预取的指令和主存中对应的指令不同,从而可能使执行的结果发生错误。