FreeRTOS中vTaskDelay()分析

vTaskDelay() 的参数是 系统节拍数(ticks),而非毫秒。 1000U:将毫秒转换为 ticks,适配 FreeRTOS 时间函数。:参数必须为 ticks,需通过宏转换毫秒值。系统配置:合理选择以平衡实时性和性能。 阅读详情

问题1

用xTaskCreate()函数创建了一个任务,xTaskCreate(SetTask,"SetTask",4096,(void*)(&setvalue),1,xTaskHandle); 在SetTask()任务函数中调用 vTaskDelay(pdMS_TO_TICKS(2)); 想实现一个2ms的任务延时,结果延时了几个us ,这是什么原因?

分析

可能原因:1. FreeRTOS的tick rate(时钟节拍频率)设置问题:pdMS_TO_TICKS宏将毫秒转换为系统节拍(ticks)。如果系统的tick rate设置得很低,那么每个tick的时间就很长,可能导致2ms转换后的tick数很小,甚至为0。

系统tick rate设置得非常低?比如默认的100Hz(一个tick为10ms),那么2ms不足一个tick,会被转换为0,因此vTaskDelay(0)会导致任务立即让出CPU,但不会主动阻塞,这样任务会再次被调度运行,看起来就像几乎没有延时。

pdMS_TO_TICKS()宏的作用:
将毫秒转换为FreeRTOS的系统节拍(ticks)。

根据宏  #define pdMS_TO_TICKS( xTimeInMs )    ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000U ) )

得出计算公式:

tick_count = (milliseconds * configTICK_RATE_HZ) / 1000;

若结果小于1   configTICK_RATE_HZ=100; 2ms*100<1000 ; tick_count=0;

vTaskDelay(0)的行为:

不阻塞任务,仅让出CPU给同优先级或更高优先级的任务

任务切换耗时通常在几µs级别,符合观察现象。

ESP-IDF的默认配置

configTICK_RATE_HZ默认为100(即1个tick=10ms)。此时

pdMS_TO_TICKS(2) = (2 * 100) / 1000 = 0.2 → 截断为0

因此实际调用的是vTaskDelay(0)。

问题2

esp_rom_delay_us() 忙等待

可以实现高精度的延时,但是因为是独占CPU,如果太长会触发看门狗复位等无法控制的错误,适用于低延时等待场景。

问题3

在非任务场景中,比方说main() 函数初始化,中断中,不能使用vTaskDelay()函数实现延时,因为vTaskDelay() 依赖任务调度器,它会主动让出CPU控制权,把当前任务挂到延时队列里,等时间到了再唤醒。这机制完全建立在任务上下文的基础上,得有任务控制块TCB 这些数据结构支撑。

vTaskDelay() 内部最终会调用 portYIELD() 或类似机制请求任务切换。在中断中,任务切换有专门的 API (portYIELD_FROM_ISR()),使用 vTaskDelay() 会调用错误的切换机制。在调度器启动前,根本没有任务可以切换。

深入解析 pdMS_TO_TICKS 宏:如何精准转换毫秒到 FreeRTOS 系统节拍数 本文深入解析了FreeRTOS中的pdMS_TO_TICKS宏,详细介绍了如何将毫秒精确转换为系统节拍数(ticks)。通过剖析宏定义原理、configTICK_RATE_HZ参数作用,以及与vTaskDelay等API的配合使用,帮助开发者避免常见的时间转换错误。文章还提供了处理精度问题的最佳实践和调试技巧,是FreeRTOS时间管理的重要参考。 阅读详情

相关推荐

FreeRTOS学习笔记——任务延时

主机环境:Windows 开发环境:MDK4.7.2 FreeRTOS版本:FreeRTOS8.1.2 目标环境:STM32F030C8T6 FreeRTOS的任务有以下几种状态:运行态、就绪态、阻塞态、挂起态,如下图 其中如果任务调用了延时函数就会进入阻塞态,延时函数有两个:vTaskDelay()和vTaskDelayUtil()前者是相对延时,后者是绝对延时,可

小人物专栏 1万+

FreeRTOS延时函数

vTaskDelay() 相对延时函数 vTaskDelay()延时固定数量的tick中断,将调用任务置于阻塞状态。(vTaskDelay() 函数只有在宏 INCLUDE_vTaskDelay 置1时才可用) void vTaskDelay( TickType_t xTicksToDelay ); **参数作用:**如果一个任务调用函数vTaskDelay(100),此时滴答中断计数为10000,然后它将立即进入阻塞状态,并保持阻塞状态直到滴答中断计数达到10100 宏pdMS_TO_TICKS()

Do Always Learing的博客 1万+

FreeRTOS时间管理避坑指南:为什么你的vTaskDelay()延时总是不准?

本文深入解析FreeRTOS中vTaskDelay()延时不准的原因及解决方案,重点介绍系统节拍数(ticks)与毫秒转换的关键技术。通过pdMS_TO_TICKS宏的正确使用方法和时间管理最佳实践,帮助开发者避免常见陷阱,实现精确的任务调度和延时控制。

weixin_28475533的博客 443

FreeRTOS高级篇9---FreeRTOS系统延时分析

FreeRTOS提供了两个系统延时函数:相对延时函数vTaskDelay()和绝对延时函数vTaskDelayUntil()。相对延时是指每次延时都是从任务执行函数vTaskDelay()开始,延时指定的时间结束;绝对延时是指每隔指定的时间,执行一次调用vTaskDelayUntil()函数的任务。换句话说:任务以固定的频率执行。在《FreeRTOS系列第11篇---FreeRTOS任务控制》一文...

朱工的专栏 8万+

FREERTOS学习笔记,任务管理二

任务优先级 接上一章: xTaskCreate()参数中uxPriority表明了任务在创建时的起始优先级,当任务创建后用户可以使用vTaskPrioritySet()来更改任务优先级。 有效优先级的最大数通过FreeRTOSConfig.h中的configMAX_PRIORITIES来定义,数字越大代表优先级越高,并且可以多个任务具有相同优先级。 FREERTOS时间任务调度器主要通过两种方法决...

yuchendoudou的博客 501

12.时间管理—延时函数

时间管理—延时函数

扬帆起航 3720

[freertos]vTaskDelay()和vTaskDelayUntill()区别理解

延时时间未包含线程当前循环任务逻辑,一旦当前循环被更高优先级任务或中断抢占,下一次循环的开始时间会被推迟;所以需要精确周期性执行的任务,一般使用vTaskDelayUntill(),延时时间包含了线程当前循环任务逻辑,所以下次循环的开始时间依然固定;理解整理出来,代码贴到下面,自己绘制关系图,方便理解。

weixin_46855342的博客 405

FreeRTOS避坑指南之中断测试

关注、星标公众号,直达精彩内容来源:技术让梦想更伟大作者:李肖遥FreeRTOS中断简介任何调用中断安全FreeRTOS API函数的中断服务例程都可以使用的最高中断优先级。不要从...

李肖遥的专栏 1万+

使用FreeRTOS在任务中调用vTaskDelay()导致程序卡死

在使用 FreeRTOS 进行嵌入式开发时,是一个非常有用的函数,它允许任务暂停执行一段时间,以释放 CPU 资源和避免不必要的忙等待。然而,有时候开发人员可能会遇到一个问题:当在任务中调用时,程序似乎“卡死”或“挂起”,任务不再运行。

weixin_63019977的博客 5035

从理论到实践:Zemax驱动下的离轴三反光学系统全流程构建

本文详细阐述了从理论推导到软件实现的离轴三反光学系统全流程设计方法。文章首先分析了离轴三反系统在空间遥感等领域的优势,然后手把手指导如何基于像差理论计算共轴三反的初始结构参数,包括曲率半径与圆锥系数。最后,重点介绍了在Zemax中完成从共轴建模、视场离轴设置到优化与性能评估的完整实战步骤,为光学工程师提供了宝贵的经验与避坑指南。

weixin_29205061的博客 238

c语言【分糖果】2023蓝桥杯4124(枚举,递归,dfs)

但是这是不符合我们糖果刚好分完的条件的,我们应该往回退到上一层,也就是孩子6这层,然后j+1=3,孩子7分到3个第二种糖果,这也不符合我们糖果刚好分完的条件,然后就会再次回退到孩子6这里,然后j+1=4,让我们的孩子7获得5块第二种糖果,然后还是不符合糖果刚分完的条件,于是再一次退回到孩子6这里,然后就会有外循环i+1=1,j=1,孩子7分到1块第一种糖果1块第二块糖果......然后就是这样的不停地回溯,试探,直到把整棵树遍历一遍,并且记录所有的满足条件的组合。先放一下我的代码,我的代码超时啦救命!

weixin_74331419的博客 731

FreeRTOS学习笔记——FreeRTOS 时间管理

在使用FreeRTOS 的过程中我们通常会在一个任务函数中使用延时函数对这个任务延时,当执行延时函数的时候就会进行任务切换,并且此任务就会进入阻塞态,直到延时完成,任务重新进入就绪态。延时函数属于FreeRTOS 的时间管理,本章我们就来学习一些FreeRTOS 的这个时间管理过程,看看在调用延时函数以后究竟发生了什么?任务是如何进入阻塞态的,在延时完成以后任务又是如何从阻塞态恢复到就绪态的,本章...

唯恋殊雨的博客 1万+

英飞凌 AURIX Development Studio工程移植到Hightec的方法

1. 软件简介 AURIX™ Development Studio是英飞凌针对AURIX TC2XX/TC3XX系列单片机推出了一款免费的软件,集成了iLLD库,内置Tasking compiler和Tasking Debugger,但这两个模块只能用于非商业用途,可供学习和试用。iLLD库是英飞凌为TC2XX和TC3XX Tricore系列单片机提供的底层驱动库,有完善的使用手册,和较好的移植性。 Hightec是一款可以用来开发Aurix系列单片机的编译器,有免费版,可商用,集成GCC编译器,可用UDE

weixin_42967006的博客 7137

【嵌入式】HAL_Delay()卡死问题,STM32 FreeRTOS

之前,不要调用FreeRTOS的API,不然卡死。

-凌凌漆-的博客 320

使用 MATLAB/Simulink + Communications Toolbox + 5G Toolbox,构建一个2×2 MIMO-OFDM通信系统

本文通过Simulink+CommunicationsToolbox构建2×2 MIMO-OFDM通信系统,重点实现信道均衡滤波器(ZF与MMSE)的设计与应用。详细介绍了系统架构、建模步骤(包括信道估计、均衡器实现)和仿真场景设计,通过BER、星座图和EVM对比分析验证了MMSE均衡器在抑制噪声和信号恢复方面的优势。文章总结了MIMO均衡的核心原理与实践经验,并提出了扩展至大规模MIMO、深度学习均衡器等优化方向,为无线通信系统设计提供实用指导。

amy_mhd的博客 127

软件崩溃时Visual Studio中看不到有效的调用堆栈,使用Windbg动态调试去分析定位

当在Visual Studio中遇到软件崩溃且无法查看详细调用堆栈时,可以使用Windbg进行动态调试去分析定位问题。

dvlinker的技术专栏 1万+

FreeRTOS学习总结(DAY1)

刚开始学习FREERTOS,将一些之前不了解的点记录下来。 1、创建任务时,可以由相同的任务代码创建多个任务,仅仅是传入的参数不同。 2、调度器总是选择具有最高优先级的可运行任务来执行,如下图高优先级任务之所以总是运行,是因为其不会等待任何事情,要么在死循环里打转,要么往终端打印字符串。这种情况称为任务1的执行时间被任务2“饿死(starved)”了。 3、由于上例中任务的内容就是打...

DAJUXING 515

基于MATLAB的奇异谱分析(SSA)算法详解

本文详细介绍了基于MATLAB的奇异谱分析(SSA)算法。文章首先阐述了SSA的基本概念、历史发展及其与传统信号分析方法的对比优势,指出SSA作为一种非参数、非线性时间序列分析方法,特别适合处理非平稳信号。随后详细解析了SSA算法的核心原理与数学模型,包括轨迹矩阵构建、奇异值分解、分组与重构四个关键步骤。文章还提供了完整的MATLAB实现框架和代码解析,涵盖参数检查、轨迹矩阵构建、SVD分解、分组策略和重构过程。最后,通过信号分解、去噪和预测三个应用案例展示了SSA的实际效果。

qq_42212808的博客 168

FreeRTOS笔记(九)任务相关的过渡

文章目录01 - 任务相关的过渡1.1 - get和set函数1.2 - delay延迟函数02 - 总结 上一文链接:FreeRTOS笔记(八)任务切换 01 - 任务相关的过渡 1.1 - get和set函数   了解到任务、列表和调度器后,关于任务的核心内容应该比较清晰,FreeRTOS还有很多任务的辅助函数,比如一些必要的get和set函数,用于获取和设置任务的状态和信息,比如常见的如下...

单眼皮根号三的博客 1240

10. 重磅!Spring AI 1.0 正式发布,Java 开发者的 AI神器!

重磅!Spring AI 1.0 正式发布,Java 开发者的 AI神器! 全网最详细的Spring AI 文章,每章都会提供代码入口,让你更容易得入门和理解Spring AI 相关概念,直接节约你百分之六十的学习成本时间。

gorgor在码农 1066

组基轨迹建模 GBTM的介绍与实现(Stata 或 R)

组基轨迹建模(Group-Based Trajectory Modeling,GBTM)(旧名称:Semiparametric mixture model)历史:由DANIELS.NAGIN提出,发表文献《Analyzing Developmental Trajectories:A Semiparametric,Group-Based Approach》GBTM能够将一群人的轨迹分类并生成数个具有代表性的运动轨迹模型,然后对每个轨迹模型进行分析,以了解人们的运动特征、生理水平和风险等级等。

三分钟热度 1万+

vTaskDelayUntil函数介绍

<link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-b5506197d8.css"> <div id="content_views" class="htmledit_views"> <span style="font-family:Microsoft...

zhangfengmei1987的博客 7399

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

FreeRTOS-时间管理(延时、系统时钟)源码分析

在写FreeRTOS的应用程序时,经常需要使用到延时函数,当执行到延时函数时,会将任务从就绪状态变为延时等待状态,这里会放弃CPU的占用权进入阻塞态,将CPU让给其它任务使用直到延时时间结束会重新变为就绪态。FreeRTOS中的延时函数有两种模式,一种是相对模式,另一种是绝对模式。相对延时函数使用 vTaskDelay() ,相对延时函数是指每次执行都是从函数接口处开始计时,计时到指定时间结束回来...

itdo_just的博客 1515

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

FreeRTOS 任务切换导致OLED显示字符出错

FreeRTOS 任务切换 导致 OLED显示失败

aa32110355的博客 1031

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

STM32F1+HAL库+FreeTOTS学习11——延时函数API

FreeRTOS中延时函数的使用和介绍,相对演示和绝对延时的区别

weixin_67907028的博客 1802

别再用HAL_Delay()了!STM32 HAL库延时函数的3个致命坑与替代方案

本文深入分析了STM32 HAL库中HAL_Delay()函数的三大致命缺陷,包括阻塞式设计、SysTick溢出风险以及与RTOS的兼容性问题,并提供了SysTick定时器中断、硬件定时器延时和RTOS任务延时三种高效替代方案,帮助开发者优化系统性能和实时响应能力。

weixin_30561425的博客 675
上一篇: VSCode调试JavaScript代码
下一篇: FreeRTOS 中队列的阻塞态
dzdesigned
博客等级 码龄17年 72粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值