欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > FreeRTOS中vTaskDelay 和 xTaskDelayUntil 的区别?

FreeRTOS中vTaskDelay 和 xTaskDelayUntil 的区别?

2024/10/26 5:31:40 来源:https://blog.csdn.net/weixin_49007164/article/details/140160653  浏览:    关键词:FreeRTOS中vTaskDelay 和 xTaskDelayUntil 的区别?

  vTaskDelayxTaskDelayUntil 是 FreeRTOS 提供的两种不同任务延迟函数,各自有其适用的场景和优缺点。vTaskDelay 适用于简单的延迟操作,而 xTaskDelayUntil 提供了精确的周期控制能力。在设计 FreeRTOS 应用程序时,根据任务的时间要求选择合适的延迟机制,将有助于优化系统性能和实现目标。

1. vTaskDelay

功能与实现

  vTaskDelay 是 FreeRTOS 提供的标准任务延迟函数,用于使当前任务进入阻塞状态一段时间。调用 vTaskDelay 后,当前任务将进入阻塞状态,等待指定的时间到达后重新进入就绪状态,从而允许其他任务获得 CPU 执行机会。

语法
void vTaskDelay(const TickType_t xTicksToDelay);

  xTicksToDelay:延迟的时间长度,以系统时钟节拍 (ticks) 为单位。

使用示例
void vATask(void *pvParameters)
{for( ;; ){// 执行任务的操作// ...// 延迟 1000 个 ticksvTaskDelay(pdMS_TO_TICKS(1000));}
}

在上面的示例中,vATask 每次循环时会延迟 1000 个时钟节拍,从而为其他任务提供运行时间。

优缺点
  • 优点:简单易用,适用于不需要精确调度的延迟。
  • 缺点:延迟时间是相对的(从调用时开始计算),在调度中容易受其他任务执行时间的影响,不适合需要精确周期的任务。

2. xTaskDelayUntil

功能与实现

  xTaskDelayUntil 提供了一种相对精确的延迟机制。与 vTaskDelay 不同,它确保任务每隔固定时间段运行一次,不受其他任务执行时间的影响。这对需要周期性且精确调度的任务特别有用。

语法
BaseType_t xTaskDelayUntil(TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement);
  • pxPreviousWakeTime:一个保存上一次唤醒时间的变量的指针。
  • xTimeIncrement:下一次唤醒时间与上一次唤醒时间之间的时间增量,以系统时钟节拍 (ticks) 为单位。
使用示例
void vBTask(void *pvParameters)
{TickType_t xLastWakeTime;const TickType_t xFrequency = pdMS_TO_TICKS(1000);// 初始化 xLastWakeTime 变量xLastWakeTime = xTaskGetTickCount();for( ;; ){// 执行任务的操作// ...// 等待下一个周期vTaskDelayUntil( &xLastWakeTime, xFrequency );}
}

        在这个示例中,vBTask 在每次循环时将精确地延迟 1000 个时钟节拍,无论其他任务的执行情况如何,都能保证固定周期运行。

优缺点
  • 优点:提供精确的周期调度,适用于需要严格时间控制的任务。
  • 缺点:相对复杂,需要维护上一次唤醒时间变量。

区别总结

  1. 延迟时间起点

    • vTaskDelay:延迟时间是从调用时刻开始计算的。
    • xTaskDelayUntil:延迟时间是基于上次唤醒时间,确保任务以固定周期运行。
  2. 精确度

    • vTaskDelay:由于延迟时间相对,容易受其他任务执行时间的影响,不适合需要精确周期的任务。
    • xTaskDelayUntil:提供了更高的时间精确度,适用于周期性任务。
  3. 使用场景

    • vTaskDelay:适合简单的延迟场景,比如需要在任务中添加一些等待时间。
    • xTaskDelayUntil:适合周期性任务,比如需要以固定时间间隔采集传感器数据的任务。

实践中的应用

        选择适当的延迟函数取决于具体的任务需求和系统设计。在实际应用中,开发者需要权衡任务的精度需求和实现复杂度:

  1. 对于任务执行时间不敏感的场景,可以优先使用 vTaskDelay 来简化实现。
  2. 对于要求严格时间控制的场景,例如实时采集数据、固定周期的控制任务等,xTaskDelayUntil 是更好的选择。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com