關於STM32-M3/M4的MSP和PSP


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

轉自:http://blog.sina.com.cn/s/blog_7880d3350102y2fp.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM