freertos非阻塞式延时
时间: 2024-12-31 16:21:49 浏览: 12
### 实现非阻塞式延时
在 FreeRTOS 中,实现非阻塞式的延时可以通过使用 `vTaskDelay` 或者更精确的 `vTaskDelayUntil` 函数来完成。然而,这些方法本质上都是阻塞式的,因为它们会让调用的任务进入等待状态直到指定的时间过去。
为了真正实现非阻塞式延时,在不阻止当前任务继续执行的情况下处理其他逻辑,可以采用计数器或时间戳的方式配合轮询机制[^2]:
#### 使用时间戳和轮询
通过记录初始时间和目标结束时间,并在一个循环内不断检查当前时间是否达到目标时间,可以在不影响其他操作的前提下实现非阻塞延时效果。
```c
#include "FreeRTOS.h"
#include "task.h"
void NonBlockingDelayExample(void *pvParameters)
{
TickType_t xLastWakeTime;
const TickType_t xFrequency = pdMS_TO_TICKS(100); // 设置延迟周期为 100ms
// 初始化最后一次唤醒时间为当前 tick 计数值
xLastWakeTime = xTaskGetTickCount();
while (true)
{
// 执行一些工作...
// 获取当前 tick 数
TickType_t now = xTaskGetTickCount();
// 如果自上次以来已经过了设定的时间,则更新最后唤醒时间并再次做些事情
if ((now - xLastWakeTime) >= xFrequency)
{
// 更新上一次触发时刻
xLastWakeTime += xFrequency;
// 此处放置每过一段时间要做的动作
// 继续执行其他代码而不被阻塞
}
// 可能还有其他的实时响应需求在此间处理
// 非必要情况下不应主动让出 CPU 控制权给其他同优先级任务
taskYIELD(); // 若确实有需要可考虑此语句使系统更加灵活
}
}
```
这种方法允许任务持续运行而不会因等待特定时间段的到来而暂停其自身的执行流程。需要注意的是,这种方式依赖于系统的 tick interrupt 来提供准确的时间测量基础。
阅读全文