一、基本介紹
vTaskDelayUntil函數是一個FreeRTOS系統提供的API,可以用於延遲任務的執行時間。它的作用是讓任務休眠一段指定的時間,然後再繼續執行。
void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, TickType_t xTimeIncrement );
參數說明:
- pxPreviousWakeTime:指向一個變數的指針,該變數的值將被設置為下一次任務必須喚醒的時間。
- xTimeIncrement:用於指定相對於pxPreviousWakeTime要延遲的時間。
二、原理解析
在FreeRTOS系統中,任務的調度機制是基於時間片的。系統會為每個任務維護一個時間片的計數器,當計數器減為0時,系統會將任務掛起,並調度下一個任務。
vTaskDelayUntil函數的作用是讓任務休眠一段指定的時間,而不是等待時間片計數器減為0。
在具體的實現中,vTaskDelayUntil函數會將當前任務的狀態設置為”Delay”,並將任務放入系統的掛起任務列表中。當時間到達時,系統會將任務重新加入就緒任務列表中,等待被調度執行。
三、注意事項
在使用vTaskDelayUntil函數時,需要注意以下幾點:
- 指定pxPreviousWakeTime變數的初始值:在第一次調用vTaskDelayUntil函數時,需要為pxPreviousWakeTime變數設置一個初始值。通常可以使用xTaskGetTickCount函數獲取當前系統時間,作為初始值。
- xTimeIncrement參數的單位:xTimeIncrement參數的單位是tick,一個tick的時長由系統的配置決定。在FreeRTOSConfig.h文件中可以通過configTICK_RATE_HZ宏定義來配置1s中tick的數量。例如,如果將configTICK_RATE_HZ設置為1000,則1個tick的時長就是1ms。
- 避免任務執行時間過長:如果任務的實際執行時間超過了vTaskDelayUntil指定的延遲時間,那麼任務可能會在當前tick的計數器歸0之前就已經執行完畢,從而導致任務一直處於就緒狀態,無法被系統掛起。
四、使用示例
下面是一個使用vTaskDelayUntil函數的例子:
void vTaskFunction( void *pvParameters ) { TickType_t xLastWakeTime; const TickType_t xDelay = pdMS_TO_TICKS( 100 ); for( ;; ) { xLastWakeTime = xTaskGetTickCount(); vTaskDelayUntil( &xLastWakeTime, xDelay ); //任務的實際執行內容 } }
在這個例子中,任務會每隔100ms執行一次。首先調用xTaskGetTickCount函數獲取當前系統時間,並將其賦值給xLastWakeTime變數。然後,調用vTaskDelayUntil函數,將xLastWakeTime和xDelay作為參數傳入。vTaskDelayUntil函數會讓任務休眠一段時間,等待時間到達後重新喚醒任務執行任務的實際內容。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/286513.html