lkl0305

FreeRTOS中vTaskDelay和vTaskDelayUntil

0
阅读(10848)

在FreeRTOS实时系统中,我们使用简单的延时功能时,尽量不要使用自己写的软件延时,那样的话,会使CPU一直在执行延时程序,而无法在延时时执行其它任务。

在freeRTOS系统中,一般延时可以使用vTaskDelay和vTaskDelayUntil延时函数,这样在延时过程中,本任务处于阻塞,而有时间执行其它任务!

这两个函数主要的区别一般可以认为在周期性任务中vTaskDelayUntil函数要比vTaskDelay更加精确。

1、vTaskDelay任务延时

void vTaskDelay( portTickType xTicksToDelay )

(1)portTickType xTicksToDelay时间数量,任务延时多长时间。通常使用portTICK_RATE_MS将MS时间转换为心跳周期。

(2)vTaskDelay()指定的延时量是相对于当前调用vTaskDelay()这个函数的时刻而言的,因此,它不能保证一个周期性任务的频率。

2、vTaskDelayUntil任务延时到指定时间

void vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTimeIncrement )

(1)portTickType *pxPreviousWakeTime, 指定一个变量来掌握任务最后开启的时间, 第一次使用时必须使用当前时间来初始化, 在vTaskDelayUntil中,这个变量是自动修改的。

(2)portTickType xTimeIncrement 循环周期时间。

(3)vTaskDelayUntil是以任务本次唤醒时刻开始的,任务将在一定时间开启(*pxPreviousWakeTime + xTimeIncrement)。使用相同的xTimeIncrement参数 值来调用 vTaskDelayUntil()将使任务按固定的周期执行。

综上所述,vTaskDelayUntil函数比vTaskDelay函数多了一个记录任务本次被唤醒的时刻的变量,因此如果想要实现控制任务能够周期性运行的话,vTaskDelayUntil函数是一种比较简单的方法。