(轉)UCOSII在任務切換與出入中斷時堆棧指針的使用


1 uc/os ii在M3中的堆棧結構

1.1 M3入賬序列 
這里寫圖片描述 
1.2 加上手工入棧序列 
這里寫圖片描述

2 PendSV在Cortex-M3中的應用

Systick為嵌入到內核中,優先級比一般中斷優先級高。若在一般中斷的ISR執行過程中,發生了Systick異常,則Systick會搶占該ISR。若此時Systick做上下文切換,在M3中將觸發用法fault(在中斷活躍時嘗試切入線程模式)。即使在別的內核體系下不發生硬fault,ISR也會被延遲,這對於任一講究實時性的系統是不能接受的。 
所以Systick只是在其服務程序中觸發一個PendSV中斷(事先將PendSV中斷優先級設置的很低)。Systick返回后將繼續執行被搶占的中斷ISR。執行完后,程序跳轉到PendSV服務程序中執行任務切換。

3 M3中堆棧的切換

3.1 在中斷返回時,通過修改LR中的EXC_RETURN 
3.1.1 EXC_RETURN 
在出入ISR的時候,LR的值將得到重新的詮釋,這種特殊的值稱為“EXC_RETURN”, 
在異常進入時由系統計算並賦給LR,並在異常返回時使用它。EXC_RETURN的二進制值除了最低4位外全為1,而其最低4位則有另外的含義。 
表1 EXC_RETURN位段詳解 
這里寫圖片描述 
表2 合法的EXC_RETURN值及功能 
這里寫圖片描述

3.2 異常返回和異常返回序列 
M3 提供的異常返回指令 
這里寫圖片描述 
出棧:先前壓入棧中的寄存器在這里恢復。內部的出棧順序與入棧時的相對應,堆棧指針的值也改回先前的值。 
只要ISR沒有更改過CONTROL[1],就依然使用發生本次異常的瞬間正在使用的SP指針來執行出棧操作。

3.3 修改EXC_RETURN,進行模式和堆棧的選擇。 
在異常ISR中,處理器處於特權模式,可以訪問所有存儲器(除MPU規定)。通過修改LR的值來達到不同模式和堆棧的切換。

4、再論M3雙堆棧機制

已經知道M3堆棧分為MSP和PSP,CONTROL[1]決定如何選擇。當CONTROL[1]為0時,只使用MSP,此時用戶程序和異常handler共享一個堆棧。 
當CONTROL[1]為1時,線程模式將不再使用MSP,而改用PSP。這樣做的好處在OS內核中防止用戶程序 的堆棧破壞OS的堆棧。在在這種情況下進入異常的自動壓棧使用的是進程堆棧,進入異常handler后才自動改為MSP,退出異常時切換回PSP,並且從進程堆棧上彈出數據

5、理解M3中的R14

1 在中斷 
在出入ISR的時候,LR的值將得到重新的詮釋,這種特殊的值稱為“EXC_RETURN”。在異常進入時由系統計算並賦給LR,並在異常返回時使用它。

2 在函數跳轉 
當呼叫一個子程序時,由R14存儲返回地址。

6、UCOSII中的PSP MSP

1 、執行任務的時候用的是PSP

PSP堆棧指針在任務初始化的時候指向的是任務的堆棧而不是CPU內核堆棧,即在創建任務的時候定義的全局變量數組

當任務運行時,任務堆棧用來保存一些局部變量

當任務掛起時,任務堆棧負責保存任務的運行現場,也就是CPU寄存器的值

2、執行中斷的時候用的是MSP

MSP指向CPU內核堆棧,就是啟動文件里面分配的堆棧大小

文章轉載自:https://blog.csdn.net/sunheshan/article/details/48554327


免責聲明!

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



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