异常事件处理响应机制
当一个异常/中断事件发生时,微处理器会暂停正常操作,自动查找向量表。获得异常/中断事件所对应的中断向量,找到异常/中断服务子程。当服务子程运行结束后再返回主程序。
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中,返回到异常中断的指令的下一条指令处执行。