Cortex-M3栈内存操作
訪問堆棧用堆棧指針,并且PUSH指令和POP指令默認(rèn)使用SP。
堆棧的PUSH與POP
堆棧是一種存儲(chǔ)器的使用模型。它由一塊連續(xù)的內(nèi)存和一個(gè)棧頂指針組成,用于實(shí)現(xiàn)”后進(jìn)先出“的緩沖區(qū)。其最典型的應(yīng)用,就是在數(shù)據(jù)處理前先保存寄存器的值,再在處理任務(wù)完成后從中恢復(fù)先前保護(hù)的這些值。
?注:寄存器的PUSH和POP操作永遠(yuǎn)都是4字節(jié)對齊的。原因是:堆棧指針的最低兩位永遠(yuǎn)是0。
棧內(nèi)存操作
?在Cortex-M3中,除了可以使用PUSH和POP指令來處理堆棧外,內(nèi)核還會(huì)在異常處理的始末自動(dòng)PUSH和POP操作。
?堆棧的基本操作
?堆棧的功能就是把寄存器的數(shù)據(jù)臨時(shí)備份在內(nèi)存中,以便將來能恢復(fù)之——在一個(gè)任務(wù)或一段子程序執(zhí)行完畢后恢復(fù)。
Cortex-M3的堆棧實(shí)現(xiàn)
Cortex-M3使用的是”向下生長的滿棧“模型。堆棧指針SP指向一個(gè)被壓入堆棧的32位數(shù)值。在下一次壓棧時(shí),SP先自減4,在存入新的數(shù)值。如下圖:
Cortex-M3的雙堆棧機(jī)制
堆棧分為兩個(gè):主堆棧和進(jìn)程堆棧,CONTROL[1]決定如何選擇。
當(dāng)CONTROL[1]=0時(shí),只使用MSP,此時(shí)用戶程序和異常handler共享同一個(gè)堆棧。
當(dāng)CONTROL=[1]=1時(shí),線程模式將不再使用MSP,而改用PSP(handler模式永遠(yuǎn)使用MSP)。?
?這樣的好處是:在使用OS的環(huán)境下,只要OS內(nèi)核僅在handler模式下執(zhí)行,用戶應(yīng)用程序僅在用戶模式下執(zhí)行,這樣就可以防止用戶程序的堆棧錯(cuò)誤破壞OS使用的堆棧。
?通過讀取PSP的值,OS就能夠獲取用戶應(yīng)用程序使用的堆棧,進(jìn)一步地知道了在發(fā)生異常時(shí),被壓入寄存器的內(nèi)容,而且還可以把其它寄存器進(jìn)一步壓棧。
總結(jié)
以上是生活随笔為你收集整理的Cortex-M3栈内存操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uboot主循环main_loop
- 下一篇: misc类设备