[FreeRtos]任务状态切换和优先级设置
1. 任務狀態的切換
FreeRTOS中任務的狀態可分為:未創建態、就緒態、運行態、掛起態、延時態五種狀態。
a: 調用xTaskCreate()函數將新建一個任務,新建的任務會加入到就緒列表,若新建的任務的優先級足夠高,調度器會立即將CPU資源分配給他,使它進入運行態。
b: 調度器檢查就緒列表中優先級高的任務,并將CPU資源分配給它,使他進入運行態。
c: 運行態的任務可能創建/恢復了新的更高優先級的任務,或者因其操作了某事件(如發送了一個更高優先級的任務需要的消息),使更高優先級的任務進入了就緒表時,再或者更高優先級的任務延時到期自動加入就緒表時,更高優先級的任務將得到CPU資源,使當前運行的任務重新進入就緒態(雖然他還在就緒列表,但由于優先級低,而不被分配CPU資源)。
d: 任務對申請處理的事件操作成功、或者處理失敗但發起獲取申請時設置阻塞時間為0,將繼續保留CPU資源,繼續運行。
e: 正在運行的任務(毫無疑問,此時它是就緒表中優先級最高的任務之一),可能想要處理一個事件(如想獲取一條消息隊列中的消息),此時它將向事件資源管理者(即消息隊列)發起申請。如使用以下函數嘗試獲取隊列中的一條消息:
xQueueReceive( QueueHandle_t xQueue,void * pvBuffer,TickType_t xTicksTowait );
f: 任務對申請處理的事件操作失敗、并且發起獲取申請時設置阻塞時間大于0,則任務會從就緒列表,加入到阻塞延時列表;在等待期間嘗試操作事件成功。
n: 運行態的任務調用vTaskDelay(),將把自己從就緒列表搬移到主動延時列表,并讓就緒表的其他任務獲取CPU資源。
h: 延時態的任務在延時結束時,若優先級比當前任務優先級高,就加入就緒隊列,并立即獲得CPU資源,進入運行。
g: 延時態的任務在延時結束時,若優先級比當前任務優先級低,就加入就緒隊列,但是由于優先級不夠,只能等待獲取CPU資源。
i: 處于就緒態的任務被正在執行的高優先級的任務掛起,將從就緒列表加入到掛起列表,注意,在掛起列表中的任務,是被打入“冷宮”的任務,除非程序員在寫代碼時主動調用vTaskResume ()恢復該任務,否則該該任務永遠不會回到就緒列表了,更不會被執行。
j: 運行態的任務,主動調用vTaskSuspend()函數掛起自己,將使自己從就緒列表加入掛起列表,并立即執行就緒列表中優先級高的其他任務。
k: 掛起態的任務,不會獲得CPU資源了,因此只能等待被正在運行的任務(或中段)喚醒。m: 同上,被喚醒的任務會被從掛起列表加入到就緒列表,若被喚醒的任務的優先級比當前正在運行的任務優先級高,就立即將CPU資源分配給被喚醒的任務。
當然,我們還可以使用vTaskDelete()函數刪除一個任務,刪除一個任務會將該任務變為未創建態(它什么資源都沒有了),除非重新調用vTaskCreat()函數重建它,否則永遠不會加入到就緒列表了。
特別地,掛起一個處于延時態的任務會是什么情況,可以再具體討論。
2.運行態的任務觸發切換的情況總結
? ? ? ? a. 正在運行的任務,觸發調度器工作的途徑有:(但凡有可能引出高優先級任務或中斷的操作都會觸發調度器檢查)
? ? 1.創建新任務(顯然,新建任務可能比自身的優先級高,因此可能觸發調度器)?
? ? 2.掛起自己、刪除自己(往往代表我執行完了)、阻塞延時自己、普通延時自己
? ? 3.解阻塞高優先級任務、或觸發中斷(中斷中解阻塞一些高優先級任務)
? ? 4.高優先級任務自動就緒(主要指高優先級任務延時結束,定時器任務,定時器任務優先級較? 高的情況下,若定時溢出,將搶占CPU)
? ? 5.恢復一個掛起的高優先級任務。
b. 中斷中觸發調度器工作的途徑有:(但凡有可能使高優先級任務就緒的操作都會觸發調度器檢查)
? ? 1.在中斷處理函數中創建新的高優先級任務
? ? 2.在中斷中釋放信號量、消息等使高優先級任務解除阻塞進入就緒。
? ? 3.恢復優先級高的任務
3.任務優先級分配方案
對于初學者,有時候會糾結任務優先級設置為多少合適,因為任務優先級設置多少是沒有標準的。對于這個問題,我們這里為大家推薦一個標準,任務優先級設置推薦方式如下圖13.1 所示:
?
? IRQ 任務:IRQ 任務是指通過中斷服務程序進行觸發的任務,此類任務應該設置為所有任務里面優先級最高的。
? 高優先級后臺任務:比如按鍵檢測,觸摸檢測,USB 消息處理,串口消息處理等,都可以歸為這一類任務。
? 低優先級的時間片調度任務:比如 emWin 的界面顯示,LED 數碼管的顯示等不需要實時執行的都可以歸為這一類任務。 實際應用中用戶不必拘泥于將這些任務都設置為優先級 1 的同優先級任務,可以設置多個優先級,只需注意這類任務不需要高實時性。
? 空閑任務:空閑任務是系統任務。
? 特別注意:IRQ 任務和高優先級任務必須設置為阻塞式(調用消息等待或者延遲等函數即可),只有這樣,高優先級任務才會釋放 CPU 的使用權,,從而低優先級任務才有機會得到執行。
這里的優先級分配方案是我們推薦的一種方式,實際項目也可以不采用這種方法。 調試出適合項目需求的才是最好的。
4. 中斷優先級和任務優先級區別
????????部分初學者也容易在這兩個概念上面出現問題。 簡單的說,這兩個之間沒有任何關系,不管中斷的優先級是多少,中斷的優先級永遠高于任何任務的優先級,即任務在執行的過程中,中斷來了就開始執行中斷服務程序。
????????另外對于 STM32F103,F407 和 F429 來說,中斷優先級的數值越小,優先級越高。 而 FreeRTOS的任務優先級是,任務優先級數值越小,任務優先級越低。
?
?
總結
以上是生活随笔為你收集整理的[FreeRtos]任务状态切换和优先级设置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Halcon 之 Measure_Pai
- 下一篇: matlab上万大型矩阵求逆,要好好总结