Cortex-M3双堆栈指针 MSP 和 PSP
Cortex-M3内涵的堆栈
Cortex-M3拥有两个堆栈指针
MSP的含义是Main_Stack_Pointer,即主栈
PSP的含义是 Process_Stack_Pointer,即任务栈
当我们触发了PendSV异常进入中断后,系统默认是出于MSP状态的。
当我们需要切换任务是,就需要使用PSP作为任务堆栈指针。一般我们使用修改LR寄存器的值来改变SP使用MSP还是PSP.
当LR 为0xFFFFFFF9的时候,我们使用MSP堆栈指针。
当LR 为0xFFFFFFFD的时候,我们使用PSP堆栈指针。
所以一般PendSV中任务堆栈处理完毕后,需要使用
LDR LR,=0xFFFFFFFD
指令进行PSP任务堆栈的选择。
再执行BX LR 指令,即可切换到堆栈保存的任务中去。
以下是我测试时使用的代码
#include "ARMCM3.h"
__asm void PendSV_Handler(void)
{
LDR LR, =0xFFFFFFFD
BX LR
}
//触发系统异常
__asm void TriggerOS(void)
{
LDR R0, =0xE000ED04
LDR R1, =0x10000000
STR R1, [R0]
BX LR
}
int main(void)
{
TriggerOS();
return 0;
}
在KEIL5调试状态下,可以看到,当触发PendSV中断后,需要通过LDR LR,=0xFFFFFFFD指令,使得内核采用PSP堆栈指针,这个时候就可以利用这个方法,设置当前的LR堆栈指针指向下一个要运行的任务,实现任务的切换功能。