FreeRTOS 时间管理
延时函数介绍
| 函数 | 描述 |
| vTaskDelay() | 相对延时 |
| xTaskDelayUntil() | 绝对延时 |
相对延时:指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间结束
绝对延时:指将整个任务的运行周期看成一个整体,适用于需要按照一定频率运行的任务

- 为任务主体,也就是任务真正要做的工作
- 是任务函数中调用vTaskDelayUntil()对任务进行延时
- 为其他任务在运行
vTaskDelay()
函数 vTaskDelay() 用于对任务进行延时,延时的时间单位为系统时钟节拍,使用函数,需要的 FreeRTOSConfig.h 文件中将配置项 INCLUDE_vTaskDelay 配置为 1。
void vTaskDelay(const TickType_t xTicksToDelay);
函数用于使任务进入阻塞状态,以实现延时功能。延时的时间以 FreeRTOS 的时钟节拍为单位。 指每次延时都是从执行函数 vTaskDelay() 开始,直到延时指定的时间(参数:滴答值)结束。
参数 xTicksToDelay 用于设置延迟的时钟节拍个数,范围 1- 0xFFFFFFFF。
在使用此函数进行任务延时时,如果传入的参数为 0,那表明不进行任务延时,而是强制进行一次任务切换。
void vTaskDelay( const TickType_t xTicksToDelay )
{BaseType_t xAlreadyYielded = pdFALSE;/* 只有在延时时间大于 0 的时候,才需要进行任务阻塞,* 否则相当于强制进行任务切换,而不阻塞任务*/if( xTicksToDelay > ( TickType_t ) 0U ){configASSERT( uxSchedulerSuspended == 0 );/* 挂起任务调度器 */vTaskSuspendAll();{/* 用于调试,不用理会 */traceTASK_DELAY();/* 将任务添加到阻塞态任务列表中 */prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE );}/* 恢复任务调度器运行,调用此函数会返回是否需要进行任务切换*/xAlreadyYielded = xTaskResumeAll();}else{mtCOVERAGE_TEST_MARKER();}/* 根据标志进行任务切换 */if( xAlreadyYielded == pdFALSE ){portYIELD_WITHIN_API();}else{mtCOVERAGE_TEST_MARKER();}
}
xTaskDelayUntil()
函数 xTaskDelayUntil() 用于对任务进行绝对延时,延时的时间单位为系统时钟节拍,使用需要在 FreeRTOSConfig.h 文件中将配置项 INCLUDE_vTaskDelayUntil 配置为 1。
BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,const TickType_t xTimeIncrement );
函数描述:函数 vTaskDelayUntil 用于周期性延迟。 属于绝对延时,指间隔指定的时间(参数:滴答值),执行一次调用 vTaskDelayUntil() 函数的任务。
| 参数 | 说明 |
| pxPreviousWakeTime | 存储任务最后一次解除阻塞的时间 |
| xTimeIncrement | 周期性延迟时间 |
| 返回值 | BaseType_t |
| pdTRUE | 操作成功 |
| pdFALSE | 操作失败 |
#if ( INCLUDE_xTaskDelayUntil == 1 )
BaseType_t xTaskDelayUntil(TickType_t * const pxPreviousWakeTime, /*上一次阻塞超时时间*/const TickType_t xTimeIncrement ) /*延时的时间*/
{TickType_t xTimeToWake;BaseType_t xAlreadyYielded, xShouldDelay = pdFALSE;configASSERT( pxPreviousWakeTime );configASSERT( ( xTimeIncrement > 0U ) );configASSERT( uxSchedulerSuspended == 0 );/* 挂起任务调度器 */vTaskSuspendAll();{const TickType_t xConstTickCount = xTickCount;/* 计算任务下一次阻塞超时的时间,* 这个阻塞超时时间是相对于上一次阻塞超时的时间的*/xTimeToWake = *pxPreviousWakeTime + xTimeIncrement/* 如果在上一次阻塞超时后,* 系统时钟节拍计数器溢出过*/if( xConstTickCount < *pxPreviousWakeTime ){/* 只有在下一次阻塞超时时间也溢出,* 并且下一次阻塞超时时间大于系统时钟节拍计数器的值时,* 需要做相应的溢出处理,否则就好像没有溢出*/if( ( xTimeToWake < *pxPreviousWakeTime ) &&( xTimeToWake > xConstTickCount ) ){xShouldDelay = pdTRUE;/* 标记因为溢出,需要做相应的处理 */}else{mtCOVERAGE_TEST_MARKER();}}else{/* 系统时钟节拍计数器没有溢出,* 但是下一次阻塞超时时间溢出了,* 并且下一次阻塞超时时间大于系统时钟节拍计数器的值时,* 需要做相应的溢出处理*/if( ( xTimeToWake < *pxPreviousWakeTime ) ||( xTimeToWake > xConstTickCount ) ){ xShouldDelay = pdTRUE; /* 标记因为溢出,需要做相应的溢出处理 */}else{mtCOVERAGE_TEST_MARKER();}}/* 更新上一次阻塞超时时间为下一次阻塞超时时间 */*pxPreviousWakeTime = xTimeToWake;/* 根据标记,做相应的溢出处理 */if( xShouldDelay != pdFALSE ){/* 用于调试,不用理会 */traceTASK_DELAY_UNTIL( xTimeToWake );/* 将任务添加到阻塞态任务列表中 */prvAddCurrentTaskToDelayedList( xTimeToWake - xConstTickCount,pdFALSE );}else{mtCOVERAGE_TEST_MARKER();}}/* 恢复任务调度器运行,* 调用此函数会返回是否需要进行任务切换*/xAlreadyYielded = xTaskResumeAll();/* 根据标志进行任务切换 */if( xAlreadyYielded == pdFALSE ){portYIELD_WITHIN_API();}else{mtCOVERAGE_TEST_MARKER();} return xShouldDelay;
}
#endif /* INCLUDE_xTaskDelayUntil */
不知道你们有没有想过为什么是 xTaskDelayUntil() 而不是 vTaskDelayUntil(),我在tasks.c文件中找到
延时函数演示实验
学习 FreeRTOS 相对延时和绝对延时API 函数的使用,并了解其区别
实验设计:
将设计三个任务:start_task、task1、task2
三个任务的功能如下:
- start_task:用来创建其他的2个任务
- task1:用于展示相对延时函数vTaskDelay ( )的使用
- task2:用于展示绝对延时函数vTaskDelayUntil( )的使用
其他部分代码如有需要可参考上一篇博文
FreeRTOS 任务相关API函数
//用于展示相对延时函数vTaskDelay ( )的使用
void task1(void * pvParameters)
{while(1){LED0_TOGGLE();delay_ms(10);vTaskDelay(500);}}//用于展示绝对延时函数vTaskDelayUntil( )的使用
void task2(void * pvParameters)
{TickType_t xLastWakeTime = xTaskGetTickCount();while(1){LED1_TOGGLE(); delay_ms(10);xTaskDelayUntil(&xLastWakeTime,500);}
}
现象

注意:
可能会出现任务一在延时时,任务2在运行,但是在任务1解除延时时候任务2刚好在死延时,因为优先级原因所以任务1运行不了代表任务1不止延时了510ms。
相关文章:
FreeRTOS 时间管理
延时函数介绍 函数 描述 vTaskDelay() 相对延时 xTaskDelayUntil() 绝对延时 相对延时:指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间结束 绝对延时:指将整个任务的运行周期看成一个整体,适用于需要按…...
F. Valuable Cards D. Smithing Skill
D题 F题 F题: 因为是连续的且都要选,我们直接从左到右去取每个区间到不合法的情况即可,可以在n1的位置添加一个x来结束区间判断。因为是要乘积为x,那么我们只需要放x的因子进去,不然会超时,同时也可以用v…...
【电子通识】IPC-A-600中对验收标准的定义
在文章【电子通识】IPC-A-610标准对产品的四种验收条件都是什么意思?中我们讲到IPC-A-610标准(电子组件的可接受性)对于产品的四种验收条件。本文中我们同理讲一讲IPC-A-600中对验收标准的定义。 IPC-A-600文件中的多数示意图和照片同时表示每…...
MyBatis(初阶)
1.什么是MyBtis MyBatis是持久层框架,⽤于简化JDBC的开发。 2.准备工作 2.1 创建⼯程 数据库: 2.2 配置数据库连接字符串 以application.yml⽂件为例: 2.3 写持久层代码 Data public class UserInfo {private Integer id;private String username;private Stri…...
KDP数据平台:以实战案例验证技术领先力
本文由智领云 LeetTools 工具自动生成 申请试用: https://www.leettools.com/feedback/ 在当今快速发展的技术环境中,数据平台的选择对企业的数字化转型和业务发展至关重要。智领云开源KDP(Kubernetes Data Platform)在数据处理和…...
[Linux] 什么是 Shell?
一、什么是 shell ? shell在英语中的意思就是外壳,所以我们习惯称shell程序为壳程序。那为什么又会被叫做壳程序呢?那是因为shell程序是在内核上面的,属于操作系统的外壳部分,因此我们就称之为壳程序(shell)。 在 Linux 中&#…...
大模型学习应用 2:快速上手大模型基于langchain实现RAG检索应用
快速上手大模型基于langchain实现RAG检索应用 - 项目作业 目录 准备工作镜像选择算力选择安装包数据说明提示参考链接 Task1 申请 api 后,使用 langchain 导入大模型,并打印出大模型信息Task2 使用 langchian 加载数据,并把数据打印出来Task…...
python环境安装之后,cmd输入python回车会打开微软商店
坑爹!python环境安装之后,cmd输入python回车会打开微软商店 最近发现,安装python环境成功之后,可能会出现cmd输入python验证是否安装成功老会打开微软商店! 解决,打开系统环境配置,找到刚安装…...
USB Type-C如何取9V、12V、15V、20V电压-PD快充协议芯片ECP5701
相信大家在生活中也发现了,现在越来越多的设备都改用这种type-C接口的母座进行取电了。 因为欧盟决议 :自2024年起部分消费电子产品必须提供单一的USB-C充电接口。 那么这种type-C接口相比之前的Micro-B接口有着一个很大的优势就是可以有更高的电压&…...
Go 语言 Map 17
Go 语言提供了一个强大的 Map 结构体,用于存储键值对。Map 可以用来存储数据,快速查找和修改数据。下面是 Go 语言 Map 的使用教程。 什么是 Map? Map 是一个键值对的集合,它可以存储任意类型的键和值。Map 中的每个键都是唯一的…...
移植bash到openharmony
1.交叉工具链 下载地址: http://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist 进入ohos-sdk-full,下载一个sdk版本,这里下载的版本是version-Master_Version-OpenHarmony_5.0.0.35-20240805_020232-ohos-sdk-full.tar.gz。 解…...
git stash详细教程
git stash详细教程 基本命令: git stash: 保存当前未提交的更改,并恢复到干净的工作目录。git stash list: 列出所有的 stash。git stash show: 显示最新 stash 的简要内容。git stash show -p: 显示最新 stash 的详细内容。 应用和删除: git stash apply: 应用最新…...
UDP网络攻击
UDP(User Datagram Protocol)作为一种无连接的网络传输协议,以其速度快和资源消耗小的特点,在多种网络服务中发挥着重要作用,UDP的无连接特性也使其成为DDoS攻击的优选协议。 UDP攻击概念 UDP攻击是一种网络攻击手段…...
漏洞扫描的重要性,如何做好漏洞扫描服务
随着互联网技术的飞速发展,网络安全问题已成为不容忽视的重大挑战。其中,系统漏洞威胁作为最常见且严重的安全危险之一,对组织和个人的信息资产构成了巨大威胁。下面我们就来了解下漏洞扫描的好处、漏洞扫描的操作方法以及如何做好网络安全。…...
unity程序简易框架
1. 框架基本结构 2. 单例模式基类模块 2.1 BaseManager.cs using System.Collections; using System.Collections.Generic; using UnityEngine;public class BaseManager<T> where T:new() {private static T instance;public static T GetInstance(){if (instance == …...
Go小技巧易错点100例(十六)
本期看点: 正文开始: 切片的长度和容量 在Go语言中,切片(slice)是一个引用类型,它是对底层数组的抽象表示,提供了动态长度的、灵活的序列类型。切片包含三个重要的属性:指向底层数…...
通过Golang实现中间人攻击,查看和修改https流量包
要查看和修改 HTTPS 流量包,需要使用一个能够执行 中间人攻击(Man-in-the-Middle, MITM) 的代理工具。这个工具将拦截并解密 HTTPS 流量,然后允许查看和修改流量包的内容,再将其重新加密并发送到目标服务器。 完整的 …...
MySQL 安装与配置指南
MySQL 是一种广泛使用的关系型数据库管理系统,为各种应用程序提供高效的数据存储和管理解决方案。本文将介绍如何在不同的操作系统中安装 MySQL,以及如何进行基本的配置,以确保数据库系统的最佳性能和稳定性。 一、环境准备 1.1 系统要求 …...
android13布局查看工具 无源码查看布局 在线查找ui布局id
总纲 android13 rom 开发总纲说明 目录 1.前言 2.工具介绍 2.1工具1 2.2工具2 2.3工具3 2.4工具4 3.彩蛋 1.前言 Android 13提供了一些工具来帮助开发人员查看和优化应用的布局。方便的让我们找到具体应用的布局文件等信息。 2.工具介绍 2.1工具1 老版本DDMS&#x…...
【自动化测试必学语言】python:UnitTest框架
目录 介绍 框架 什么是UnitTest框架? 为什么使用UnitTest框架? UnitTest核心要素(unitest 的组成部分) 1.TestCase(最核心的模块) 2.TestSuite 3.TestRunner 4.TestLoader 5.Fixture TestCase(…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

