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