freeRTOS 掛起 恢復任務

2022-09-14 04:21:09 字數 2147 閱讀 3472

任務掛起:

它把所有掛起的任務加到 xsuspendedtasklist 中,

而且一旦呼叫 vtasksuspend() 函式掛起乙個任務,該任務就將從所有它原先連入的鍊錶中刪除(包括就緒表,延時表和它等待的事件鍊錶【兩類列表都要清掉】),

也就是說,一旦乙個任務被掛起,它將取消先前它的延時和對事件的等待。

相反的喚醒就是把任務從xsuspendedtasklist中刪除,加到對應的就緒鍊錶中(根據任務的優先順序),然後如果喚醒的任務優先順序高於當前任務優先順序,則排程。

1

void

vtasksuspend( taskhandle_t xtasktosuspend )219

else

2023

24/*

is the task waiting on an event also?

*/25

if( listlist_item_container( &( pxtcb->xeventlistitem ) ) !=null )container是某個訊號量 或 事件佇列的waittosend列表或waittorcv列表。26

29else

3033

34 vlistinsertend( &xsuspendedtasklist, &( pxtcb->xstatelistitem ) ); 將任務狀態項,加入到掛起列表中。35}

##  原子資料:

(7)、 pxcurrenttcb 指向正在執行的任務,但是正在執行的任務要掛起了,所以必須給pxcurrenttcb 重新找乙個「物件」。

也就是查詢下乙個將要執行的任務,本來這個工作是由任務切換函式來完成的,但是程式執行到這一行說明任務排程器被掛起了

任務切換函式也無能為力了,必須手動查詢下乙個要執行的任務

呼叫函式 listcurrent_list_length()判斷一下系統中所有的任務是不是都被掛起了,

也就是檢視列表 xsuspendedtasklist 的長度是不是等於 uxcurrentnumberoftasks。

如果等於的話就說明系統中所有的任務都被掛起了(實際上不存在這種情況,因為最少有乙個空閒任務是可以執行的,

空閒任務執行期間不會呼叫任何可以阻塞或者掛起空閒任務的 api 函式,為的就是保證系統中永遠都有乙個可執行的任務)。

##1   taskreset_ready_priority( pxtcb->uxpriority ); 

「刪除任務」分析裡面,也會呼叫這個api,目的是維護乙個變數,

這個變數的功能:

1. 在使用通用方法找到最高優先順序任務時,它用來記錄最高優先順序任務的優先順序。

2. 在使用硬體方法找到最高優先順序任務時,它的每一位(共32bit)的狀態代表這個優先順序上邊,有沒有就緒的任務。

找到最高優先順序任務的方法,見「任務切換」一節。

任務恢復函式有兩個 vtaskresume() 和 xtaskresumefromisr() 。

但基本原理是差不多的。

1

void

vtaskresume( taskhandle_t xtasktoresume )231

else

3235}36

else

3740}41

taskexit_critical();42}

43else

4447 }

留白

恢復任務,OSTaskResume

cpp view plain copy 在上一節中曾提到過,被掛起的任務只有通過呼叫ostaskresume 才能恢復。ostaskresume 函式的 如程式清單 l4.17所示。因為ostasksuspend 不能掛起空閒任務,所以必須得確認使用者的應用程式不是在恢復空閒任務 l4.17 1 注...

FreeRTOS 四 任務掛起與恢復

函式 描述vtasksuspend 掛起乙個任務 vtaskresume 恢復乙個任務的執行 vtaskresumefromeisr 中斷服務函式中恢復乙個任務的執行 此函式用於將某個任務設定為掛起態,進入掛起態的任務永遠都不會進入執行態。退出掛起態的唯一方法就是呼叫任務恢復函式vtaskresum...

FreeRTOS學習 二 任務掛起和恢復

宣告及感謝 跟隨正點原子資料學習,在此作為學習的記錄和總結 環境 keil stm32f103 1.任務掛起 vtasksuspend task1task handler 引數傳入任務控制代碼 2.任務恢復 任務恢復有兩種情況,第一種 在非中斷中恢復 vtaskresume task1task ha...