本文根据【FreeRTOS】vTaskDelay()和vTaskDelayUntil()区别-CSDN博客,
理解整理出来,代码贴到下面,自己绘制关系图,方便理解
vTaskDelay()示例程序:
void vTaskDelayExampleTask(void *pvParameters)
{
while(1)
{
// 任务逻辑
vTaskDelay(pdMS_TO_TICKS(500)); // 延时500ms
}
}
vTaskDelayUntill()示例程序:
void vPeriodicTask(void *pvParameters)
{
TickType_t xLastWakeTime;
const TickType_t xFrequency = pdMS_TO_TICKS(1000); // 周期1秒
// 初始化上次唤醒时刻
xLastWakeTime = xTaskGetTickCount();
while(1)
{
// 任务逻辑
vTaskDelayUntil(&xLastWakeTime, xFrequency); // 周期性唤醒
}
}
vTaskDelay()和vTaskDelayUntill()区别在于:vTaskDelay()延时时间未包含线程当前循环任务逻辑,一旦当前循环被更高优先级任务或中断抢占,下一次循环的开始时间会被推迟;
vTaskDelayUntill()延时时间包含了线程当前循环任务逻辑,所以下次循环的开始时间依然固定;
所以需要精确周期性执行的任务,一般使用vTaskDelayUntill(),