SP在嵌入式系统里面通常指堆栈指针,指向最后一个被压入元素的地址。在Cortex-M3内核架构下,MCU使用了双堆栈,即MSP和PSP。
MSP:Main_Stack_Pointer,即主栈
Cortex-M3的双堆栈设计下,虽然是两个堆栈,但同一时间只能使用其中一个SP。内核使用MSP还是PSP,则要看当前的运行模式。
MSP主堆栈指针在复位后默认使用,在handler模式下,也只允许使用MSP。而在普通模式,可以使用PSP。
为什么是两个SP?我觉得Cortex-M3内核设计两个SP的主要目的和新增一个systick定时器的目的是一致的,即主要为了配置RTOS的设计使用,以充分保证RTOS的安全性和鲁棒性。
在RTOS的运行中,操作系统kernel和异常事件使用MSP,而用户任务则使用PSP。MSP和PSP之间的切换会在内核处理异常事件时自动完成。这样,当用户任务实现过程中堆栈溢出不会影响到MSP的堆栈,从而保证了kernel的稳定。Kernel的堆栈不会被破坏,这也给kernel处理异常事件提供了环境保证。
当然,前后台(裸机)设计模式下,内核也仅使用MSP指针。其实RTOS在上电复位到切换线程之前用的也都是MSP指针,也就是线程切换之前都是一个前后台程序的状态。