ARM的异常处理

2014-11-24 10:31:29 · 作者: · 浏览: 0

在处理异常前,必须保护当前的处理器状态,以便在完成处理程序后能恢复到原来的程序。 如果同时发生好几个异常,将会按照异常优先级的顺序来响应。


1、ARM中异常中断的种类


(1)、复位


当处理器复位引脚有效时产生复位异常,包括系统加电和系统复位两种。通过设置PC跳转到复位中断向量处执行称为软复位。


(2)、未定义指令


当ARM遇到不能处理的指令时,将产生未定义指令异常。这个机制可以用于软件模拟扩展指令集。


(3)、软件中断


软件中断指令用于进入管理模式,通常请求一个特定的管理功能。在实时操作系统中可以通过该机制实现系统功能调用。


(4)、指令预取终止(Prefech Abort)


发生在指令预取期间。如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当被预取的指令执行时,处理器产生指令预取终止异常中断。如果发生预取中止,将屏蔽预取指并为无效,但并不会立刻带来异常,直到指令到达流水线的执行阶段才发生。若未执行该指令,将不会发生中止,因为流水线发生了分支。


(5)、数据访问终止(DATAABORT)


如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问终止异常中断。


(6)、外部中断请求(IRQ)


nIRQ输入端的低电平且CPSR的寄存器的I控制位被清除时,处理器产生外部中断请求异常中断。IRQ的优先级低于FIQ,当进入了相关的FIQ,会屏蔽IRQ。除非是在特权(非用户)模式,其他任何时刻都禁止设置CPSR内的I位。


(7)、快速中断请求(FIQ)


将nFIQ输入端拉低可以实现外部产生FIQ。由ISYNC 输入信号端的状态决定是同步还是异步传输。当ISYNC为低电平,认为nFIQ和nIRQ为异步,中断前会引起同步周期延迟并影响处理器流程。


2、异常的响应过程


除了复位异常外,当异常发生后,ARM核会尽可能执行完当前指令,然后自动执行如下动作:


(1)、保存返回地址到LR_


(2)、复制CPSR到SPSR_中。(注意:如果通过程序修改CPSR进入异常模式,硬件将不会将CPSR保存到SPSR中)


(3)、设置CPSR进入相应的处理器模式。


(4)、设置CPSR的第7位来禁止IRQ。如果异常为快速中断和复位。则还要设置CPSR的第6位来禁止快速中断。


(5)、给PC强制赋向量地址值。


如果异常发生时,处理器处于Thumb状态,则当异常向量地址加载入PC时,处理器自动切换到ARM状态,则异常处理返回时,自动切换到Thumb状态,即异常只在ARM状态下处理。


3、异常中断处理返回


异常处理完毕之后,异常处理程序需要执行以下几步操作从异常返回:


(1)、将所有修改过的用户寄存器从处理程序的保护栈中恢复。


(2)、复制SPSR_到CPSR,将LR_的值减去相应的偏移量后送到PC中。


(3)、若在进入异常处理时设置了中断禁止位,要在此清除。