FreeRTOS學習筆記 (三)-時間管理vTaskDelay()及vTaskDelayUntil()
FreeRTOS任務中,在函數中使用延時函數就會讓任務進入阻塞狀態(block),
通常使用vTaskDelay()及vTaskDelayUntil()。
通常使用vTaskDelay()及vTaskDelayUntil()。
-vTaskDelay()為相對延時
-vTaskDelayUntil()為絕對延時
要使用則在FreeRTOSConfig.h中必須定義:
#define INCLUDE_vTaskDelay 1
#define INCLUDE_pcTaskGetTaskName 1--------------------------------------------------------
1.vTaskDelay()
其原型為:
void vTaskDelay( const TickType_t xTicksToDelay )
-參數: const TickType_t xTicksToDelay
如果直接給數值,如vTaskDelay(100),則表示暫停100個ticks,由於每個MCU的Ticks不同,FreeRTOS提供了
#define portTICK_RATE_MS portTICK_PERIOD_MS
#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
幫我們轉為ms,故vTaskDelay(100)就是讓任務暫停100ms
2.vTaskDelayUntil()
其原型為:
void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement )
使用範例:
// Perform an action every 10 ticks.
void vTaskFunction( void * pvParameters )
{
TickType_t xLastWakeTime;
const TickType_t xFrequency = 10;
// Initialise the xLastWakeTime variable with the current time.
xLastWakeTime = xTaskGetTickCount();
for( ;; )
{
// Wait for the next cycle.
vTaskDelayUntil( &xLastWakeTime, xFrequency );
// Perform action here.
}
}
留言
張貼留言