文章目录
-
- 一、概述
- 二、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()的调用(比如调用前高优先级任务抢占了当前任务),因此会影响任务下一次执行的时间。
三、vTaskDelayUntil()
API函数vTaskDelayUntil()可用于固定频率的延时,它用来延时一个绝对时间。
在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskDelayUntil 必须设置成1,此函数才有效。
这个函数不同于vTaskDelay()函数的一个重要之处在于:vTaskDelay()指定的延时时间是从调用vTaskDelay()之后(执行完该函数)开始算起的,而vTaskDelayUntil()指定一个绝对时间,每当时间到达,则解除任务阻塞。
四、总结
原型:
**vTaskDelay()**就相当于循环的间隔做某一件事,举个例子:
比如你课间休息是10分钟,上节课如果有老师拖堂3分钟的话,第二节课也是需要晚3分钟,这个间隔时间就是vTaskDelay
T1: vTaskDelayUntil 里面的pxPreviousWakeTime (开始时间)
T2:vTaskDelayUntil 里面的xTimeIncrement(间隔时间)
T3:第二次的开始时间
文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览114350 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!