微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM处理器异常处理

ARM处理器异常处理

时间:11-20 来源:互联网 点击:

b reset;跳入reset处理程序
b HandleUndef;跳入未定义处理程序
b HandSWI;跳入软中断处理程序
b HandPrefetchAbt;跳入预取指令处理程序
b HandDataAbt;跳入数据访问中止处理程序
b HandNoUsed;跳入未使用程序
b HandleIRQ;跳入中断处理程序
b HandleFIQ;跳入快速中断处理程序

通常安装完异常向量表,跳到我们自己定义的处理程序入口,这时我们还没有保存被打断程序的现场,因此在异常处理程序的入口里先要保存打断程序现场。
保存执行现场:
异常处理程序最开始,要保存被打断程序的执行现场,程序的执行现场无非就是保存当前操作寄存器里的数据,可以通过下面的栈操作指令实现保存现场:

STMFDSP_excep!,{R0 – R12,LR_excep}
注:LR_abt,SP_excep分别为对应异常模式下LR和SP,为方便读者理解加上_abt

需要注意的是,在跳转到异常处理程序入口时,已经切换到对应异常模式下了,因此这里的SP是异常模式下的SP_excep了,所以被打断程序现场(寄存器数据)是保存在异常模式下的栈里,上述指令将R0~R12全部都保存到了异常模式栈,最后将修改完的被打断程序返回地址入栈保存,之所以保存该返回地址就是将来可以通过类似:MOVPC,LR的指令,返回用户程序继续执行。
异常发生后,要针对异常类型进行处理,因此,每种异常都有自己的异常处理程序,异常处理过程通过下节的系统中断处理来进行分析。

1.1.5异常处理的返回

异常处理完成之后,返回被打断程序继续执行,具体操作如下:
l恢复被打断程序运行时寄存器数据
l恢复程序运行时状态CPSR
l通过进入异常时保存的返回地址,返回到被打断程序继续执行
异常发生后,进入异常处理程序时,将用户程序寄存器R0~R12里的数据保存在了异常模式下栈里面,异常处理完返回时,要将栈里保存的的数据再恢复回原先R0~R12里,毫无疑问在异常处理过程中必须要保证异常处理入口和出口时栈指针SP_excep要一样,否则恢复到R0~R12里的数据不正确,返回被打断程序时执行现场不一致,出现问题,虽然将执行现场恢复了,但是此时还是在异常模式下,CPSR里的状态是异常模式下状态,因此要恢复SPSR_excep里的保存状态到CPSR里,SPSR_excep是被打断程序执行时的状态,在恢复SPSR_excep到CPSR的同时,CPU的模式和状态从异常模式切换回了被打断程序执行时的模式和状态。此刻程序现场恢复了,状态也恢复了,但PC里的值仍然指向异常模式下的地址空间,我们要让CPU继续执行被打断程序,因此要再手动改变PC的值为进入异常时的返回地址,该地址在异常处理入口时已经计算好,直接将PC = LR_excep即可。
上述操作可以一步一步实现,但是通常我们可以通过一条指令实现上述全部操作:

LDMFDSP_excp!,{r0-r12,pc}^
注:SP_excep为对应异常模式下SP,^符号表示恢复SPSR_excep到CPSR

以上操作可以用下图来描述:


图3-2中断处理示意图

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top