1. 程式人生 > >FreeRTOS的Task

FreeRTOS的Task

FreeRTOS的Task

1. 任務

任務狀態:

狀態 描述
執行 不解釋
就緒 等待被排程
阻塞 對於排程器不可見,等待某事件完成,否則不能就緒
掛起 對於排程器不可見,只能使用程式主動恢復

阻塞:

可以用來實現阻塞延遲,而不是死迴圈佔據排程資源
(高優先順序的死迴圈會導致低優先順序的任務餓死)

空閒任務:

任務不能都處於阻塞狀態。該狀態下所有的任務都不可執行,也不能被排程器選中(CPU不能空閒)。
當呼叫 vTaskStartScheduler時,排程器會自動建立一個空閒任務。
空閒任務是最低優先順序,不會對其他任務進行干擾。
一旦高優先順序任務進入就緒狀態,空閒任務就會立即退出執行。

空閒任務鉤子函式:

空閒任務每迴圈一次,就自動呼叫一次

功能:

  1. 低優先順序或者後臺需要不停執行的程式碼
  2. 測試系統的處理裕量(檢視處理器有多少富餘的處理時間)
  3. 將處理器配置到低功耗的模式

實現限制:

  1. 不能阻塞或者掛起
  2. 如果vTaskDelete函式被使用,空閒鉤子函式需要儘快返回。
    如果空閒任務一直在鉤子函式中,則無法進行資源回收。

鉤子函式原型:void vApplicationIdleHook(void)

狀態切換圖:

刪除:

使用vTaskDelete函式刪除任務。
需要注意:需要提供給空閒任務一定的執行時間,用來回收記憶體。

排程演算法:

優先順序搶佔式排程:總是高優先順序的任務得到執行。優先順序的選擇需要考慮。

常見Task API:

Task API 功能 函式說明
xTaskCreate 建立一個任務 在FreeRTOS入門.pdf中有詳細說明
vTaskStartScheduler 啟動排程器 開始排程初始化的任務
vTaskDelay 阻塞延遲 任務主動進入阻塞態,從函式呼叫開始,延遲固定時間
vTaskDelayUntil 阻塞延遲 任務主動進入阻塞態,延遲到某一確定時刻
xTaskGetTickCount 獲得當前心跳值 獲取時間,和vTaskDelayUntil搭配使用
vTaskPrioritySet 改變優先順序 在排程器啟動後改變任務的優先順序
uxTaskPriorityGet 獲取優先順序 獲取指定任務的優先順序
vApplicationIdleHook 鉤子函式 鉤子函式的原型
vTaskDelete 刪除任務 刪除自己或者其他任務

程式碼所在位置:source/task.c