当正常的程序执行流程出现暂停或者停止时,称之为异常,如处理一个中断请求,复位也是一种异常。MCU在处理异常之前,会将当前MCU的状态必须保留,当异常处理完成之后,可以保证程序可以继续执行。MCU支持多个异常同时发生,它将会按固定的优先级进行处理。
1.异常类型
ARM所支持的异常类型共有7种,其具体含义下所示。
ARM体系结构所支持的异常
异常类型 | 含义 |
复位 | 当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程序处执 |
未定义指令 | 当ARM处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。可使用该异常机制进行软件仿真 |
软件中断 | 该异常由执行SWI指令产生,可用于用户模式下的程序调用特权操作指令。可使用该异常机制实现系统功能调用 |
指令预取中止 | 若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常 |
数据中止 | 若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常 |
IRQ(外部中断请求) | 当处理器的外部中断请求引脚有效,且CPSR中的1位为0时,产生IRQ异常。系统的外设可通过该异常请求中断服务 |
FIQ(快速中断请求) | 当处理器的快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常 |
2.异常处理流程
一般异常发生后,MCU都会进行一系列的操作,这些操作大部分是MCU自动完成的,一般的处理流程如下。
1、 拷贝CPSR到SPSR_
2、 设置适当的CPSR位: 改变处理器状态进入ARM状态;改变处理器模式进入相应的异常模式;设置中断禁止位禁止相应中断。
3、 更新LR_,这个寄存器中保存的是异常返回时的链接地址
4、 设置PC到相应的异常向量
ARM微处理器对异常的响应过程用伪代码描述如下。
R14_ = Return Llink //这个可以参看寄存器的说明,两个作用
SPSR_< Exception_mode > = CPSR
CPSR[4:0] = Exception Mode Number
CPSR[5] = 0 ; //AEM指令
If ==Reset or Fiq then //只有在复位和FIQ模式下才会关闭FIQ中断
CPSR[6] = 1 ;
CPSR[7] = 1 ; //任何异常模式下都会关闭IRQ中断
PC = Exception Vector Address