FreeRTOS的Task
阿新 • • 發佈:2018-11-23
FreeRTOS的Task
1. 任務
任務狀態:
狀態 | 描述 |
---|---|
執行 | 不解釋 |
就緒 | 等待被排程 |
阻塞 | 對於排程器不可見,等待某事件完成,否則不能就緒 |
掛起 | 對於排程器不可見,只能使用程式主動恢復 |
阻塞:
可以用來實現阻塞延遲,而不是死迴圈佔據排程資源
(高優先順序的死迴圈會導致低優先順序的任務餓死)
空閒任務:
任務不能都處於阻塞狀態。該狀態下所有的任務都不可執行,也不能被排程器選中(CPU不能空閒)。
當呼叫 vTaskStartScheduler時,排程器會自動建立一個空閒任務。
空閒任務是最低優先順序,不會對其他任務進行干擾。
一旦高優先順序任務進入就緒狀態,空閒任務就會立即退出執行。
空閒任務鉤子函式:
空閒任務每迴圈一次,就自動呼叫一次
功能:
- 低優先順序或者後臺需要不停執行的程式碼
- 測試系統的處理裕量(檢視處理器有多少富餘的處理時間)
- 將處理器配置到低功耗的模式
實現限制:
- 不能阻塞或者掛起
- 如果vTaskDelete函式被使用,空閒鉤子函式需要儘快返回。
如果空閒任務一直在鉤子函式中,則無法進行資源回收。
鉤子函式原型:void vApplicationIdleHook(void)
狀態切換圖:
刪除:
使用vTaskDelete函式刪除任務。
需要注意:需要提供給空閒任務一定的執行時間,用來回收記憶體。
排程演算法:
優先順序搶佔式排程:總是高優先順序的任務得到執行。優先順序的選擇需要考慮。
常見Task API:
Task API | 功能 | 函式說明 |
---|---|---|
xTaskCreate | 建立一個任務 | 在FreeRTOS入門.pdf中有詳細說明 |
vTaskStartScheduler | 啟動排程器 | 開始排程初始化的任務 |
vTaskDelay | 阻塞延遲 | 任務主動進入阻塞態,從函式呼叫開始,延遲固定時間 |
vTaskDelayUntil | 阻塞延遲 | 任務主動進入阻塞態,延遲到某一確定時刻 |
xTaskGetTickCount | 獲得當前心跳值 | 獲取時間,和vTaskDelayUntil搭配使用 |
vTaskPrioritySet | 改變優先順序 | 在排程器啟動後改變任務的優先順序 |
uxTaskPriorityGet | 獲取優先順序 | 獲取指定任務的優先順序 |
vApplicationIdleHook | 鉤子函式 | 鉤子函式的原型 |
vTaskDelete | 刪除任務 | 刪除自己或者其他任務 |
程式碼所在位置:source/task.c