這個是全網(wǎng)最詳細(xì)的STM32項目教學(xué)視頻。
第一篇在這里:
視頻在這里
V3:HAL庫開發(fā)、手把手教學(xué)下面功能:PID速度控制、PID循跡、PID跟隨、遙控、避障、PID角度控制、openmv視覺控制、電磁循跡、FreeRTOS、K210視覺智能車(更新中)、K230視覺智能車(更新中)、MSPM0G3507視覺智能車(更新中)
22.4-任務(wù)優(yōu)先級與中斷優(yōu)先級
前面我們創(chuàng)建任務(wù)的時候,需要設(shè)置任務(wù)的優(yōu)先級,那么任務(wù)的優(yōu)先級是什么意思? 和中斷優(yōu)先級有什么區(qū)別那?我們新建多個任務(wù)時候又應(yīng)該如何確定任務(wù)的優(yōu)先級那?
22.4.1-任務(wù)優(yōu)先級相關(guān)
任務(wù)優(yōu)先級概念(了解)
任務(wù)優(yōu)先級決定了哪個任務(wù)先執(zhí)行,哪個任務(wù)后執(zhí)行。當(dāng)系統(tǒng)中有多個任務(wù)需要運行時,F(xiàn)reeRTOS 會根據(jù)任務(wù)優(yōu)先級來決定哪一個任務(wù)獲得 CPU 時間片。
- 高優(yōu)先級任務(wù) 會搶占低優(yōu)先級任務(wù)。
- 每個任務(wù)可以設(shè)置一個優(yōu)先級,優(yōu)先級的值越大,任務(wù)的優(yōu)先級越高。
任務(wù)優(yōu)先級設(shè)置和最高優(yōu)先級設(shè)置(了解)
任務(wù)優(yōu)先級設(shè)置
任務(wù)優(yōu)先級在每次新建任務(wù)可以在NewTask的Priority中設(shè)置優(yōu)先級
如果自己寫代碼新建任務(wù)可以在 xTaskCreate
函數(shù)中的 uxPriority
參數(shù)設(shè)置的。
xTaskCreate(TaskFunction, "TaskName", STACK_SIZE, NULL, PRIORITY, NULL);
任務(wù)優(yōu)先級的動態(tài)調(diào)整
FreeRTOS 提供了調(diào)整任務(wù)優(yōu)先級的 API,如 vTaskPrioritySet()
,可以動態(tài)改變?nèi)蝿?wù)的優(yōu)先級。例如,某些情況下,任務(wù)的優(yōu)先級可能需要在運行時進(jìn)行調(diào)整。
vTaskPrioritySet(taskHandle, newPriority);//taskHandle:任務(wù)句柄、newPriority:新的要設(shè)置的優(yōu)先級
任務(wù)最高優(yōu)先級設(shè)置
FreeRTOS 的優(yōu)先級是一個 無符號整數(shù),通常是從 0
(最低優(yōu)先級)到 configMAX_PRIORITIES-1
(最高優(yōu)先級)。
configMAX_PRIORITIES 在STM32Cubemx中設(shè)置或者代碼中設(shè)置(建議STM32Cbuemx設(shè)置然后生成代碼)
一般不用設(shè)置太大夠用就可以,比如設(shè)置5-7等
任務(wù)優(yōu)先級分配分配方案!(重點掌握)
對于初學(xué)者,有時候會糾結(jié)任務(wù)優(yōu)先級設(shè)置為多少合適,因為任務(wù)優(yōu)先級設(shè)置多少是沒有標(biāo)準(zhǔn)的。對于這個問題,這里為大家推薦一個標(biāo)準(zhǔn),任務(wù)優(yōu)先級設(shè)置推薦方式如下圖:
- IRQ 任務(wù):IRQ 任務(wù)是指通過中斷服務(wù)程序進(jìn)行觸發(fā)的任務(wù),此類任務(wù)應(yīng)該設(shè)置為所有任務(wù)里面優(yōu)先級最高的。比如中斷觸發(fā)的數(shù)據(jù)處理解析、中斷觸發(fā)的報警和急停等任務(wù)。
- 高優(yōu)先級后臺任務(wù):比如按鍵檢測,觸摸檢測,USB 消息處理,串口消息處理等,都可以歸為這一類任務(wù)。
- 低優(yōu)先級的時間片調(diào)度任務(wù):比如 emWin 的界面顯示,LED 數(shù)碼管的顯示等不需要實時執(zhí)行的都可以歸為這一類任務(wù)。實際應(yīng)用中用戶不必拘泥于將這些任務(wù)都設(shè)置為優(yōu)先級 1 的同優(yōu)先級任務(wù),可以設(shè)置多個優(yōu)先級,只需注意這類任務(wù)不需要高實時性。
- 空閑任務(wù):空閑任務(wù)是系統(tǒng)任務(wù)。
- 特別注意:IRQ 任務(wù)和高優(yōu)先級任務(wù)必須設(shè)置為阻塞式(調(diào)用消息等待或者延遲等函數(shù)即可),只有這樣,高優(yōu)先級任務(wù)才會釋放 CPU 的使用權(quán),,從而低優(yōu)先級任務(wù)才有機(jī)會得到執(zhí)行。
這里可以增加后面所做任務(wù)優(yōu)先級的計劃,和為什么那么做?
這個是已經(jīng)新增任務(wù)的優(yōu)先級,默認(rèn)任務(wù)和led任務(wù)設(shè)置正常優(yōu)先級,OLED刷新任務(wù)設(shè)置低于正常優(yōu)先級,這就是因為:OLED的刷新并不需要實時執(zhí)行,所以設(shè)置低一些。
后面章節(jié)我們會新增一些任務(wù)這里寫出對他們優(yōu)先級的設(shè)置規(guī)劃
最高優(yōu)先級是電機(jī)停止任務(wù),因為這個任務(wù)我們是等待按鍵中斷的二值信號量的屬于IRQ 任務(wù)(通過中斷服務(wù)程序進(jìn)行觸發(fā)的任務(wù))
其次是123456就是用來完成裸機(jī)時候的1和2和3和4和5和6模式的任務(wù)。
再然后是LED閃爍任務(wù)
最后是OLED刷新任務(wù),OLED刷新和LED燈閃爍都是屬于提示顯示任務(wù)設(shè)置比較低的優(yōu)先級就可以