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 是更好的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/41713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日志自动分析-Web---360星图GoaccessALBAnolog

目录 1、Web-360星图(IIS/Apache/Nginx) 2、Web-GoAccess (任何自定义日志格式字符串) 源码及使用手册 安装goaccess 使用 输出 3-Web-自写脚本(任何自定义日志格式字符串) 4、Web-机器语言analog(任何自定义日…

游戏AI的创造思路-技术基础-强化学习(1)

我们“强化”一下机器的“学习”,让机器变得更强~~~~ 目录 1. 强化学习的定义 2. 发展历史 3. 强化学习的基本概念和函数 3.1. 基本概念和函数 3.1.1. 基本概念和函数 3.1.2. Q函数 3.1.2.1. 定义与作用 3.1.2.2. 数学表示 3.1.2.3. 更新规则 3.1.2.4. 算…

AI时代算法面试:揭秘高频算法问题与解答策略

三种决策树算法的特点和区别 ID3算法:基本的决策树算法,适用于简单的分类问题C4.5算法:改进了ID3算法,适用于更复杂的分类问题,可以处理连续型数据和缺失值CART算法:更加通用的决策树算法,适用于…

云服务器在 Web 应用程序中作用

云服务器在Web应用程序中扮演着至关重要的角色,它不仅是现代Web应用程序的基石,还是推动业务发展和提升用户体验的关键技术之一。下面将详细探讨云服务器在Web应用程序中的重要作用及其优势。 首先,云服务器为Web应用程序提供了高度可扩展的…

【postgresql】索引

见的索引类型: B-tree 索引:这是最常用的索引类型,适用于大多数查询。B-tree索引可以高效地处理范围查询。 Hash 索引:适用于等值查询,但不支持范围查询。 GiST 索引:通用搜索树(GiST&#xf…

Flask自定义命令

Flask自定义命令 一、老版Flask自定义命令 Flask 1.x 和 2.x 版本 在Flask的老版本中,可以通过 flask-script 扩展来添加自定义命令。 安装所需库: pip3 install Flask-Script2.0.3 pip3 install flask1.1.4 pip3 install markupsafe1.1.1在 Flask 应…

怀念旧的Windows声音?以下是如何在Windows 11中恢复它们

如果你渴望旧的Windows声音,希望能在Windows 11上再次听到,那你就很幸运了。我们将向你展示如何下载必要的声音包并创建复古的声音方案。 如何获取旧Windows声音的声音包 你需要做的第一件事是下载一个包含旧Windows版本声音的声音包。此外,请确保它包含的每个声音都是WAV…

在 Vue 项目中使用 FullCalendar

1、先安装依赖包,根据自己的需求安装,建议使用cnpm安装,不然会很慢有时候会出现安装不上的情况。 npm i fullcalendar/vue --save npm i fullcalendar/core --save // 在月视图或日视图中操作事件 npm i fullcalendar/daygrid --save // 在…

记录discuz修改用户的主题出售价格

大家好,我是网创有方的站长,今天遇到了需要修改discuz的主题出售价格。特此记录下 方法很简单: 进入用于组-》选择论坛-》批量修改

【shell编程小项目】

目录 一、项目拓扑二、要求三、shell编程 一、项目拓扑 二、要求 环境准备: 准备两个虚拟机,按照环境配置好对应的 IP 地址和对应的主机名和 SSH 密钥登录在 workstation.exam.com 节点实现如下需求: 1、编写 Shell 脚本,要求代码…

0803实操-Windows Server系统管理

Windows Server系统管理 系统管理与基础配置 查看系统信息、更改计算机名称 网络配置 启用网络发现 Windows启用网络发现是指在网络设置中启用一个功能,该功能允许您的计算机在网络上识别和访问其他设备和计算机。具体来说,启用网络发现后&#xff…

Qt5.9.9 关于界面拖动导致QModbusRTU(QModbusTCP没有测试过)离线的问题

问题锁定 参考网友的思路: Qt5.9 Modbus request timeout 0x5异常解决 网友认为是Qt的bug, 我也认同;网友认为可以更新模块, 我也认同, 我也编译了Qt5.15.0的code并成功安装到Qt5.9.9中进行使用,界面拖…

Laravel文件存储:云端数据管理的艺术

标题:Laravel文件存储:云端数据管理的艺术 Laravel框架提供了一个强大的文件存储抽象层,允许开发者以一致的方式与本地磁盘或云存储服务(如Amazon S3)进行交互。文件存储系统简化了文件上传、下载、移动和删除等操作&…

Java面试之Java多线程常见面试题

1、什么是线程? 定义:线程是程序中的执行路径,是操作系统进行调度的基本单位。它允许程序并发执行多个任务,提高程序的响应速度和资源利用率。 2、为什么需要线程? 1、提高并发性:线程允许程序同时执行多…

Mybatis原生使用

一、MyBatis初次使用 2.1 环境搭建步骤 MyBatis 的 API : https://mybatis.org/mybatis-3/zh/getting-started.html 1.引入依赖包 2.准备核心配置件 db.properties drivercom.mysql.cj.jdbc.Driver urljdbc:mysql://123.57.206.19:3306/demo?useUnicodetrue&am…

如何选择最佳的照片和视频恢复软件

您是否意外从硬盘或 USB 卡中删除了照片或视频?最好的视频和照片恢复软件可以帮到您!如果您一直在寻找最好的照片恢复软件,那么您来对地方了。本文将分享一些帮助您找到最佳视频恢复软件的提示。 重要提示:事实:媒体文…

知识图谱嵌入

文章目录 知识图谱嵌入的概念知识图谱嵌入的优点知识图谱嵌入的主要方法知识图谱嵌入的应用知识图谱嵌入的概念 为了解决前面提到的知识图谱表示的挑战,在词向量的启发下,研究者考虑如何将知识图谱中的实体和关系映射到连续的向量空间,并包含一些语义层面的信息,可以使得在…

【LabVIEW学习篇 - 3】:程序结构——顺序结构、for循环、while循环

文章目录 顺序结构案例一案例二 for循环while循环 顺序结构 LabVIEW中的顺序结构是一种常用的控制结构,用于按顺序执行程序的不同部分。顺序结构在程序中按照从左到右的顺序依次执行各个子结构,类似于传统的文本编程语言中的顺序执行。 案例一 案例一…

JAVA的线性表数据结构的超详解

目录 顺序表的顺序存储结构 1.数组 2.顺序表 顺序表的声明,存储操作以及效率分析 1.泛型类 2.顺序表的插入操作 3. 顺序表的删除操作 4.顺序表查询操作 5.顺序表的应用 线性表的链式存储结构 单链表的基本操作 顺序表的顺序存储结构 数组是实现顺序存储…

随手记录: Ubuntu NVIDIA显卡驱动安装后 屏幕亮度无法调节 无法连接外显示器等问题

背景 一句话:简单记录帮身边人装系统发现 GPU和外接显示器的无法连接,同时亮度无法调节等新问题 设备型号: 联想笔记本:ThinkBook 16p Gen2CPU:AMD Ryzen 7 5800HGPU:RTX 3060 问题描述及流程&#xff…