【FreeRTOS】两个Delay函数

0 前言

  • 在我们实际开发过程中,一般都用事件开发

  • 不要使用死循环


1 Delay函数

1.1 两个Delay函数

FreeRTOS中有两个Delay函数

  • vTaskDelay至少等待指定个数的Tick Interrupt才能变为就绪状态。
  • vTaskDelayUntil等待到指定的绝对时刻,才能变为就绪态。

这2个函数原型如下:

void vTaskDelay( const TickType_t xTicksToDelay ); /* xTicksToDelay: 等待多少给Tick */

/* pxPreviousWakeTime: 上一次被唤醒的时间
 * xTimeIncrement: 要阻塞到(pxPreviousWakeTime + xTimeIncrement)
 * 单位都是Tick Count
 */
BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,
                            const TickType_t xTimeIncrement );

下面画图说明:

Tick中断如下:这里使用vTaskDelay(5)的话,就会等待5个Tick中断,任务再次变成就绪态
在这里插入图片描述
如果等到了5个Tick中断,并且查看现在有没有同级别的或者更高优先级的任务,如果没有的话,就会立刻执行这个任务。


现在假设我们运行的任务是这样的

while(1)
{
   
   
	do_sth();		//这段代码执行的时间长度每次都不相同,假设是1ms、10ms、5ms
	vTaskDelay(5);	//延时5ms
}

每次执行do_sth();这段代码执行的时间长度每次都不相同,假设是1ms、10ms、5ms

在这里插入图片描述
实际的运行流程:

  • 先运行1ms的do_sth();,再允许5ms的延时,再运行10ms的do_sth();,再运行5ms的延时,再运行5ms的do_sth();

流程如下图:
在这里插入图片描述

  • vTaskDelay(5);这个函数运行时间大于等于5个Tick

如果想让这个函数周期运行的话,他们的间隔都是同样一段时间,如下图:

在这里插入图片描述
这时候就需要使用领一个函数

BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement );

现在的运行流程就是,先记录Tick的时刻preTime=T1,然后运行do_sth(),直到运行到T1+15=T2这个时刻

运行到T2时刻,需要做什么呢?

  1. 更新preTime = T2
### FreeRTOS 延时函数的使用方法 #### vTaskDelay 的使用 `vTaskDelay()` 是一个基于相对时间的延时函数,用于使任务进入阻塞状态一段时间后再恢复到就绪态。其函数原型如下: ```c void vTaskDelay(const TickType_t xTicksToDelay); ``` 参数 `xTicksToDelay` 表示任务需要延迟的 Tick 数量[^2]。 下面是一个简单的例子来展示如何使用 `vTaskDelay()` 实现任务延时: ```c #include "FreeRTOS.h" #include "task.h" void vATask(void *pvParameters) { while (1) { // 执行一些操作... // 让任务休眠 500ms vTaskDelay(pdMS_TO_TICKS(500)); } } ``` 在这个例子中,任务每隔 500 毫秒会调用一次 `vTaskDelay()` 进入阻塞状态。 --- #### xTaskDelayUntil 的使用 `xTaskDelayUntil()` 则是一种基于绝对时间的延时函数,适用于周期性任务。它的函数原型为: ```c void xTaskDelayUntil(TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement); ``` 其中: - `*pxPreviousWakeTime` 存储上一次唤醒时刻的时间戳; - `xTimeIncrement` 定义两次连续运行之间的间隔时间。 以下是使用 `xTaskDelayUntil()` 的示例代码: ```c #include "FreeRTOS.h" #include "task.h" void vBTask(void *pvParameters) { TickType_t xLastWakeTime; // 初始化上次唤醒时间为当前时间 xLastWakeTime = xTaskGetTickCount(); while (1) { // 执行某些操作... // 设置下次唤醒时间为 1 秒之后 xTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(1000)); } } ``` 在此示例中,无论任务执行所需的实际时间是多少,该任务都会严格保持每秒钟运行一次的任务调度[^1]。 --- #### 总结对比 - **vTaskDelay**: 更适合于不关心精确定时的情况,仅需让任务暂停一段固定时间即可。 - **xTaskDelayUntil**: 非常适配那些有严格的周期需求的应用场景,能够确保每次触发都发生在固定的绝对时间点上[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北国无红豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值