Cortex M3雙堆疊MSP和PSP

2021-10-05 01:36:38 字數 1183 閱讀 8622

什麼是棧?

在談m3堆疊之前我們先回憶一下資料結構中的棧。棧是一種先進後出的資料結構(類似於槍枝的彈夾,先放入的子彈最後打出,後放入的子彈先打出)。m3核心的堆疊也不例外,也是先進後出的。

棧的作用?

區域性變數記憶體的開銷,函式的呼叫都離不開棧。

了解了棧的概念和基本作用後我們來看m3的雙堆疊

cortex-m3核心使用了雙堆疊,即msp和psp,這極大的方便了os的設計。

msp的含義是main_stack_pointer,即主棧

psp的含義是 process_stack_pointer,即任務棧

sp:sp是堆疊指標,指向最後乙個被壓入元素的位址。

m3的壓棧和彈棧過程:

壓棧:sp先自減4,然後將待壓入的資料存放到sp所指的位址

彈棧:從sp指標所指的位址讀出資料,然後sp指標自增4。

為什麼壓棧sp自減,彈棧sp自增呢?這是因為m3核心堆疊生長方向是向下的。為什麼壓棧和彈棧分別是減4加4呢?這是因為m3是32bit的核心。

m3核心何時使用msp何時使用psp?

m3雙堆疊的意思是有兩個堆疊,但是任何時刻只能使用其中之一。那什麼時候使用msp,什麼時候使用psp呢?也就是說sp暫存器中的值在某一時刻到底是使用msp的值還是psp的值?這是根據control暫存器的bit1來決定的。當control的bit1為0使用msp(預設方式);當control的bit1為1使用psp。

總結:control的bit1為0,sp = msp

control的bit1為1,sp = psp

m3復位後處於執行緒模式特權級,預設使用msp。

通過配置control暫存器的bit1位就可以決定sp使用msp還是psp。

在裸機開發中,control的bit1始終是0,也就是說裸機開發中全程使用程msp,並沒有使用psp。在執行後台程式(大迴圈程式)sp使用的是msp,在執行前台程式(中斷服務程式)sp使用的是msp。

在os開發中,當執行中斷服務程式的時候control的bit1是0,sp使用的是msp;當執行執行緒程式的時候control的bit1是1,sp使用的是psp。

Cortex M3異常筆記

異常型別 cortex m3編號為1 15對應系統異常,大於等於16的全部是核心級額外部中斷,除個別異常 復位,nmi,硬fault 的優先順序被定死之外,其他異常優先順序都是可以程式設計的。如果乙個發生的異常不能即刻響應,就稱它被 懸起 pending 少數異常時不能被懸起的。乙個異常被懸起的原因...

Cortex M3復位序列

在離開復位狀態後,cm3 做的第一件事就是讀取下列兩個32 位整數的值 從位址 0x0000,0000 處取出msp 的初始值。從位址 0x0000,0004 處取出pc 的初始值 這個值是復位向量,lsb 必須是1。然後從這個值所對應的位址處取指。請注意,這與傳統的arm 架構不同 其實也和絕大多...

qemu除錯cortex m3程式

1.安裝arm none eabi arm 2011.09 69 arm none eabi.bin 2.安裝qemu 3.建立原始檔 4.arm none eabi gcc o main.elf hello.c g mcpu cortex m3 mthumb t generic hosted.ld...