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