在处理异常前,必须保护当前的处理器状态,以便在完成处理程序后能恢复到原来的程序。 如果同时发生好几个异常,将会按照异常优先级的顺序来响应。
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_<mode>
(2)、复制CPSR到SPSR_<mode>中。(注意:如果通过程序修改CPSR进入异常模式,硬件将不会将CPSR保存到SPSR中)
(3)、设置CPSR进入相应的处理器模式。
(4)、设置CPSR的第7位来禁止IRQ。如果异常为快速中断和复位。则还要设置CPSR的第6位来禁止快速中断。
(5)、给PC强制赋向量地址值。
如果异常发生时,处理器处于Thumb状态,则当异常向量地址加载入PC时,处理器自动切换到ARM状态,则异常处理返回时,自动切换到Thumb状态,即异常只在ARM状态下处理。
3、异常中断处理返回
异常处理完毕之后,异常处理程序需要执行以下几步操作从异常返回:
(1)、将所有修改过的用户寄存器从处理程序的保护栈中恢复。
(2)、复制SPSR_<mode>到CPSR,将LR_<mode>的值减去相应的偏移量后送到PC中。
(3)、若在进入异常处理时设置了中断禁止位,要在此清除。
4、如果学习arm遇到了更多问题,建议去华清星创客学习arm,有很多帮助和学习资源总结 |