uC OS ii在M3中的任務切換與任務堆疊

2021-07-05 09:35:42 字數 1657 閱讀 9830

1.1 m3入賬序列

1.2 加上手工入棧序列

systick為嵌入到核心中,優先順序比一般中斷優先順序高。若在一般中斷的isr執行過程中,發生了systick異常,則systick會搶占該isr。若此時systick做上下文切換,在m3中將觸發用法fault(在中斷活躍時嘗試切入執行緒模式)。即使在別的核心體系下不發生硬fault,isr也會被延遲,這對於任一講究實時性的系統是不能接受的。

所以systick只是在其服務程式中觸發乙個pendsv中斷(事先將pendsv中斷優先順序設定的很低)。systick返回後將繼續執行被搶占的中斷isr。執行完後,程式跳轉到pendsv服務程式中執行任務切換。

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的值來達到不同模式和堆疊的切換。

已經知道m3堆疊分為msp和psp,control[1]決定如何選擇。當control[1]為0時,只使用msp,此時使用者程式和異常handler共享乙個堆疊。

當control[1]為1時,執行緒模式將不再使用msp,而改用psp。這樣做的好處在os核心中防止使用者程式 的堆疊破壞os的堆疊。在在這種情況下進入異常的自動壓棧使用的是程序堆疊,進入異常handler後才自動改為msp,退出異常時切換回psp,並且從程序堆疊上彈出資料。

1 在中斷

在出入isr的時候,lr的值將得到重新的詮釋,這種特殊的值稱為「exc_return」。在異常進入時由系統計算並賦給lr,並在異常返回時使用它。

2 在函式跳轉

當呼叫乙個子程式時,由r14儲存返回位址。

ucos在M3中的中斷巢狀機制

第一 nvic和cm3處理器會根據優先順序的設定來控制搶占與巢狀行為。因此,在某個異常正在響應時,所有優先順序不高於它的異常都不能搶占之,而且它自己也不能搶占自己。第二 有了自動入棧和出棧,就不用擔心在中斷發生巢狀時,會使暫存器的資料損毀,從而可以放心地執行服務例程。因為所有服務例程都只使用主堆疊,...

uC OS II中的任務 讀書筆記 3

任務的建立 任務的掛起和恢復 任務優先順序別的修改 任務的刪除 查詢任務的資訊 uc os ii的初始化和任務的啟動 2.5任務的建立 2.5.1用函式ostaskcreate 建立任務 1 先對建立任務的優先順序進行一系列的判斷 2 確認該優先級別合法且未被使用後,隨即呼叫函式ostaskskti...

ucosii中的任務數量

對於ucos中支援的任務數量,不同的版本有一定的差異。具體來說,ucos 2.86版本之前支援64個任務,系統一般要占用最低兩個優先順序用作空閒任務和統計任務 假如初始化了統計任務 ucos 2.86版本起支援256任務,同樣是最低優先順序兩個任務用作系統任務。有的地方說,在ucos中系統保留了最高...