异常事件处理响应机制
当一个异常/中断事件发生时,微处理器会暂停正常操作,自动查找向量表。获得异常/中断事件所对应的中断向量,找到异常/中断服务子程。当服务子程运行结束后再返回主程序。
1.响应前期的准备
为了使微处理器能够正确的响应异常/中断事件,前期需要做好准备工作。
(1)开辟有效堆栈区。
(2)编写异常/中断服务子程序,填写异常/中断向量表。
(3)服务子程序入口是否需要参数保护,注意异常/中断服务子程返回类型。
(4)正确了解和设置异常/中断的申请/触发条件。
2.响应异常/中断事件
异常/中断事件发生后,微处理器响应过程如下:
(1)备份寄存器。把CPSR和PC保存到相应模式下的SPSR_和lr_寄存器中。
(2)设置当前模式寄存器组。当FIQ、IRQ或外部中止异常发生时,可通过检测安全配置寄存器SCR[3:1]位的内容来确定所进入的工作模式。设置的寄存器组可参见表1.2.
(3)读取向量表,设PC为相应异常处理程序的入口地址,获得中断向量。
3.执行异常事件服务子程序
依照所编写的服务子程序完成异常事件的处理过程。
4.异常事件服务子程序的返回
当完成一个异常处理后返回时,异常处理程序需要执行异常返回指令,各种模式下异常入口处保留在r14的PC值以及退出异常返回前需要执行的指令参见表1.6。
表1.6  ARM异常向量表
| 
   异常入口  | 
  
   返回指令  | 
  
   返回前r14_  | 
  
   描述  | 
 
| 
   SVC  | 
  
   MOVS 
  PC, R14_svc  | 
  
   PC+4  | 
  
   PC:SVC(进入超级用户模式指令), SMC(进入监视模式指令)或Undefined指令代码的地址。    | 
 
| 
   SMC  | 
  
   MOVS 
  PC, R14_mon  | 
  
   PC+4  | 
 |
| 
   UNDEF  | 
  
   MOVS 
  PC, R14_und  | 
  
   PC+4  | 
 |
| 
   PABT  | 
  
   SUBS 
  PC, R14_abt, #4  | 
  
   PC+4  | 
  
   PC:导致预取指中止的指令地址。  | 
 
| 
   FIQ  | 
  
   SUBS 
  PC, R14_fiq, #4  | 
  
   PC+4  | 
  
   PC:FIQ or IRQ的优先级而未被执行的指令地址。  | 
 
| 
   IRQ  | 
  
   SUBS 
  PC, R14_irq, #4  | 
  
   PC+4  | 
 |
| 
   DABT  | 
  
   SUBS 
  PC, R14_abt, #8  | 
  
   PC+8  | 
  
   PC:导致数据中止的load /tore指令地址。  | 
 
| 
   RESET  | 
  
   -  | 
  
   -  | 
  
   复位状态开始执行主程序,不需要返回。  | 
 
| 
   BKPT  | 
  
   SUBS 
  PC, R14_abt, #4  | 
  
   PC+4  | 
  
   软件断点。  | 
 
从处理异常事件服务子程序返回前需要完成下面两个操作:
(1) 从spsr_中恢复状态内容到cpsr中。
(2) 从lr_中恢复程序断点到pc中,返回到异常中断的指令的下一条指令处执行。
