MSP和PSP 的含義是Main_Stack_Pointer 和Process_Stack_Pointer,在邏輯地址上他們都是R13;
權威手冊上說的很清楚PSP主要是在Handler的模式下使用,MSP主要在線程模式下使用(當然你在線程模式下也可以調用PSP,需要你做特殊的處理);
這意味着同一個邏輯地址,實際上有兩個物理寄存器,一個為MSP,一個為PSP,在不同的工作模式調用不同的物理寄存器。
Cortex-M3內核有兩個堆棧指針:MSP-主堆棧指針和PSP-進程堆棧指針,在任何一個時刻只能有一個堆棧指針起作用,也就是說任何一個時刻只能使用一個堆棧指針,要么使用MSP,要么使用PSP。何為堆棧指針,其實就是普通的指針,只是他們指向兩個不同的堆棧。
MSP:主堆棧指針,當程序復位后(開始運行后),一直到第一次任務切換完成前,使用的都是MSP,即:main函數運行時用的是MSP,運行OSStartHighRdy,運行PendSV程序,用的都是MSP。當main函數開始運行前,啟動文件會給這個函數分配一個堆棧空間,像ucos給任務分配堆棧空間一樣,用於保存main函數運行過程中變量的保存。此時MSP就指向了該堆棧的首地址。
PSP:進程堆棧指針,切換任務之后PendSV服務程序中有ORR LR, LR, #0x04這句,意思就是PendSV中斷返回后使用的PSP指針,此時PSP已經指向了所運行任務的堆棧,所以返回后就可以就接着該任務繼續運行下去了。
由於任何一個時刻都只能使用一個堆棧指針(SP),所以,如果在某一個時刻,需要讀取或者改變另外一個堆棧指針的內容就得使用特定的指令:MSR和MRS