当一个异常出现以后,ARM处理器会执行以下几步操作进入异常:
1)将下一条指令的地址存入相应链接寄存器LR,以便程序在处理异常返回时,能从正确的位置重新开始执行。若异常是从ARM状态进入,LR寄存器中保存的是下一条指令的地址(当前PC+4或PC+8,与异常的类型有关);若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量。这样,异常处理程序就不需要确定异常是从何种状态进入的。例如:对于软件中断SWI异常,指令MOV PC,R14_svc总是返回到下一条指令,不管SWI是在ARM状态执行,还是在Thumb状态执行。
2)将CPSR复制到相应的SPSR中。
3)根据异常类型,设置CPSR的运行模式位。
4)强制PC从相关异常向量地址取下一条指令执行,从而跳转到相应异常处理程序处。
还可以设置中断禁止位,以阻止其他无法处理的异常嵌套。
如果异常发生时处理器处于Thumb状态,则当异常向量地址加载到PC时,处理器将自动切换到ARM状态。(www.daowen.com)
ARM处理器对异常的响应过程可以用伪代码描述如下:
异常处理完毕之后,ARM处理器会执行以下几步操作从异常返回:
1)将链接寄存器LR的值减去相应的偏移量后送到PC中。
2)SPSR复制回CPSR中。
3)若在进入异常处理时设置了中断禁止位,要在此清除。
系统运行时异常可能随时发生。为了保证ARM处理器在发生异常时不会出于未知状态,应用程序设计中必须确保对异常的处理。通常是在异常向量表中特定位置放置一条跳转指令,当发生异常时,程序计数器PC的值被强制设置为对应的异常向量地址,跳转到异常处理程序。当异常处理完成之后,返回到主程序继续执行。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。