0 前言
Cortex‐M3/M4/M7内核拥有MSP(主堆栈指针)、PSP(进程堆栈指针)2个堆栈指针,在裸机和RTOS下这2个堆栈是如何切换保证系统稳定运行的呢?本文将从裸机和RTOS这2个方面展开介绍。
1 裸机和RTOS的堆栈切换机制
1.1 裸机下的堆栈切换机制
裸机下我们只会使用MSP,这也是MCU复位后默认的使用方式。即设置CONTROL[1]=0,只使用MSP。此时无论是否在执行异常服务函数,都只使用MSP。下面是一个异常来临时裸机的堆栈指针使用情况示意图:
有关CONTROL[1]寄存器的介绍如下:
1.2 RTOS下的堆栈切换机制
在RTOS中,除了异常服务中使用MSP,其余情况均使用PSP。这样做的好处可以避免因为PSP的操作错误导致MSP出现异常导致全盘崩溃,提高健壮性。
为了在线程模式下使用PSP,就必须将CONTROL[1]设置为1。这样线程模式下将会使用PSP,Handler模式继续使用MSP(Handler模式永远使用MSP)。下面是一个异常来临时RTOS的堆栈指针使用情况示意图:
注:当异常发生时,CPU会使用PSP自动压栈(压入异常发生时xPSR, PC, LR, R12,R3-R0寄存器值到线程栈)保护现场,进入异常Handler后才自动改为MSP,退出异常时再恢复为PSP,同时从线程栈上弹出数据恢复现场(弹出异常发生时保存在线程栈的xPSR, PC, LR, R12,R3-R0寄存器值到CPU对应寄存器)。
有关CONTROL[1]寄存器的介绍如下: