目录
一、两个delay函数
1、函数原型
void vTaskDelay( const TickType_t xTicksToDelay ); /* xTicksToDelay: 等待多少给Tick */
BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,
const TickType_t xTimeIncrement );
/* pxPreviousWakeTime: 上一次被唤醒的时间
* xTimeIncrement: 要阻塞到(pxPreviousWakeTime + xTimeIncrement)
* 单位都是Tick Count
*/
2、区别
- vTaskDelay:至少等待指定个数的Tick Interrupt才能变为就绪状态
- vTaskDelayUntil:等待到指定的绝对时刻,才能变为就绪态。
- 使用vTaskDelay(n)时,进入、退出vTaskDelay的时间间隔至少是n个Tick中断
- 使用xTaskDelayUntil(&Pre, n)时,前后两次退出xTaskDelayUntil的时间至少是n个Tick中断
- 退出xTaskDelayUntil时任务就进入的就绪状态,一般都能得到执行机会
- 所以可以使用xTaskDelayUntil来让任务周期性地运行
二、代码示例
void task_delay1(void *param)
{
int num = 0;
for( ;; )
{
sprintf(text,"num:%d",num);
OLED_ShowString(0,0,(uint8_t *)text,16);
num ++;
vTaskDelay(500);
}
}
void task_delay2(void *param)
{
TickType_t t_start = xTaskGetTickCount();
int num = 0;
for( ;; )
{
sprintf(text,"num:%d",num);
OLED_ShowString(0,3,(uint8_t *)text,16);
num ++;
HAL_Delay(300);
vTaskDelayUntil(&t_start,500);
}
}