第二章 ARM处理器及系统结构
2.1 ARM处理器简介
- 采用RISC架构的ARM微处理器的特点:
- 体积小、功耗低、低成本、高性能;
- 支持 Thumb(16位)/ARM(32位)双指令集,能很好地兼容 8位/16位 器件;
- Thumb为压缩指令集
- 大量使用寄存器,指令执行速度更快;-----通用寄存器更多
- 大多数数据操作都在寄存器中完成;
- 寻址方式灵活简单,执行效率高;
- 指令长度固定
- 绝大多数指令单周期,少量不是
- 常见的ARM处理器的类别:
- ARM7系列
- ARM9系列
- ARM9E系列
- ARM10E系列
- ARM11系列
- SecurCore微处理器系列
- Coretex
2.2 ARM微处理器系列
2.2.1 ARM指令集体系结构的演变
- 了解即可
- ARM处理器和指令集构架版本的对应关系
-
ARM/Thumb的命名规范
-
以ARMv开头
-
ARM指令集的版本号(1-8)
-
可变功能标识
-
T—表示支持Thumb指令,
-
M—表示支持乘法指令,
-
E — 增强型DSP指令,
-
J — Java加速器Jazelle,
-
SIMD — ARM媒体功能扩展,
-
但是ARMv4和其上的版本缺省都支持M功能,因此ARMv4和其上的版本的标识中可以不用标识M.
-
-
如果3中描述的功能不存在,则在该功能标识符前加x 。
- 例如,ARMv5TxM 表示 ARM 指令集版本为 5,支持 T 变种,不支持 M 变种。
-
-
ARM处理器命名
- 规则:ARM{x}{y}{z}{T}{D}{M}{I}{E}{J}{F}{-S}
- x – 处理器系列
- y – 存储管理/保护单元
- z – cache
- T – 支持Thumb指令集
- D – 支持片上调试
- M – 支持快速乘法器
- I – 支持Embedded ICE,支持嵌入式跟踪调试
- E – 支持增强型DSP指令
- J – 支持Jazelle
- F – 具备向量浮点单元VFP
- -S – 可综合版本
- 规则:ARM{x}{y}{z}{T}{D}{M}{I}{E}{J}{F}{-S}
-
ARM处理器指令集的特点
- ARM内核不是一个纯粹的RISC体系结构,ARM指令集与纯粹的RISC的定义有以下几个不同。
- 一些特定指令的周期数可变,并不是每条ARM指令都是单周期的。
- 内嵌的桶形移位器产生了更为复杂的指令,扩展了指令的功能,因此改善了内核的性能。
- 支持16位的Thumb指令集,提高了代码密度。
- 支持条件执行:每条指令都可以设置一个执行条件,只有条件满足时才执行。
- 增强指令:一些功能强大的数字信号处理指令被加入到ARM指令集中。
- ARM内核不是一个纯粹的RISC体系结构,ARM指令集与纯粹的RISC的定义有以下几个不同。
2.2.2 ARM体系结构的演变
-
ARM7
-
ARM9
- 存储器:哈佛体系结构----区分了数据总线和指令总线
- 5级流水线:取指、译码、执行、缓冲/数据、回写
-
ARM10E
- 6级流水线
-
ARM11
- 包含64个4种状态的跳转目标地址缓存
- 有产品用多核处理器
-
Cortex
-
SecurCore 微处理器系列
2.3 ARM9处理器内核
2.3.1 ARM9系列MCU
一、ARM9TDMI
- 后缀意义
- T:支持16位Thumb指令集;
- D:支持片上Debug;
- M:内嵌硬件乘法器;
- I:嵌入式ICE,支持片上断点和调试点
- ARM9TDMI使用哈佛结构,通过cache可以同时读取指令和数据。
- 流水线从ARM7TDMI的 3级 增加到 5级。
- 在相同工艺下,ARM9TDMI的性能近似为ARM7TDMI的2倍。
2.3.2 ARM9TDMI的流水线
一、ARM7 的 3 级流水线
二、ARM9 的 5 级流水线
- 5级流水线 是 ARM9TDMI 的主要特征之一,其设计减少了在每个时钟内必须完成的最大工作量,进而允许使用较高的时钟频率。
- 取指:指令从存储器中取出,放入指令流水线;
- 译码:指令译码,从寄存器堆中读取寄存器操作数;
- 执行:把一个操作数移位,产生ALU的结果。
- 如果指令是Load或Store,在ALU中计算存储器的地址;
- 缓存/数据:如果需要,则访问数据存储器;
- 否则,ALU的结果只是简单地缓冲一个时钟周期,以便使所有指令具有同样的流水线流程;
- 回写:将指令产生的结果写回到寄存器堆,包括任何从寄存器读出的数据
ARM9TDMI与ARM7TDMI流水线比较
2.3.3 协处理器接口
- 定义:
- 协处理器用于减轻系统微处理器的特定处理任务的芯片或模块
- ARM处理器内置的协处理器通过扩展指令集或提供配置寄存器来扩展内核处理功能。
- 扩展指令集:
- 协处理器也能通过提供一组专门的新指令来扩展指令集。
- 例如,有一组专门的指令可以添加到标准ARM指令集中,以处理向量浮点(VFP)运算。
- 这些新指令是在ARM流水线的译码阶段被处理的。
- 协处理器和ARM处理器连接到同一个指令总线,这意味着协处理器可以对指令流中的指令进行译码并执行其所支持的指令
- 如果在译码阶段发现是一条协处理器指令,则把它交给相应的协处理器
- 如果该协处理器不存在,或不认识这条指令,则ARM认为发生了未定义指令异常,则执行未定义指令陷阱(即未定义指令异常服务子程序)
- 协处理器也能通过提供一组专门的新指令来扩展指令集。
- 扩展指令集:
- 可用的协处理器:
- 一个系统中最多可连接16个协处理器。每个协处理器都由唯一的ID标识
- ARM920T处理中包含两个内部协处理器
- CP14通信通道协处理器,负责调试
- CP15为CACHE和MMU功能提供的系统控制协处理器
- ARM920T处理中包含两个内部协处理器
- 一个系统中最多可连接16个协处理器。每个协处理器都由唯一的ID标识
2.4 ARM处理器工作状态
2.4.1 指令集分类
-
ARM指令集和Thumb指令集
-
设计目的:为了让用户更好地控制代码量
-
ARM指令集:
- 32位**(字)**长度,具有最完整的功能
-
Thumb指令集:
- 16位**(半字)**长度,能实现ARM指令集的大部分功能
-
在功能上可以认为Thumb是ARM指令集的子集
-
2.4.2 工作状态切换
ARM9TDMI核是具有T变种的ARM处理器核,其工作状态一般有以下两种,并可在两种状态之间切换。
-
ARM状态:
- 执行32位的字对齐的ARM指令
- 系统上电默认的状态
-
Thumb状态:
- 执行16位的半字对齐的Thumb指令
-
状态切换:
- ARM处理器的两种状态可以通过相应的指令进行切换。
- ARM指令集与Thumb指令集不能同时混合使用。
- ARM和Thumb状态间的切换并不影响处理器模式或寄存器内容
- 从一个ARM例程调用另一个Thumb例程时,内核必须切换状态,反之亦然
- 用BX分支指令来执行状态切换
-
指令长度和数据格式
-
ARM微处理器的指令长度可以是32位(在ARM状态下),也可以为16位(在Thumb状态下)
-
ARM微处理器中支持字节(8位)、半字(16位)、**字(32位)**三种数据类型
-
字对齐 & 半字对齐
- 数据以字存储–字对齐
- 数据以半字存储–半字对齐
- 在内存的地址
-
2.5 ARM处理器的运行/工作模式
- ARM体系结构支持7种运行模式
2.5.1 用户模式(USR)
-
正常程序执行模式,大部分任务执行在这种模式下。
-
用户模式是用户程序的工作模式,该模式权限最低
-
该模式操作的硬件资源是有限的
-
该模式没有权限去操作其它硬件资源,也不能切换到其它模式下
- 若想这样做只能通过软中断的方式
-
该模式只能处理自己的数据
2.5.2 系统模式(SYS)
-
系统模式是特权模式,不受用户模式的限制
-
用户模式和系统模式共用一套寄存器
-
系统模式比用户模式有更高的权限,可以访问所有系统资源及进行模式切换
-
OS的一些特权任务,可以使用这个模式访问一些受控的资源
-
注意:
- 用户模式与系统模式两者使用相同的寄存器,都没有SPSR
2.5.3 一般中断模式(IRQ)
- 一般中断模式也叫通用中断模式
- 用于处理一般的中断请求,通常在硬件产生中断信号之后自动进入该模式
- 该模式为特权模式,可以自由访问系统硬件资源
2.5.4 快速中断模式(FIQ)
-
快速中断模式是相对一般中断模式而言的
-
它是用来处理对时间要求比较紧急的中断请求
- 主要用于高速数据传输及通道处理
-
其中断优先级相对普通中断更高。
2.5.5 管理模式(SVC)
- 管理模式是CPU上电后默认模式
- 因此在该模式下主要用来做系统的初始化,软中断处理也在该模式下。
- 系统复位或开机、软中断时进入到SVC模式下。
- 用户模式下的用户程序请求使用硬件资源时,通过软中断进入该模式
2.5.6 中止模式(ABT)
- 中止模式用于支持虚拟内存或存储器保护
- 当用户程序访问非法地址或没有权限读取的内存地址时,会进入该模式。
- 访问非法地址— 在取指就出现问题
- 访问没有权限读取的内存地址— 在访问数据才出现问题
2.5.7 未定义模式(UND)
- CPU在指令的译码阶段不能识别该指令操作时,会进入未定义模式,进行未定义陷阱处理。
- 该模式用于支持硬件协处理的软件仿真
2.5.8 特权模式&异常模式
-
特权模式:
-
除用户模式外的其它6种处理器模式称为特权模式(Privileged Modes)。
-
在特权模式下,程序可以访问所有的系统资源,也可以任意的进行处理器模式切换。
-
只有在特权模式下才允许对当前程序状态寄存器(CPSR)的所有控制位直接进行读/写访问,而在非特权模式下只允许对CPSR的控制位进行间接访问(SWI方式)。
-
-
异常模式:
- 特权模式中除系统模式之外的其他5种模式又统称为异常模式。
- 它们除了可以通过在特权下的程序切换进入外,也可以由特定的异常进入。
- 其中管理模式也称为超级用户模式,是为操作系统提供软中断的特有模式。
-
大多数的用户程序运行在用户模式下。当处理器工作在用户模式时,需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理过程中进行处理器模式切换。这种体系结构可以使操作系统控制整个系统资源的使用
2.6 ARM寄存器
- ARM处理器有37个用户可见的寄存器
- 31 个通用寄存器:
- R0~R15
- R13_svc、R14_svc 、 R13_abt、R14_abt 、R13_und、R14_und、R13_irq、 R14_irq
- R8_fiq~R14_fiq
- 6 个状态寄存器:
- 1 个CPSR
- 5 个SPSR( SPSR_svr、 SPSR_abt 、 SPSR_und 、 SPSR_irq 、 SPSR_frq )
- 31 个通用寄存器:
2.6.1 ARM状态下的寄存器
一、各模式可访问的寄存器
- 在ARM状态下,任一时刻都可以访问到 16个 通用寄存器和1~2个状态寄存器。各种模式下能访问的寄存器如下图所示:
- 在汇编中,R0-R13为保存数据或地址值的通用寄存器。它们是完全通用的寄存器,不会被体系结构作为特殊用途,并且可用于任何使用通用寄存器的指令。
二、一般通用寄存器
-
通用寄存器根据其分组与否可分为以下两类:
-
未分组寄存器,包括 R0~R7
-
分组寄存器,包括 R8~R14。
-
-
未分组寄存器:
- 在所有处理器模式下对于每一个未分组寄存器来说,指的都是同一个物理寄存器
- 即对于任何处理器模式,这些寄存器都对应于相同的32位物理寄存器
-
分组寄存器:
- 它们每一个访问的物理寄存器取决于当前的处理器模式
- 几乎所有允许使用通用寄存器的指令都允许使用分组寄存器
- 寄存器R8-R12有两个分组的物理寄存器
- 一个用于除FIQ模式之外的所有寄存器模式
- 另一个用于FIQ模式,这样可在发生FIQ中断后,加速处理速度
- 寄存器R13-R14分别有6个分组的物理寄存器
- 一个用于用户和系统模式
- 其余5个分别用于5种异常模式
- 如果改变处理器的模式,新模式的分组寄存器将取代原来模式的分组寄存器组
- 例如,当处理器处于中断模式时,执行的指令可访问的名字仍然是R13和R14寄存器,但实际上是访问分组寄存器R13_irq和R14_irq,而用户模式下的R13_usr和R14_usr不会受到任何影响,程序仍然可以正常访问R0 ~ R12寄存器
三、 堆栈指针R13
- 寄存器R13通常用作堆栈指针,称作SP。
- 每种异常模式都有自己的分组R13。通常R13应当被初始化成指向给异常模式所分配的堆栈
- 用户模式和系统模式共用一个R13寄存器
- 每种异常模式都有专用的R13寄存器。
- 它们通常指向各模式所对应的专用堆栈,也就是说ARM处理器允许用户程序有6个不同的堆栈空间
四、链接寄存器R14
寄存器R14(链接寄存器或LR)在体系结构中有两种特殊用途:
- 在各种模式下,R14用来保存子程序的返回地址。当一条BL或者BLX指令执行子程序调用时,R14设为子程序的返回地址
-
返回时,通过复制R14中的地址值到PC中来实现子程序的返回。通常有以下2种方式:
-
执行下列指令之一
①MOV PC, LR ;把LR中的值写入到PC寄存器中
②BX LR ;跳转(带状态切换)到LR地址所指向的指令执行。用于从实现从一个状态返回另外一个状态并继续执行。
-
在子程序入口,执行R14的入栈操作:
- STMFD SP!, { , LR} ;该条指令用于把和LR(R14)等多个寄存器压入堆栈,SP(R13)指向堆栈顶部。
并使用匹配的指令返回:
- LDMFD SP!, {, PC} ;该条指令用于把堆栈顶部多个单元,执行出栈操作,出栈的数据保存到和PC等多个寄存器中。注:执行该操作后,原R14入栈的值,出栈后就保存到PC中了,相当于执行了把R14的值写入到PC的操作。
-
- 当发生异常时,相关异常模式下的R14就设为异常返回地址。异常的返回地址与子程序的返回类似。区别在于有些异常有一个小常量的偏移。
五、程序计数器R15
-
寄存器R15用作程序计数器(PC)
-
在ARM状态,位[1:0]为0,位[31:2]保存PC
-
在Thumb状态,位[0]为0,位[31:1]保存PC
-
-
无论处理器处于何种状态,程序计数器R15(即PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。
- 一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第1条指令。
- 因此,PC总是指向第3条指令,或者说PC总是指向当前正在执行的指令地址再加2条指令的地址。–在三级流水线的情况下
- ARM状态下:PC=当前程序执行位置+8字节
- Thumb状态下:PC值=当前程序执行位置+4字节
-
写程序寄存器
- 写R15的通常结果是将写到R15中的值作为指令地址,并以此地址发生转移。由于ARM指令要求字对齐,通常希望写到R15中值的位[1:0]=0b00(b指的是二进制)
2.6.2 ARM状态下程序状态寄存器CPSR
- 当前程序状态寄存器(CPSR)可以在任何处理器模式下被访问,它包含下列内容:
(1)ALU 状态标志(条件码标志位);
(2)当前的处理器模式;
(3)中断使能标志;
(4)设置处理器的状态。
- 每一种异常模式下,都有一个专用的物理寄存器做备份程序状态寄存器(SPSR: Saved Program Status Register )。
- 当特定的异常中断发生时,这个物理寄存器负责存放当前程序状态寄存器的内容。当异常处理程序返回时,再将其内容恢复到当前程序状态寄存器。
一、条件标志位
- 这些条件标志位会根据程序中的算数指令或逻辑指令的执行结果进行改变,而且这些条件标志位可由大多数指令检测以决定指令是否执行。
- N:
- 本位设置成当前指令执行结果的第31位。当两个由补码表示的有符号整数运算时,N=1 表示结果为负数;否则结果为正数或零。
- Z:
- Z=1 表示运算的结果为零,否则结果不为零。
- C:
- 分 4 种情况设置 C 的方法:
- 在加法指令中(包括比较指令CMN),当结果产生了进位,则C=1,表示无符号数运算发生上溢出,其它情况下C=0;
- 在减法指令中(包括比较指令CMP),当运算中发生了借位,则C=0,其它情况下C=1;
- 对于在操作数中包含移位操作的运算指令(非加/减指令),C被设置成被移位寄存器最后移出去的位;
- 对于其它非加/减法运算指令,C的值通常不受影响。
- 分 4 种情况设置 C 的方法:
- V:
- 下面分两种情况讨论V的设置方法:
- 对于加/减运算指令,当操作数和运算结果都是以二进制的补码表示的带符号的数时,且运算结果超出了有符号运算的范围时溢出。V=1 表示符号位溢出;
- 对于非加/减法指令,通常不改变标志位 V 的值。
- 下面分两种情况讨论V的设置方法:
- N:
二、Q标志位
-
了解即可
-
在带DSP指令扩展的ARMV5及更高版本中,Q标志位被指定用于指示增强DSP指令是否发生了溢出。 在ARMV5以前的版本及ARMV5的非E系列处理器中,Q标志位没有被定义,属于待扩展的位。
三、控制位
-
CPSR的低8位属于控制位。
(1)中断禁止位(第7、6位)
I=1:IRQ被禁止;F=1:FIQ被禁止。
(2)状态控制位(第5位)
T 位是处理器的状态控制位。
T=0:处理器处于ARM状态;
T=1:处理器处于Thumb状态。
- 注意:绝对不要强制改变CPSR寄存器中的控制位T,否则处理器会进入未知状态
(3)模式控制位
- 决定处理器的工作模式
- 如果将非法值写入M[4:0]中,处理器将进入无法恢复的模式
-
注意
- 通过程序修改CPSR可以进入异常。除此之外,也可以在内核对异常或者中断响应时由硬件切换到异常模式。
- 用户模式与系统模式不能由异常进入,也就是说要想进入系统模式,必须通过修改CPSR才能实现。
2.7 ARM存储系统
2.7.1 ARM存储方法
-
ARM处理器外部采用冯·诺依曼结构,指令和数据共用一条32位数据总线,只有装载、存储和交换指令可访问存储器中的数据。
-
ARM处理器将存储器看作是一个从0开始的线性递增的字节集合,其中每个数组元素(字节)都是可以寻址的
-
ARM支持**大端模式(big-endian)和小端模式(little-endian)**两种内存模式
- 大端模式下,一个字的高地址单元放的是数据的低位;
- 小端模式下,数据的低位放在内存中低地址单元中。
- 一个基于ARM的实际芯片可能只支持小端存储器格式,也可能只支持大端存储器格式,还可能两者都支持
- ARM指令集不包含任何直接选择大小端存储器格式的指令,但是一个同时支持大小端存储器格式基于ARM的芯片可以通过硬件配置(一般使用芯片的引脚来配置)来匹配存储器系统所使用的规则。如果芯片有一个标准系统控制的协处理器(例如ARM920T的CP15协处理器),系统控制协处理器寄存器1的bit7可用于改变配置。
- 注意:对于S3C2440是通过软件来指定存储器格式的(通过设置CP15协处理器协处理器寄存器1的bit7来实现),缺省为小端格式。
2.7.2 ARM体系的存储结构
- ARM9使用 232 个8位字节地址空间,字节地址的排列从0~232-1。
- 地址空间也可以看作是包含 230 个32位字
- 地址以字为单位进行分配,也就是将地址除以4。
- 地址为A的字包含4个字节,地址分别为A、A+1、A+2和A+3。
- 地址空间还可被看作包含 231 个16位半字
- 地址按照半字进行分配。
- 地址为A的半字包含2个字节,地址分别为A和A+1
2.7.3 存储器结构
- ARM处理器有的带有指令cache和数据cache,但不带有片内RAM和片内ROM。
- 系统所需的RAM和ROM(包括Flash)都通过总线外接。
- 有的ARM片内还带有存储器管理单元MMU(Memory Management Unit)
2.7.4 存储器映射I/O
- ARM才用统一编址,每一个外设都分配一个地址
2.7.5 Flash组织形式
-
目前几乎所有MCU的程序都存储在Flash中。Flash分为片内和片外两种。
-
片内Flash:虽然ARM处理器通常不带有片内Flash,但有些特定的ARM微控制器(MCU)可能集成了片内Flash。这种片内Flash通常用于存储固件和程序代码,由于它直接集成在芯片内部,访问速度较快,且功耗较低。
-
片外Flash:
-
**NOR Flash **
- NOR Flash读取速度快,但是擦除和写入速度慢。
-
NAND Flash
- NAND Flash读取速度比NOR Flash慢,但擦除和写入速度很快。
-
2.7.6 RAM的组织方式
- RAM的种类
- 芯片自带的RAM不够用时需要外加,外加的RAM一般是SDRAM和DDR RAM,极少数使用SRAM,因为SRAM的价格相对较贵,但SRAM速度要比动态RAM快。
- RAM的使用
- SRAM:只需要在IDE中设置好地址。
- SDRAM/DDR RAM:不仅要在IDE中设置好起始地址,还要在程序中做初始化操作后才能使用。如果使用仿真器,那么在仿真运行程序前,要执行一个初始化脚本文件,或者执行一系列命令对SDRAM和DDR RAM进行初始化,否则会运行出错。
2.8 中断和异常的基本概念
这个部分不考
- 中断
- 是主机与外设进行数据通信的重要机制,它负责处理处理器外部的事件
- 异常
- 实质上也是一种中断,只不过它主要负责处理处理器内部事件
- 计算机通常是用中断来处理外中断和内部异常,因此在ARM技术中,将二者统称为异常。
2.8.1 中断和异常
-
什么叫中断
- 当处理器遇有外部设备发生 “紧急事件” 需要它来处理时,它就必须停下 “手头上的工作” 先去处理这个 “紧急事件”。处理器的这种工作过程,或者这种工作状态就叫做中断。
-
什么叫中断请求
- 当外部设备有紧急事件需要处理器进行处理时,外部设备必须向处理器发送一个 电信号(脉冲或电平) 来表示有事件需要处理器来处理。这个信号叫做 中断请求信号 ,或称 中断请求。
-
什么叫中断源
- 发出中断请求信号的外部设备或事件就叫做中断源。
-
什么叫异常
- 由内部事件引起的中断叫做异常。
2.8.2 中断请求信号屏蔽
-
可屏蔽中断
- 人们把带有开关,能阻止中断请求的中断输入端叫做可屏蔽中断信号输入端。这类中断叫可屏蔽中断。
-
非屏蔽中断
- 人们把不带开关,不能阻止中断请求的中断输入端叫做非屏蔽中断信号输入端。这类中断叫非屏蔽中断。
- 为了对处理器可以接收中断源的数目进行扩充及对中断进行必要的管理,在中断源和处理器之间还配有中断控制器
2.8.3 中断优先级及中断嵌套
- 中断优先级
- 处理器通常只有一个可屏蔽中断请求输入端。对于具有 多个中断源的系统来说,当有两个或两个以上中断源同时发生中断请求时就会出现所谓的竞争。
- 竞争可以通过优先级的方法来处理,具体实现方法有两种:硬件实现方法和软件实现方法。
2.8.4 中断服务程序
- 用来处理中断事件的程序叫做中断服务程序。
- 中断服务程序与普通子程序的重要差别在于:
- 中断服务程序要对中断嵌套进行必要的管理。即中断服务程序要根据需要,对程序状态寄存器中的中断允许标志进行相应的设置。
2.8.5 中断向量和中断向量表
- 为了与普通子程序的首地址进行区分,中断服务程序的首地址(入口地址)通常被叫做中断向量,或中断矢量。
- 以后还会看到,凡是能直接或间接指向中断服务程序的都叫中断向量。
- 在处理器收到中断请求之后,它们都需要获得中断服务程序首地址——中断向量。
- 所有的中断向量都按一定规律存放在一个固定的存储区域,这个集中存放了中断向量或与中断向量相关信息的存储区域就叫做中断向量表。
2.8.6 中断的处理过程
- 处理器响应中断的条件
处理器响应中断的条件主要有以下几个:
(1)处理器程序状态寄存器的中断屏蔽标志处于非屏蔽状态;
(2)没有更高级的中断请求正在响应或正在发出、正挂起;
(3)处理器在现行指令执行结束后。
-
中断处理的过程
-
当有中断请求发生且满足上述条件时,计算机系统就会响应中断请求,并自动将被中断程序的下一条指令地址(断点地址)保存和关闭中断;接下来便将自中断向量表查询得到的与该中断源对应的中断向量送入PC,并转去执行中断服务程序。
-
当执行到中断服务程序末尾时,执行中断返回指令或跳转指令,把保存的断点地址送回 PC,以在断点处继续执行被中断的程序。
-
2.9 ARM的中断(异常)
-
只要正常的程序流程被暂时中止,ARM处理器就进入异常模式。
-
ARM异常与中断不做严格意义上的区别。
-
处理器响应中断条件
- CPSR的中断屏蔽标注处于非屏蔽状态
- 处理器处于现行指令执行结束后的状态,换一种说法就是一条指令执行中间不能被中断
- 低优先中断不能中断高优先中断
-
ARM处理器可以响应的中断(异常)有7种,分别为:
- 中断
- 快中断
- 复位中断
- 软中断异常
- 预取指令中止异常
- 数据中止异常
- 未定义指令异常
2.9.1 ARM的中断(异常)向量表
- 低端和高端向量表
- ARM中断(异常)的各个向量在向量表中的分配如下
-
高端向量是ARM架构可选配置,可以通过硬件外部输入管脚来配置是低端向量还是高端向量,不能通过指令来改变向量的位置。但可通过协处理器CP15配置
-
处理器在响应中断(异常后),可以通过两次跳转转移到中断(异常)服务程序,示意图如下
2.9.2 ARM异常响应
一、进入异常
-
在异常发生后,ARM内核会作以下工作:
- 在适当的LR中保存断点的地址,当异常入口来自:无论是ARM状态还是Thumb状态,ARM都将当前PC寄存器的值(运行指令地址加4或加8 )复制(取决于异常的类型) 到LR中;
- 把当前程序状态寄存器(CPSR)中的内容保存到模式私有寄存器SPSR中;
- 将寄存器CPSR中的MODE域设置为中断(异常)应进入的运行模式;
- 对CPSR的I位和F位进行相应的设置,以防止再次响应同一个中断请求。
- 强制PC从相关的异常向量处取指,即到中断向量表中获取中断向量,转向用户所编写的中断(异常)服务程序。
- 异常总是在ARM状态中进行处理。当处理器处于Thumb状态时发生了异常,在异常向量地址装入PC时,会自动切换到ARM状态
二、异常返回
-
当异常结束时,异常处理程序必须做如下处理:
-
将SPSR的值复制回CPSR
-
将LR中的值减去偏移量后存入PC,偏移量根据异常的类型而有所不同。
- 注:恢复CPSR的动作会将T、F和I位自动恢复为异常发生前的值。
-
-
看本章PPT的131和132页ppt来理解整个过程
三、ARM异常进入/退出
- ARM处理器进入异常时R14所保存的值及退出时推荐指令 :
- 理解并记住在进入异常时,LR存的PC应返回的值
2.9.3 ARM异常描述
- ARM按事件的紧急程度为每个中断(异常)都定义了一个固定的优先级别。当多个异常同时发生时,一个固定的优先级系统决定它们被处理的顺序:
一、复位中断
-
当nRESET信号被拉低时(一般外部复位引脚电平的变化和芯片其他复位源会改变这个内核信号),ARM处理器放弃正在执行的指令。
-
当nRESET信号再次变为高电平时,ARM处理器执行以下操作:
- 强制M[4 : 0]变为b100011,系统进入管理模式;
- 将CPSR中的控制位I和F置位,IRQ和FIQ中断禁止;
- 将CPSR中的控制位T清零,处理器处于ARM状态;
- 强制PC从地址0x00开始对下一条指令进行取指;
- 返回到ARM状态并恢复执行。
-
在系统复位后,进入管理模式对系统初始化。复位后,
除PC和CPSR之外的所有寄存器的值都是随机的。
-
复位通常在两种情况下发生:
-
系统初始运行时的正常上电;
-
由程序引起的复位。
-
二、中断请求异常IRQ
-
只有当CPSR中相应的中断屏蔽被清除时,才可能发生中断请求(IRQ)异常,IRQ异常是一个由nIRQ输入端的低电平所产生的正常中断。
-
当一个IRQ异常中断发生时,内核切换到中断模式,表明产生了中断。
-
内核自动做出如下处理
- 将异常处理程序的返回地址(PC寄存器中的值)保存到异常模式下的R14(R14_irq或者LR)中,即**“中断返回地址+4”**。
- 用户模式的CPSR被保存到新的IRQ中断异常模式SPSR_irq中。
- 修改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。
- 应该是PC+4,上图有误
- 返回时,可以通过“SUBS PC,R14,#4”指令返回。
- 实际上在中断模式下执行的是“SUBS PC,R14,#4”指令,同时在SUB指令尾部有一个S,并且PC是目的寄存器,所以CPSR将自动从SPSR寄存器中恢复。
- 如果用户需要嵌套IRQ中断,那么必须在中断服务程序中重新使能IRQ中断,并将R14压入R13所指向的IRQ堆栈之中以预先保留返回地址。程序应当首先通过压入IRQ堆栈来预先保留ISR(中断服务子程序)将会使用的R0~R12的值,这时就可以对异常进行处理了。
三、快速中断请求异常FIQ
-
有些嵌入式系统的应用对实时性要求比较高,需要足够快的中断响应速度,ARM在IRQ异常之外还设计了一种快速中断请求(FIQ)异常。
-
为减少延时,ARM在快中断中采取了 两个措施:
- 专门为快中断配置了较多的私有寄存器,从而可使中断服务程序有足够的寄存器来使用,而不必与被中断服务程序使用同一组寄存器,这样就免去了因寄存器冲突而必需的保护及恢复现场工作。
- ARM把FIQ的中断向量放在了中断(异常)向量表末尾 0X0000001C处,因此它后面没有其它中断向量,允许用户将中断服务程序直接放在这里。
-
响应条件
- 只有当CPSR中相应的F位被清零时,才可能发生FIQ异常。
- 将ARM内核的nFIQ信号拉低,可实现外部产生FIQ,FIQ异常是优先级最高的外部中断。
- 内核进入FIQ处理程序之后,FIQ、IRQ同时禁止任何外部中断源再次发生中断,除非在软件中重新使能IRQ、FIQ请求。
- 当F控制位被清零时,ARM在每条指令执行结束时检测FIQ同步器输出端的低电平。
- FIQ异常进入与退出的流程与IRQ类似。
-
流程
- 同理PC还是+4
四、未定义指令异常
-
未定义指令异常是内部异常中断。当ARM处理器遇到一条自己和系统内任何协处理器都无法执行的指令时,就会发生未定义指令异常,从而进入中断处理程序;
-
软件可使用这一机制,通过仿真未定义的协处理器来扩展ARM指令集。
-
返回方式
- 在仿真未定义的指令后,不管处于哪种处理器操作状态(ARM或Thumb状态),处理器执行下面的指令返回:
- MOVS PC, R14_und
- MOVS指令将R14的值写入PC,CPSR将自动从SPSR寄存器中恢复并返回到未定义指令之后的指令。
- 在仿真未定义的指令后,不管处于哪种处理器操作状态(ARM或Thumb状态),处理器执行下面的指令返回:
-
响应流程:
五、中止异常
-
中止表示当前对存储器的访问不能被完成,这是由外部ABORT输入信号引起的异常中断。
-
中止有2种类型:
-
预取指中止:由程序存储器出错引起的中止异常;
-
数据中止:由数据存储器出错引起的中止异常。
-
-
预取指中止异常:
-
当发生预取中止时,ARM内核将预取的指令标记为无效,但在指令到达流水线的译码阶段时才进入异常。如果指令在流水线中因为分支而没有被执行,中止将不会发生。
-
流程:
-
-
数据中止异常
-
当发生数据中止异常时,理想的状况是进入数据中止异常的ISR,然后在内存中挑选出问题,再重新执行导致异常的指令。于是就会将PC返回2条指令,也就是将R14的值减去8,并将结果存入PC。
-
流程
-
六、SWI软件中断异常
-
事实上,所有的任务都是在用户模式下运行的,因此任务只能读CPSR而不能写CPSR。**任务由用户模式切换到特权模式的唯一途径,就是使用一个SWI指令调用。**SWI指令强迫处理器从用户模式切换到SVC管理模式,并且IRQ中断自动关闭,所以软件中断方式常被用于系统调用。只有处理器切换到系统模式时,IRQ中断才能继续使用。
-
由于它是由用户在程序中使用指令而产生的中断,所以叫做软中断。它也是所有中断(异常)中唯一的一个同步事件。
- 同步事件的发生时机是确定的,因为它是由程序中的指令直接触发的。例如,当程序执行到
SWI
指令时,软中断一定会发生。 - 与异步事件(如硬件中断)不同,异步事件的发生时机是随机的,因为它是由外部硬件或条件触发的,与程序执行流程无关。
- 同步异步的主要区别是发生顺序的确定与否,不一定非要由时间信号约束
- 同步事件的发生时机是确定的,因为它是由程序中的指令直接触发的。例如,当程序执行到