FreeRTOS 常用函式——任務相關
阿新 • • 發佈:2018-12-17
portBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode ,
const signed portCHAR * const pcName ,
unsigned portSHORT usStackDepth ,
void *pvParameters,
unsigned portBASE_TYPE uxPriority ,
xTaskHandle *pxCreatedTask );
引數名 | 描述 |
---|---|
pvTaskCode | 一個指向任務的實現函式的指標(效果上僅僅是函式名)。 |
pcName | 具有描述性的任務名,這個引數不會被 FreeRTOS 使用,其作用只是單純地用於輔助除錯。 |
usStackDepth | 核心為任務分配的棧空間大小,以位寬為單位。比如說,在32位寬的棧空間,傳入引數為100,則將會分配400位元組的棧空間(100*4 Bytes)。 |
pvParameters | 一個指向 void 的指標(void*),用來將引數傳遞到任務中。 |
uxPriority | 指定任務執行的優先順序,取值範圍可以從最低優先順序0到最高優先順序(configMAX_PRIORITIES–1)。 |
pxCreatedTask | 傳出任務的控制代碼,用於改變任務優先順序、刪除任務。如果應用程式中不會用到這個任務的控制代碼,則可以被設為 NULL。 |
返回值 | 有兩個可能的返回值:1. pdTRUE,表明任務建立成功。2. errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY,由於記憶體堆空間不足, FreeRTOS 無法分配足夠的空間來儲存任務結構資料和任務棧,因此無法建立任務。 |
void vTaskDelay( portTickType xTicksToDelay );
引數名 | 描述 |
---|---|
xTicksToDelay | 延遲多少個心跳週期。可以用常數 portTICK_RATE_MS 來將以毫秒為單位的時間值轉換為以心跳週期為單位的時間值。 |
從任務離開阻塞態進入就緒態那一刻的精確心跳計數值開始進行延時,使得任務以固定頻率週期性執行。比呼叫 vTaskDelay()可以實現更精確的週期性。
void vTaskDelayUntil( portTickType * pxPreviousWakeTime , portTickType xTimeIncrement );
引數名 | 描述 |
---|---|
pxPreviousWakeTime | 儲存了任務上一次離開阻塞態(被喚醒)的時刻,用來計算該任務下一次離開阻塞態的時刻。 |
xTimeIncrement | 用於實現任務以固定頻率週期性執行,可以用常數 portTICK_RATE_MS 來將以毫秒為單位的時間值轉換為以心跳週期為單位的時間值。 |
空閒任務鉤子函式會被空閒任務每迴圈一次就自動呼叫一次。
通常空閒任務鉤子函式被用於:
- 執行低優先順序、後臺或需要不停處理的功能程式碼。
- 測試處系統處理裕量(空閒任務只會在所有其它任務都不執行時才有機會執行,所以測量出空閒任務佔用的處理時間就可以清楚的知道系統有多少富餘的處理時間)。
- 將處理器配置到低功耗模式——提供一種自動省電方法,使得在沒有任何應用功能需要處理的時候,系統自動進入省電模式。
空閒任務鉤子函式必須遵從以下規則:
- 絕不能阻塞或掛起。空閒任務只會在其它任務都不執行時才會被執行(除非有應用任務共享空閒任務優先順序)。以任何方式阻塞空閒任務都可能導致沒有任務能夠進入執行態!
- 如果應用程式用到了 vTaskDelete(),則空閒鉤子函式必須能夠儘快返回。因為在任務被刪除後,空閒任務負責回收核心資源。如果空閒任務一直執行在鉤子函式中,則無法進行回收工作。
void vApplicationIdleHook( void );
用於在排程器啟動後改變任何任務的優先順序。
void vTaskPrioritySet( xTaskHandle pxTask , unsigned portBASE_TYPE uxNewPriority );
引數名 | 描述 |
---|---|
pxTask | 被修改優先順序的任務控制代碼(即目標任務),可以通過傳入 NULL 值來修改自己的優先順序。 |
uxNewPriority | 目標任務將被設定到哪個優先順序上。 |
用於查詢一個任務的優先順序。
unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );
引數名 | 描述 |
---|---|
pxTask | 被查詢任務的控制代碼(目標任務) ,可以通過傳入 NULL 值來查詢自己的優先順序。 |
返回值 | 被查詢任務的當前優先順序。 |
用於刪除自己或其它任務。
任務被刪除後就不復存在,也不會再進入執行態。
空閒任務的責任是要將分配給已刪除任務的記憶體釋放掉。因此有一點很重要,那就是使用 vTaskDelete() API 函式的任務千萬不能把空閒任務的執行時間餓死。
void vTaskDelete( xTaskHandle pxTaskToDelete );
引數名 | 描述 |
---|---|
pxTaskToDelete | 被刪除任務的控制代碼(目標任務),可以通過傳入 NULL 值來刪除自己。 |