当前位置: 首页 > news >正文

FreeRTOS 时间管理

延时函数介绍

函数

描述

vTaskDelay()

相对延时

xTaskDelayUntil()

绝对延时

相对延时:指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间结束 

绝对延时:指将整个任务的运行周期看成一个整体,适用于需要按照一定频率运行的任务 

  1. 为任务主体,也就是任务真正要做的工作
  2. 是任务函数中调用vTaskDelayUntil()对任务进行延时
  3. 为其他任务在运行 

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() 绝对延时 相对延时&#xff1a;指每次延时都是从执行函数vTaskDelay()开始&#xff0c;直到延时指定的时间结束 绝对延时&#xff1a;指将整个任务的运行周期看成一个整体&#xff0c;适用于需要按…...

F. Valuable Cards D. Smithing Skill

D题 F题 F题&#xff1a; 因为是连续的且都要选&#xff0c;我们直接从左到右去取每个区间到不合法的情况即可&#xff0c;可以在n1的位置添加一个x来结束区间判断。因为是要乘积为x&#xff0c;那么我们只需要放x的因子进去&#xff0c;不然会超时&#xff0c;同时也可以用v…...

【电子通识】IPC-A-600中对验收标准的定义

在文章【电子通识】IPC-A-610标准对产品的四种验收条件都是什么意思&#xff1f;中我们讲到IPC-A-610标准&#xff08;电子组件的可接受性&#xff09;对于产品的四种验收条件。本文中我们同理讲一讲IPC-A-600中对验收标准的定义。 IPC-A-600文件中的多数示意图和照片同时表示每…...

MyBatis(初阶)

1.什么是MyBtis MyBatis是持久层框架&#xff0c;⽤于简化JDBC的开发。 2.准备工作 2.1 创建⼯程 数据库: 2.2 配置数据库连接字符串 以application.yml⽂件为例: 2.3 写持久层代码 Data public class UserInfo {private Integer id;private String username;private Stri…...

KDP数据平台:以实战案例验证技术领先力

本文由智领云 LeetTools 工具自动生成 申请试用&#xff1a; https://www.leettools.com/feedback/ 在当今快速发展的技术环境中&#xff0c;数据平台的选择对企业的数字化转型和业务发展至关重要。智领云开源KDP&#xff08;Kubernetes Data Platform&#xff09;在数据处理和…...

[Linux] 什么是 Shell?

一、什么是 shell ? shell在英语中的意思就是外壳&#xff0c;所以我们习惯称shell程序为壳程序。那为什么又会被叫做壳程序呢&#xff1f;那是因为shell程序是在内核上面的&#xff0c;属于操作系统的外壳部分&#xff0c;因此我们就称之为壳程序(shell)。 在 Linux 中&#…...

大模型学习应用 2:快速上手大模型基于langchain实现RAG检索应用

快速上手大模型基于langchain实现RAG检索应用 - 项目作业 目录 准备工作镜像选择算力选择安装包数据说明提示参考链接 Task1 申请 api 后&#xff0c;使用 langchain 导入大模型&#xff0c;并打印出大模型信息Task2 使用 langchian 加载数据&#xff0c;并把数据打印出来Task…...

python环境安装之后,cmd输入python回车会打开微软商店

坑爹&#xff01;python环境安装之后&#xff0c;cmd输入python回车会打开微软商店 最近发现&#xff0c;安装python环境成功之后&#xff0c;可能会出现cmd输入python验证是否安装成功老会打开微软商店&#xff01; 解决&#xff0c;打开系统环境配置&#xff0c;找到刚安装…...

USB Type-C如何取9V、12V、15V、20V电压-PD快充协议芯片ECP5701

相信大家在生活中也发现了&#xff0c;现在越来越多的设备都改用这种type-C接口的母座进行取电了。 因为欧盟决议 &#xff1a;自2024年起部分消费电子产品必须提供单一的USB-C充电接口。 那么这种type-C接口相比之前的Micro-B接口有着一个很大的优势就是可以有更高的电压&…...

Go 语言 Map 17

Go 语言提供了一个强大的 Map 结构体&#xff0c;用于存储键值对。Map 可以用来存储数据&#xff0c;快速查找和修改数据。下面是 Go 语言 Map 的使用教程。 什么是 Map&#xff1f; Map 是一个键值对的集合&#xff0c;它可以存储任意类型的键和值。Map 中的每个键都是唯一的…...

移植bash到openharmony

1.交叉工具链 下载地址&#xff1a; http://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist 进入ohos-sdk-full&#xff0c;下载一个sdk版本&#xff0c;这里下载的版本是version-Master_Version-OpenHarmony_5.0.0.35-20240805_020232-ohos-sdk-full.tar.gz。 解…...

git stash详细教程

git stash详细教程 基本命令: git stash: 保存当前未提交的更改&#xff0c;并恢复到干净的工作目录。git stash list: 列出所有的 stash。git stash show: 显示最新 stash 的简要内容。git stash show -p: 显示最新 stash 的详细内容。 应用和删除: git stash apply: 应用最新…...

UDP网络攻击

UDP&#xff08;User Datagram Protocol&#xff09;作为一种无连接的网络传输协议&#xff0c;以其速度快和资源消耗小的特点&#xff0c;在多种网络服务中发挥着重要作用&#xff0c;UDP的无连接特性也使其成为DDoS攻击的优选协议。 UDP攻击概念 UDP攻击是一种网络攻击手段…...

漏洞扫描的重要性,如何做好漏洞扫描服务

随着互联网技术的飞速发展&#xff0c;网络安全问题已成为不容忽视的重大挑战。其中&#xff0c;系统漏洞威胁作为最常见且严重的安全危险之一&#xff0c;对组织和个人的信息资产构成了巨大威胁。下面我们就来了解下漏洞扫描的好处、漏洞扫描的操作方法以及如何做好网络安全。…...

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例(十六)

本期看点&#xff1a; 正文开始&#xff1a; 切片的长度和容量 在Go语言中&#xff0c;切片&#xff08;slice&#xff09;是一个引用类型&#xff0c;它是对底层数组的抽象表示&#xff0c;提供了动态长度的、灵活的序列类型。切片包含三个重要的属性&#xff1a;指向底层数…...

通过Golang实现中间人攻击,查看和修改https流量包

要查看和修改 HTTPS 流量包&#xff0c;需要使用一个能够执行 中间人攻击&#xff08;Man-in-the-Middle, MITM&#xff09; 的代理工具。这个工具将拦截并解密 HTTPS 流量&#xff0c;然后允许查看和修改流量包的内容&#xff0c;再将其重新加密并发送到目标服务器。 完整的 …...

MySQL 安装与配置指南

MySQL 是一种广泛使用的关系型数据库管理系统&#xff0c;为各种应用程序提供高效的数据存储和管理解决方案。本文将介绍如何在不同的操作系统中安装 MySQL&#xff0c;以及如何进行基本的配置&#xff0c;以确保数据库系统的最佳性能和稳定性。 一、环境准备 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框架&#xff1f; 为什么使用UnitTest框架? UnitTest核心要素&#xff08;unitest 的组成部分&#xff09; 1.TestCase&#xff08;最核心的模块&#xff09; 2.TestSuite 3.TestRunner 4.TestLoader 5.Fixture TestCase&#xff08…...

AI代码生成规则引擎实战:从约束设计到团队规范落地

1. 项目概述&#xff1a;一个为代码生成引擎定制的“规则引擎” 在AI辅助编程和代码生成领域&#xff0c;我们常常面临一个核心矛盾&#xff1a;我们希望AI能像一位经验丰富的搭档&#xff0c;理解我们的意图&#xff0c;生成高质量、符合规范的代码&#xff1b;但现实是&…...

Chrome for Testing 终极指南:5个实战技巧让自动化测试更稳定高效

Chrome for Testing 终极指南&#xff1a;5个实战技巧让自动化测试更稳定高效 【免费下载链接】chrome-for-testing 项目地址: https://gitcode.com/gh_mirrors/ch/chrome-for-testing Chrome for Testing 是 Google Chrome Labs 团队专门为浏览器自动化测试设计的 Chr…...

终极React Native Navigation VR应用开发指南:打造沉浸式虚拟环境和菜单导航体验

终极React Native Navigation VR应用开发指南&#xff1a;打造沉浸式虚拟环境和菜单导航体验 【免费下载链接】react-native-navigation A complete native navigation solution for React Native 项目地址: https://gitcode.com/gh_mirrors/re/react-native-navigation …...

PCIe 6.0 Flit Mode 实战解析:从TLP到Flit,你的数据包到底经历了什么?

PCIe 6.0 Flit Mode 深度解析&#xff1a;数据包的奇幻漂流之旅 当一颗来自CPU的事务请求被封装成TLP&#xff08;Transaction Layer Packet&#xff09;时&#xff0c;它即将开始一段穿越PCIe 6.0协议栈的奇妙旅程。这段旅程不再是传统PCIe版本中的"自由行"&#xf…...

达梦数据库主备集群手工搭建及主备切换演练

环境&#xff1a;DM8、Linux&#xff08;CentOS 7 &#xff09;&#xff0c;三台服务器。 本文记录从零搭一套"一主一备一监视" 式的主备集群&#xff0c;纯手工操作&#xff0c;不依赖图形化工具。 一、环境规划 1.1 IP规划 角色主机名业务IP心跳IP实例名主库&…...

DellFanManagement终极指南:如何彻底掌控戴尔笔记本风扇噪音与散热平衡

DellFanManagement终极指南&#xff1a;如何彻底掌控戴尔笔记本风扇噪音与散热平衡 【免费下载链接】DellFanManagement A suite of tools for managing the fans in many Dell laptops. 项目地址: https://gitcode.com/gh_mirrors/de/DellFanManagement 还在为戴尔笔记…...

LaTeX-PPT:3分钟掌握PowerPoint专业公式编辑的神器

LaTeX-PPT&#xff1a;3分钟掌握PowerPoint专业公式编辑的神器 【免费下载链接】latex-ppt Use LaTeX in PowerPoint 项目地址: https://gitcode.com/gh_mirrors/la/latex-ppt 还在为PowerPoint中编辑复杂数学公式而头疼吗&#xff1f;LaTeX-PPT这款开源插件彻底改变了游…...

AbMole丨Apigenin:天然黄酮化合物在氧化应激中的应用

Apigenin&#xff08;芹菜素&#xff09;是一种广泛存在于芹菜、洋甘菊、欧芹等植物中的天然黄酮类化合物[1]。Apigenin&#xff08;CAS No.&#xff1a;520-36-5&#xff09;具有多种生物活性&#xff0c;其分子机制涉及对多条细胞信号通路的调控&#xff0c;包括PI3K/AKT/mTO…...

长期使用Taotoken聚合API对项目开发效率的实际影响

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期使用Taotoken聚合API对项目开发效率的实际影响 在为期数月的项目开发周期中&#xff0c;我们团队将Taotoken作为所有大模型调用…...

DeepSeek等低价大模型实现低算力成本的5项核心技术‌与《论三生原理》思想技术同源?

AI辅助创作&#xff1a;DeepSeek等低价大模型实现低算力成本的5项核心技术‌与《论三生原理》思想技术同源&#xff1f;详述如下&#xff1a;一、DeepSeek 5项低算力核心技术&#xff08;官方公开&#xff09;1. MoE混合专家&#xff08;DeepSeekMoE&#xff09;&#xff1a;千…...