FreeRTOS的任務非執行態

2022-06-08 13:06:08 字數 871 閱讀 2350

當freertos啟動任務排程器以後,任務排程器會在心跳中斷函式中確定下乙個要執行的任務,如果任務排程器僅僅依靠任務優先順序來判斷該執行哪個任務,這樣會造成低優先順序的任務根本沒法執行,因為freertos的任務都是迴圈執行的,這樣就失去了優先順序的意義。為了統籌安排任務的執行,freertos增加了任務的非執行態:

ready:當核心正在執行最高優先順序的任務的時候,其他已經做好準備可以隨時執行的任務的狀態;

阻塞態:就是任務在等待某個同步事件的發生(比如某個訊號量,互斥量等等),或者任務在等待定時器的觸發,只有在驅動事件發生或者定時器觸發的情況下,這個任務才有資格轉換成ready狀態,如果沒有轉換成ready狀態,即使優先順序再高,排程器也不會呼叫這個任務的,如果阻塞態等待的同步事件在規定的事件內沒有發生,那麼就觸發定時器;

掛起狀態:任務排程器根本就不會考慮掛起狀態的任務,更不用說執行掛起狀態的任務了;

阻塞態應用很好的乙個例子就是vtaskdelay(time_period/porttick_rate_ms); 這個函式會一直處在阻塞態,可以取代for迴圈的輪詢延時函式,這個for迴圈延時會增加cpu的負擔又不幹任何有意義的事情,所以用vtaskdelay()來做延時函式更合適,在vtaskdelay()中,引數表示式的分子部分time_period是一心跳單位為計數單位的時間值,分母部分是每毫秒對應的心跳數值,這樣正好可以得到延時的毫秒值;

還有乙個阻塞態延時函式vtaskdelayunil(pxpreciouswaketime, xtimeincrement),這個函式相比vtaskdelay()來講更精確,該函式可以保證固定的執行頻率,第一引數的意思是被喚醒的時間,第二個引數的意思是從阻塞態切入ready狀態的時間;

正是有了費執行態(阻塞態和掛起狀態)的存在,再配合任務優先順序,才讓rtos真正的可以執行多工;

FreeRTOS任務執行時間資訊統計

以下兩個函式都是任務執行時間資訊統計函式 include sys.h include delay.h include usart.h include led.h include timer.h include key.h include string.h include freertos.h inc...

FreeRTOS任務執行時間資訊統計

相關巨集的設定 configgenerate run time stats 使能 portconfigure timer for run time stats 配置乙個高精度定時器 計數器提供時基 portget run time counter value 讀取時間值 實驗舉例 char runt...

FreeRTOS的多工處理

1.freertos 多任務排程支援 時間片段,搶占式 和 和做式 任務侁先級可以在排程器啟動後呼叫 vtaskpriorityset api 函式進行修改 任意數量的任務可以共享同乙個優先順序 以保證最大設計彈性。當然,如果需要的話,你也可以為每個任務指定唯一的優先順序 就如同某些排程演算法的要求...