异常或中断是用户程序中最基本的一种执行流程或形态。这部分主要对ARM架构下的异常中断做详细说明。
ARM一共有7种类型的异常,按优先级从高到低的排列如下:
复位异常(Reset)、数据异常(Data Abort)、快速中断异常(FIQ)、外部中断异常(IRQ)、预取异常(Prefetch Abort)、软件中断(SWI)和未定义指令异常(Undefined Instruction)。
异常种类:
ARM体系结构中,存在7种异常处理。当异常发生时,处理器会把pc设置为一个特定的存储器地址。这一地址放在一个被称为向量表(vector table)的特定地址范围内。向量表的入口是一些跳转指令,跳转到专门处理某个异常或中断的子程序。
存储器映射地址0x00000000是为向量表(一组32位字)保留的。在有些处理器中,向量表可以选择定位在存储空间的高地址(从偏移量0xffff0000开始)。一些嵌入式操作系统,如Linux和WindowsCE就要利用这一特性。
当异常发生时,分组寄存器r14和SPSR用于保存处理器状态。操作伪指令如下:
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
CPSR[6]=1 /*屏蔽快速中断FIQ*/
CPSR[7] = 1 /*屏蔽外部中断IRQ*/
PC=exception vector address
异常返回时,SPSR内容恢复到CPSR,连接寄存器r14的内容恢复到程序计数器PC。
(1)复位异常
当处理器的复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行。复位异常中断通常用于下面两种情况:
① 系统上电;
② 系统复位。
当复位异常发生时,系统执行下列伪操作程序。
R14_svc=UNPREDICTABLE value
SPSR_svc=UNPREDICTABLE value
CPSR[4:0]=0b10011 /*进入特权模式*/
CPSR[5]=0 /*处理器进入ARM状态*/
CPSR[6]=1 /*禁止快速中断*/
CPSR[7]=1 /*禁止外设中断*/
If high vectors configured then
PC=0xffff0000
Else
PC=0x00000000