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