异常流程

来源:互联网 发布:300525 博思软件 编辑:程序博客网 时间:2024/06/09 20:20

<1>异常进入:

* 压栈(若处理器处于线程模式且正使用PSP,则压栈就使用PSP,否则使用MSP)。

* 取出异常向量(为减少等待时间,这一步可能会和压栈操作并行执行)。

* 取出异常指令(在确定异常处理起始地址之后,指令就会被取出)。

* 更新NVIC寄存器和内核寄存器(包括挂起状态,活跃状态,xPSR,PC,LR,SP等)。

根据压栈时实际使用的栈,在异常处理前,MSP或者PSP的数值会被自动调整。PC也会被更新为异常处理的起始地址,LR被更新为EXC_RETURN。


<2> 异常处理

在异常处理内部,可以执行外设所需的服务。在执行异常处理时,处理器就会处于处理器模式。

* 栈操作使用MSP(区别于进入异常时满足某种条件可以使用PSP)。

* 处理器运行在特权访问等级。

若更高优先级的异常在这个阶段产生,处理器会接收新的中断,而当前正在执行的处理会被挂起且被更高优先级的处理抢占,即中断嵌套。

若相同或者更低优先级的异常在这个阶段产生,新到的异常就会处于挂起状态,且等当前异常处理完成后才会处理这个新异常。

在异常处理的结尾,程序代码的返回会引起EXC_RETURN数值被加载到PC,并触发异常返回机制。


<3>异常返回

对于Cortex-M处理器,异常返回机制由一个特殊的地址EXC_RETURN触发,该数值在异常入口处产生并存储在LR中。当将LR写入PC时,它就触发异常返回流程。

当触发异常返回机制后,处理器会访问栈空间里在进入异常期间被压入栈中的寄存器数值,且将它们恢复到寄存器组中,这个过程被称为出栈。

在压栈操作的同时,处理器会取出之前被中断的程序的指令,并使得程序尽快继续执行。