延时Delay
就是交出CPU一段时间,如果任务一直不延时或者挂起,那么低优先级的任务会无法获得CPU。
FreeRTOS延时的单位是tick,就是调度的基本单位(不是毫秒)
vTaskDelay和vTaskDelayUntil都是延时函数,vTaskDelayUntil是精确延时
函数原型
void vTaskDelay( const TickType_t xTicksToDelay )
void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement )
vTaskDelay
while(1)
{
//执行操作...
vTaskDelay(1000 / portTICK_RATE_MS);//1000ms后重新执行操作
}
vTaskDelayUntil
TickType_t lasttick;
lasttick = xTaskGetTickCount();
while(1)
{
//执行操作...
//相对于lasttick 1000ms后重新执行操作
vTaskDelayUntil(&lasttick, 1000 / portTICK_RATE_MS);
}
vTaskDelayUntil会自动给变量赋值,lasttick 只需要赋值第一次
测试:
//vTaskDelayUntil测试
void delay_test_task(){
TickType_t lasttick = xTaskGetTickCount(); //初值
while(1)
{
printf("----------------------\n");
printf("1.lasttick:%d,\txTaskGetTickCount:%d\n",lasttick,xTaskGetTickCount());
vTaskDelayUntil(&lasttick,100);
printf("2.lasttick:%d,\txTaskGetTickCount:%d\n",lasttick,xTaskGetTickCount());
vTaskDelayUntil(&lasttick,100);
printf("3.lasttick:%d,\txTaskGetTickCount:%d\n",lasttick,xTaskGetTickCount());
vTaskDelayUntil(&lasttick,200);
printf("4.lasttick:%d,\txTaskGetTickCount:%d\n",lasttick,xTaskGetTickCount());
}
}