1. 程式人生 > >(轉)UCOSII在任務切換與出入中斷時堆棧指針的使用

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

機制 服務 出棧 正在 嵌入 二進制 實時性 事先 nds

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存儲返回地址。

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

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