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堆栈指针指向下一个要运行的任务,实现任务的切换功能。

posted @ 2022-05-08 20:08  大高玩子  阅读(484)  评论(0编辑  收藏  举报