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堆棧指針指向下一個要運行的任務,實現任務的切換功能。

浙公網安備 33010602011771號