中断流程
保存现场
硬件自动将 xPSR、PC、LR、R12、R3、R2、R1、R0 压入堆栈,如果当前使用的堆栈是PSP就压入PSP,否则压入MSP. 对于剩下的R4~R11,编译器会在编译时判断中断函数是否用到了他们,然后自动生成代码入栈。
取中断服务函数入口
总线从中断向量表中找出(ISR)中断服务函数的入口
更新寄存器
- 堆栈指针切换到MSP
- 更新IPSR为对应的异常编号
- 将PC寄存器指向ISR
- LR寄存器此时作为EXC_RETURN 如果主程序在线程模式并使用 MSP 的时候进入 ISR,则 EXC_RETURN=0xFFFF_FFF9 如果主程序在线程模式并使用 PSP 的时候进入 ISR,则 EXC_RETURN=0xFFFF_FFFD 如果当前运行在一个 ISR,此刻来了优先级更高的 ISR,则 EXC_RETURN=0xFFFF_FFF1
运行服务函数
中断发生时可以被另一个更高优先级的中断中断。
恢复现场
根据EXC_RETURN的值选择堆栈和运行模式,编译器会把之前入栈的R4~R11出栈,然后硬件将xPSR、PC、LR、R12、R3、R2、R1、R0出栈,继续运行被中断的函数。RTOS上下文切换时,会在此处更改用户堆栈指针,进而运行不同的线程。