不管异常入口是来自ARM状态还是Thumb状态,FIQ处理程序都会通过执行下面的指令从中断返回: SUBS PC,R14_fiq,#4
关于“中止”:中止发生在对存储器的访问不能完成时,中止包含两种类型:
(1)预取中止:发生在指令预取过程中
(2)数据中止:发生在对数据访问时
中止——预取指中止:当发生预取中止时,ARM7TDMI内核将预取的指令标记为无效,但在指 令到达流水线的执行阶段时才进入异常。如果指令在流水线中因为发生分支而没有被执行,中止将不会发生。在处理中止的原因之后,不管处于哪种处理器操作状态,处理程序都会执行下面的指令恢复PC和CPSR并重试被中止的指令: SUBS PC,R14_abt,#4
中止——数据中止:当发生数据中止后,根据产生数据中止的指令类型作出不同的处理:
(1)数据转移指令(LDR、STR)回写到被修改的基址寄存器。中止处理程序必须注意这一点;
(2)交换指令(SWP)中止好像没有被执行过一样(中止必须发生在SWP指令进行读访问时);
(3)块数据转移指令(LDM,STM)完成。 当回写被设置时,基址寄存器被更新。在指示出现中止后,ARM7TDMI内核防止所有寄存器被覆盖。这意味着ARM7TDMI内核总是会保护被中止的LDM指令中的R15(总是最后一个被转移的寄存器)。
在修复产生中止的原因后,不管处于哪种处理器操作状态,处理程序都必须执行下面的返回指令 : SUBS PC,R14_abt,#8
关于“软件中断指令”:使用软件中断(SWI)指令可以进入管理模式,通常用于请求一个特定的管理函数。SWI处理程序通过执行下面的指令返回: MOVS PC,R14_svc
这个动作恢复了PC和CPSR并返回到SWI之后的指令。SWI处理程序读取操作码以提取SWI函数编号。