FreeRTOS的任務觸發是由滴答時鐘觸發SysTick中斷來觸發調度器執行或阻塞或掛起和切換任務的。
首先是任務的并發能力,FreeRTOS的任務執行是基于全搶占調度機制,任務優先級按在就緒列表中由高到低排布,系統首先執行最高優先級任務,如果最高優先級在while(1)中,最高優先級任務將永遠執行。要想分配CPU資源給其他任務,可以用 vTaskDelay 來暫時將高優先級任務掛起。此時下一個高優先級任務就會搶占CPU資源,開始執行任務,delay時間過后,高優先級重新搶占CPU,恢復執行。
全搶占調度機制比較適用于實時控制,對響應時間要求嚴格,因為延遲可能導致系統性能下降或安全問題。比如說智能車,電機控制方面,優先級肯定是最高的,但是像camera的數據采集就可以在電機控制之下,智能車在運行的時候,camera采集數據不需要極其的頻繁,再往下比如LCD圖像顯示,就更不需要那么頻繁的顯示,即便有延遲,對系統安全也不會產生多大的影響。這種設置可以確保電機控制任務的實時性和響應性,同時允許相機數據采集和LCD圖像顯示任務在不影響關鍵功能的情況下進行適當的延遲。
接下來是任務的并行能力,時間片輪轉調度機制是任務的并行機制,也就是當多個任務處于同一優先級時,CPU通過劃分時間片,每個時間片執行任務,任務沒有執行完,就將數據或寄存器配置等暫存到CPU的堆棧上,等待其他任務全部執行完對應的時間片,再次恢復到任務被執行的點。
時間片輪轉調度機制其實最好的應用法是對于某些任務,需要等待某個事件,或者需要等待什么資源的時候,為了不白白空等,就先去執行其他的任務,等到其他任務執行完了,我這個任務也等到了想要的資源。
比如camera的數據采集和數據處理與分析,可以在同一個優先級,也就是數據該采集采集,等camera數據采集完了我就執行數據分析,之后camera依舊在不同的時間片進行數據采集,采集完的數據在不同的時間片進行分析。(但是這也要注意一些問題,如果數據采集任務在一個時間片內沒有完成數據的采集,而數據處理與分析任務在下一個時間片內開始執行,可能會導致數據丟失。因為數據采集任務沒有機會在連續的時間片內完成采集,而數據處理與分析任務已經開始處理下一次采集的數據。以及如果數據處理與分析任務占用的執行時間較長,可能會導致相機數據采集任務無法及時響應。這可能會導致數據采集的延遲增加,影響實時性能。此時可能用高低優先級全搶占調度機制實現camera的數據采集和數據處理與分析更穩一點)
時間片輪轉調度機制一般用于沒有緊急的實時需求情況下,比如智能車需要通過多個傳感器(如相機、雷達、激光等)獲取環境信息,并進行實時的感知和決策。這幾個任務完全可以利用時間片輪轉調度機制獲取信息嗎。