這個(gè)是全網(wǎng)最詳細(xì)的STM32項(xiàng)目教學(xué)視頻。
第一篇在這里:
視頻在這里
V3:HAL庫(kù)開(kāi)發(fā)、手把手教學(xué)下面功能:PID速度控制、PID循跡、PID跟隨、遙控、避障、PID角度控制、openmv視覺(jué)控制、電磁循跡、FreeRTOS、K210視覺(jué)智能車(更新中)、K230視覺(jué)智能車(更新中)、MSPM0G3507視覺(jué)智能車(更新中)
講解任務(wù)的常見(jiàn)幾種 狀態(tài)和如何切換的
單核CPU的多任務(wù)運(yùn)行機(jī)制可以得到,任何時(shí)刻,只能有一個(gè)任務(wù)占用CPU并運(yùn)行,這個(gè)任務(wù)的狀態(tài)稱為運(yùn)行(running)狀態(tài),其他未占用CPU的任務(wù)狀態(tài)稱之為非運(yùn)行(notruning)狀態(tài)。非運(yùn)行態(tài)又可以細(xì)分為三個(gè)狀態(tài),任務(wù)的各個(gè)狀態(tài)及其狀態(tài)之間的轉(zhuǎn)化關(guān)系如何:
freeRTOS任務(wù)調(diào)度有搶占式和合作式兩種方式,一般使用基于任務(wù)優(yōu)先級(jí)的搶占式任務(wù)調(diào)度方法。任務(wù)調(diào)度的各種方法在后面有詳細(xì)介紹,這里我們以搶占任務(wù)調(diào)度方法講解。
- 就緒狀態(tài)
任務(wù)被創(chuàng)建后就處于就緒狀態(tài),freeRTOS的任務(wù)調(diào)度器在基礎(chǔ)時(shí)鐘每次中斷是進(jìn)行一次任務(wù)調(diào)度申請(qǐng),根據(jù)搶占式任務(wù)調(diào)度的特點(diǎn),任務(wù)調(diào)度的結(jié)果。
如果當(dāng)前沒(méi)有其他處于運(yùn)行狀態(tài)的任務(wù),處于就緒狀態(tài)的任務(wù)進(jìn)入運(yùn)行狀態(tài)。
如果就緒任務(wù)的優(yōu)先級(jí)高于或者等于當(dāng)前任務(wù)的優(yōu)先級(jí),處于就緒狀態(tài)的任務(wù)進(jìn)入運(yùn)行狀態(tài)。
如果就緒任務(wù)的優(yōu)先級(jí)低于當(dāng)前任務(wù)的優(yōu)先級(jí),就緒狀態(tài)的任務(wù)無(wú)法獲得CPU使用權(quán),繼續(xù)處于就緒狀態(tài)。
- 運(yùn)行狀態(tài)
在單核處理器上,占有CPU并運(yùn)行的任務(wù)就處于運(yùn)行狀態(tài)。處于運(yùn)行狀態(tài)的高優(yōu)先級(jí)任務(wù)如果一直運(yùn)行,將一直占用CPU,在任務(wù)調(diào)度時(shí),低優(yōu)先級(jí)的就緒任務(wù)就無(wú)法獲得CPU的使用權(quán),無(wú)法實(shí)現(xiàn)多任務(wù)的運(yùn)行。因此,處于運(yùn)行狀態(tài)的任務(wù),應(yīng)該在空閑的時(shí)候讓出CPU的使用權(quán)。
處于運(yùn)行狀態(tài)的任務(wù),有兩種主動(dòng)讓出CPU 使用權(quán)的方法,一種是執(zhí)行函數(shù) vTaskSuspend進(jìn)入掛起狀態(tài),另一種是執(zhí)行阻塞式函數(shù)進(jìn)入阻塞狀態(tài)。這兩種狀態(tài)都是非運(yùn)行狀態(tài),運(yùn)行的任務(wù)就交出了CPU的使用權(quán),任務(wù)調(diào)度器可以使其他就緒狀態(tài)的任務(wù)進(jìn)入運(yùn)行狀態(tài)。
- 阻塞狀態(tài)
阻塞(blocked)狀態(tài)就是任務(wù)暫時(shí)讓出CPU的使用權(quán),處于等待的狀態(tài)。運(yùn)行狀態(tài)的任務(wù)可以調(diào)用兩類函數(shù)進(jìn)入阻塞狀態(tài)。
一類是時(shí)間延遲函數(shù),如vTaskDelay())或vTaskDelayUntil()。處于運(yùn)行狀態(tài)的任務(wù)調(diào)用這類函數(shù)后,就進(jìn)入阻塞狀態(tài),并延遲指定的時(shí)間。延遲時(shí)間到了后,又進(jìn)入就緒狀態(tài),參與任務(wù)調(diào)度后,又可以進(jìn)入運(yùn)行狀態(tài)。
另一類是用于進(jìn)程間通信的事件請(qǐng)求函數(shù),例如,請(qǐng)求信號(hào)量的函數(shù) xSemaphoreTake().處于運(yùn)行狀態(tài)的任務(wù)執(zhí)行函數(shù)xSemaphoreTake()后,就進(jìn)入阻塞狀態(tài),如果其他任務(wù)釋放了信號(hào)量,或等待的超時(shí)時(shí)間到了,任務(wù)就從阻塞狀態(tài)進(jìn)入就緒狀態(tài)狀態(tài)
在運(yùn)行狀態(tài)的任務(wù)中調(diào)用函數(shù)vTaskSuspend(),可以將一個(gè)處于阻塞狀態(tài)的任務(wù)轉(zhuǎn)入掛起。
- 掛起狀態(tài)
掛起(suspended)狀態(tài)的任務(wù)就是暫停的任務(wù),不參與調(diào)度器的調(diào)度。其他 3 種狀態(tài)的任務(wù)都可以通過(guò)函數(shù)vTaskSuspend()進(jìn)入掛起狀態(tài)。處于掛起狀態(tài)的任務(wù)不能自動(dòng)退出掛起狀態(tài),需要在其他任務(wù)里調(diào)用函數(shù)vTaskResume(),才能使一個(gè)掛起的任務(wù)變?yōu)榫途w狀態(tài)。