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