7、vTaskDelay()和vTaskDelayUntil()

一、概述

FreeRTOS提供了两个系统延时函数:相对延时函数vTaskDelay()和绝对延时vTaskDelayUntil()。

这两个延时函数和自己实现的延时函数不同,这两个延时函数一旦被调用,当前任务会立马进入阻塞状态,而自己写的延时函数(以for循环等形式实现的软件延时)会被当做有效任务而一直执行。

  • 相对延时是指每次延时都是从任务执行函数vTaskDelay()开始,延时指定的时间结束;
  • 绝对延时是指每隔指定的时间,执行一次调用vTaskDelayUntil()函数的任务。换句话说:任务以固定的频率执行。

二、vTaskDelay()

调用vTaskDelay()函数后,任务会进入阻塞状态,vTaskDelay()函数的参数xTicksToDelay表示延时多少个系统节拍时钟周期。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskDelay 必须设置成1,此函数才能有效。

vTaskDelay()指定的延时时间是从调用vTaskDelay()后开始计算的相对时间。

比如vTaskDelay(100),那么从调用vTaskDelay()后,任务进入阻塞状态,经过100个系统时钟节拍周期,任务解除阻塞。因此,vTaskDelay()并不适用与周期性执行任务的场合。此外,其它任务和中断活动,会影响到vTaskDelay()的调用(比如调用前高优先级任务抢占了当前任务),因此会影响任务下一次执行的时间。

while(1)
{
    
    
	//执行操作...
	vTaskDelay(1000 / portTICK_RATE_MS);//1000ms后重新执行操作
}

三、vTaskDelayUntil()

API函数vTaskDelayUntil()可用于固定频率的延时,它用来延时一个绝对时间。
在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskDelayUntil 必须设置成1,此函数才有效。

这个函数不同于vTaskDelay()函数的一个重要之处在于:vTaskDelay()指定的延时时间是从调用vTaskDelay()之后(执行完该函数)开始算起的,而vTaskDelayUntil()指定一个绝对时间,每当时间到达,则解除任务阻塞。

TickType_t lasttick;
lasttick = xTaskGetTickCount();  
while(1)
{
    
    
	//执行操作...
	//相对于lasttick 1000ms后重新执行操作
	vTaskDelayUntil(&lasttick, 1000 / portTICK_RATE_MS);
}

四、总结

原型:

void vTaskDelay( const TickType_t xTicksToDelay )

void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement )

**vTaskDelay()**就相当于循环的间隔做某一件事,举个例子:

扫描二维码关注公众号,回复: 14713317 查看本文章

比如你课间休息是10分钟,上节课如果有老师拖堂3分钟的话,第二节课也是需要晚3分钟,这个间隔时间就是vTaskDelay

image-20220829215500208

t1、t3:是开始做某一件事(循环)

t2、t4就是vTaskDelayUntil() 延时的时间

vTaskDelayUntil() 相当于是一个死命令,必须再那个时间开始执行,不管你中途是再干嘛,举个例子:

每天上学都是8点,那么你就不能超过8点去上课,不管你今天下课以后的时间怎么分配,第二天就8点就要上课,8点就是**vTaskDelayUntil()**的时间

image-20220829220330064

T1: vTaskDelayUntil 里面的pxPreviousWakeTime (开始时间)

T2:vTaskDelayUntil 里面的xTimeIncrement(间隔时间)

T3:第二次的开始时间

猜你喜欢

转载自blog.csdn.net/mayuxin1314/article/details/126593752