日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Cortex-M3栈内存操作

發(fā)布時間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Cortex-M3栈内存操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

訪問堆棧用堆棧指針,并且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í)行完畢后恢復。

.....(主程序) ; R0, R1=Y, R2=Z BL Fx1Fx1PUSH {R0} ;把R0存入棧&調(diào)整SPPUSH {R1} ;把R1存入棧&調(diào)整SPPUSH {R2} ;把R2存入棧&調(diào)整SP..... ;執(zhí)行Fx1的功能,中途可以改變R0-R2的值POP {R2} ;恢復R2早先的值&再次調(diào)整SPPOP {R1} ;恢復R1早先的值&再次調(diào)整SPPOP {R0} ;恢復R0早先的值&再次調(diào)整SPBX LR ;返回 ;返回主程序 ;R0=X,R1=Y.R2=Z(調(diào)用Fx1的前后R0-R2的值完好無損) PUSH/POP指令足夠體貼,支持一次操作多個寄存器。


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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。