首页 > 其他分享 >FreeRTOS中vTaskDelay 和 xTaskDelayUntil 的区别?

FreeRTOS中vTaskDelay 和 xTaskDelayUntil 的区别?

时间:2024-07-06 09:59:23浏览次数:22  
标签:FreeRTOS xTaskDelayUntil vTaskDelay 任务 延迟时间 时间 延迟

  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 个 ticks
        vTaskDelay(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 是更好的选择。

标签:FreeRTOS,xTaskDelayUntil,vTaskDelay,任务,延迟时间,时间,延迟
From: https://blog.csdn.net/weixin_49007164/article/details/140160653

相关文章

  • 【嵌入式——FreeRTOS】任务通知
    【嵌入式——FreeRTOS】任务通知简介任务通知值的更新方式任务通知优势任务通知劣势任务通知值和通知状态任务通知值的类型任务通知状态相关API发送通知相关API函数接收通知相关API任务通知模拟二值信号量代码示例任务通知模拟消息邮箱代码示例任务通知模拟事件标志组......
  • FreeRTOS之队列上锁和解锁(详解)
     这篇文章将记录我学习实时操作系统FreeRTOS的队列上锁和解锁的知识,在此分享给大家,希望我的分享能给你带来不一样的收获!目录一、简介 二、队列上锁函数prvLockQueue()1、函数初探2、应用示例  三、队列解锁函数prvUnLockQueue() 1、函数初探及详细注释详细注释解......
  • FreeRTOS移植到STM32
    本内容主要是讲解关于如果把FreeRTOS移植到STM32中去的操作。明白各部分的作用以及打通思路,具体操作按照下列进行相应的操作。第一:早一个STM32的裸机程序我们这里用的是STM32F103的芯片为例。 二、去官网上下载FreeRTOSV9.0.0源码在移植之前,我们首先要获取到......
  • FreeRTOS静态创建任务分析
    #defineconfigSUPPORT_STATIC_ALLOCATION        1  设置了静态创建任务需要重新定义这2个函数,由程序员进行分配任务空间(空闲任务)(定时任务)在调度器里被使用这2个函数空闲任务定时任务定义空闲分配空间函数和定时分配空间函数静态创建任务内部......
  • 【FreeRTOS】两个Delay函数
    目录0前言1Delay函数1.1两个Delay函数1.2总结2程序2.1函数修改2.2总结0前言在我们实际开发过程中,一般都用事件开发不要使用死循环1Delay函数1.1两个Delay函数FreeRTOS中有两个Delay函数:vTaskDelay:至少等待指定个数的TickInterrupt才能变为就绪......
  • QEMU专栏 - 使用 QEMU 调试 FreeRTOS示例
    写在最前这几天一直在研究QEMU中多核ARM加载不同镜像的问题,一直不得其解,这部分后续可以分几个不分拆解下,看看为什么会出现这种问题.今天先来看看如何使用QEMU来调试FreeRTOS的示例代码.编译并运行FreeRTOS示例代码(基础版本)首先是下载代码,这种只需要看最新代......
  • RTX5全家桶源码综合模板发布,含FreeRTOS内核版本,将其打造成直接面向实际项目应用的综合
    【说明】1、RTX5全家桶的优势就是简单易用,初学的话,上手很快,稳定性也是杠杠的,且容易做稳定。2、同时RTX5也是有汽车级,工业级,医疗和铁路安全认证,只是安全级别比ThreadX要稍微低些。3、当前RTX5中间件源码已经开源了,大大方便大家问题的排查。同时提供了FreeRTOS内核版本,方便大家选......
  • FreeRTOS 简单内核实现8 时间片轮询
    0、思考与回答0.1、思考一为什么要增加时间片轮询?目前的RTOS内核已经支持抢占优先级,即高优先级的任务会抢占低优先级的任务得到执行,但是对于同等优先级的任务,如果不支持时间片轮询,则只能有一个任务运行,并且由于优先级相同所以除延时阻塞到期外也不会发生任务调度,因此需要增加......
  • FreeRTOS 体验教程:3.如何用互斥量实现FreeRTOS多线程访问共享资源?
    FreeRTOS互斥量使用教程互斥量(Mutex)是一种特殊的信号量,用于管理对共享资源的访问。在FreeRTOS中,互斥量的句柄类型依然是xSemaphoreHandle。本文将详细介绍如何在FreeRTOS中创建和使用互斥量,并通过实例展示其运行效果。1.创建互斥量在FreeRTOS中,创建互斥量非常简......
  • FreeRTOS简单内核实现6 优先级
    0、思考与回答0.1、思考一如何实现RTOS内核支持多优先级?因为不支持优先级,所以所有的任务都插入了一个名为pxReadyTasksLists的就绪链表中,相当于所有任务的优先级都是一致的,那如果我们创建一个就绪链表数组,数组下标代表优先级,优先级为x的任务就插入到pxReadyTasksLists[x......