ESP-IDF中vTaskDelay函数的解析

本文内容参考:

https://www.freertos.org/zh-cn-cmn-s/a00127.html

特此致谢!

在ESP-IDF项目中用到了延时。如果是在Keil、尤其是STM32接口函数中,笔者很熟悉,是delay_ms函数或者在HAL库中是HAL_Delay函数;如果是Linux应用中,笔者也很熟悉,是sleep函数。唯独在这个ESP-IDF中,由于笔者是刚接触不久,因此虽然查到了对应的延时函数是vTaskDelay函数,但是对于其细节还不甚了解。因此,特意写此文章,对于自己是学习,多余后来者则是解析。

实际上,ESP-IDF中使用的这个vTaskDelay函数也并不是它自创的,而是引用的FreeRTOS中的函数。vTaskDelay函数的细节如下:

函数原型

vTaskDelay函数在FreeRTOS的task.h中,如下:

void vTaskDelay( const TickType_t xTicksToDelay );

注意:在FreeRTOS配置中,必须将 INCLUDE_vTaskDelay 定义为 1,此函数才可用。

函数功能

vTaskDelay()会指定任务想要取消阻塞的时间,该时间是相对于vTaskDelay()被调用的时间。 例如,如果指定时间块为100个tick,那么在调用vTaskDelay()的100个tick后任务会取消阻塞。

注意:vTaskDelay()并不会因此提供一种控制周期性任务频率的好办法,因为途径代码的路径以及其它任务和中断活动将影响vTaskDelay()被调用的频率,进而会影响下一个任务执行的时间。

函数参数

  • xTicksToDelay —— 调用任务应阻塞的tick周期数。

函数返回值

无。

用法示例

void vTaskFunction( void * pvParameters )
{/* Block for 500ms. */const TickType_t xDelay = 500 / portTICK_PERIOD_MS;for( ;; ){/* Simply toggle the LED every 500ms, blocking between each toggle. */vToggleLED();vTaskDelay( xDelay );}
}

vTaskDelay()按给定的tick数延迟任务。任务保持阻塞的实际时间取决于tick频率。 常量 portTICK_PERIOD_MS配合tick周期分辨率可用于从tick频率计算实际时间。

在ESP-IDF中,portTICK_PERIOD_MS的值为:

#define portTICK_PERIOD_MS              ((TickType_t) (1000 / configTICK_RATE_HZ))

这里就引出来了一个问题:pertTICK_PERIOD_MS是延时1毫秒的值,那么如果延时x秒,是应该乘以这个值还是除以这个值?

官方的例程以及绝大多数代码中都是除以pertTICK_PERIOD_MS,也就是说正确的用法是除而不是乘。比如,想要延时2秒,就要vTaskDelay(2000/portTICK_PERIOD_MS);延时1秒则是vTaskDelay(1000/portTICK_PERIOD_MS)。

有人(包括笔者)会有疑问:既然portTICK_PERIOD_MS是时间单位,代表1毫秒对应的值,那么X秒不应该是乘法吗,即X * 1000 * portTICK_PERIOD_MS。笔者也正是为了解开此疑问才写的本篇文章。这里笔者推演一下:

先要弄清楚一点,实际上portTICK_PERIOD_MS的意义并不是毫秒,而是代表了1个Tick对应了多少毫秒(比如,常见的交流电为50Hz,那么1Hz就对用了0.02秒,即20毫秒)。

既然vTaskDelay函数的参数xTicksToDelay的单位是Tick,也就是时钟节拍,那么configTICK_RATE_HZ就是延时1秒所对应的Tick个数值,就是说走configTICK_RATE_HZ个节拍对应的时间是1秒。注意,这里configTICK_RATE_HZ的单位是个即频率,而其倒数则表示时间,即1个tick所用的时间。

既然走configTICK_RATE_HZ个Tick所对应的时间是1秒,那么自然地,走(configTICK_RATE_HZ/1000)个Tick所对应的时间是1毫秒,其倒数(1000/configTICK_RATE_HZ)自然就是时间单位1毫秒,而这正是portTICK_PERIOD_MS的定义:

#define portTICK_PERIOD_MS              ((TickType_t) (1000 / configTICK_RATE_HZ))

既然走(configTICK_RATE_HZ/1000)个Tick所对应的时间是1毫秒,那么走1秒所对应的Tick数自然是(configTICK_RATE_HZ/1000) *1000,走X秒所对应的Tick数是X * (configTICK_RATE_HZ/1000) *1000,即X * 1000 * (configTICK_RATE_HZ/1000)。代入portTICK_PERIOD_MS,则为X * 1000 * (1/portTICK_PERIOD_MS),就是X * 1000 /  portTICK_PERIOD_MS。

这就是应该为除法而不是乘法的原因。

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

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

相关文章

后台返回文件流,前端下载为excal

1.添加ajax请求(responseType:blob,) const exportExcelApi (options)>{ return fetchPost(IP/airport/downExcel, {body:options,responseType:blob,}); } 2.请求到流下载到本地 const down (type,response)>{// 创建隐藏的可下载链接 respo…

JAVA二手车交易二手车市场系统源码支持微信小程序+微信公众号+H5+APP

二手车交易二手车市场系统:重塑购车新体验 随着汽车消费市场的日益成熟,二手车交易逐渐成为消费者购车的新选择。为了提供更加便捷、透明、安全的二手车交易环境,我们推出了“二手车交易二手车市场系统”,旨在为买卖双方搭建一个…

新书速览|Django 5 Web应用开发实战

构建未来,用Django 5打造全新Web应用 本书内容 《Django 5 Web应用开发实战》集Django架站基础、项目实践、开发经验于一体,是一本从零基础到精通Django Web企业级开发技术的实战指南。《Django 5 Web应用开发实战》内容以Python 3.x和Django 5版本为基础…

JavaScript循环结构

JS循环结构 1 while结构2 for循环3 foreach循环 1 while结构 几乎和JAVA一致 代码 /* 打印99 乘法表 */var i 1;while(i < 9){var j 1;while(j < i){document.write(j"*"i""i*j" ");j;}document.write("<hr/>");i…

leetcode算法常用函数

文章目录 字符相关字符串相关数组和集合相关 核心关注算法逻辑&#xff0c;其他的常见操作用标准库里函数即可&#xff0c;不用浪费时间。 Java语言作为参考&#xff0c;记录刷题时常用的函数 字符相关 Character.isDigit(); //判断是否为数字Character.isLetter(); //判断是否…

Android security知识点总结

Linux sepolicy uses ipk package, each binary has three sepolicy files, they are if (interface), fc (file context), te. opkg install selinux.ipk 1 Chain of Trust 1.1 qcom efuse 对bootloader签名&#xff0c;熔丝文件&#xff1a;sec.dat 1&#xff09;烧写signed …

需要学习的东西

需要学习的东西 【&#xff08;关键词&#xff1a;spring - event&#xff09;&#xff08;副关键词&#xff1a;springCloud、代码解耦、主线程沟通子线程&#xff09;】 https://blog.csdn.net/SunBigBoy/article/details/130231585 【&#xff08;关键词&#xff1a;spring …

头歌实践教学平台——Java程序设计之数据结构

目录 Java 数据结构之栈、队列 实现基于数组的栈 实现基于链表的栈 基于数组的队列 基于链表的队列 Java数据结构-线性表的设计与实现 顺序表的实现之增删功能 顺序表的实现之查询功能 单链表的实现之增删功能 单链表的实现之查询功能 Java数据结构-循环链表的设计与…

深度学习设计模式之简单工厂模式

文章目录 前言一、简单工厂设计模式的作用&#xff1f;二、详细分析1.核心组成2.实现步骤3.示例代码4.优缺点优点缺点 5.使用场景 总结 前言 本文主要学习简单工厂设计模式&#xff0c;这个设计模式主要是将创建复杂对象的操作单独放到一个类中&#xff0c;这个类就是工厂类&a…

物联网D3——按键控制LED、光敏传感蜂鸣器

按键控制LED 按键抖动&#xff0c;电平发生变化&#xff0c;可用延时函数抵消按键抖动对系统的影响 传感器电路图 按键电路图 c语言对应类型 “_t”后缀表示使用typedef重命名的数据类型 枚举类型 #include<iostream> using namespace std; //定义枚举类型 typedef enu…

linux多网卡多网段配置ipv6路由

vi /etc/sysconfig/network-scripts/route6-enp4s0 2409:xxxx:xxxx:fd::/64 via 2409:xxxx:xxxx:fb::1 dev enp4s0 2409:xxxx:xxxx:80::/57 via 2409:xxxx:xxxx:fb::1 dev enp4s0 另一个网卡配置默认路由&#xff0c;该网卡IPV6_DEFAULTGW不配置&#xff0c;采用上面配置文件配…

基于springboot实现的在线动漫信息平台

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

vue2 结合iview和百度地图API实现电子围栏

vue2 结合iview和百度地图API实现电子围栏 实现在地图上绘制电子围栏并自定义电子围栏样式&#xff0c;还可以标记中心点 1.百度地图API相关JS引用 <script src"//api.map.baidu.com/api?typewebgl&v1.0&ak百度地图官网申请的ak"></script>//…

【JVM】调优工具

这里简单介绍一下各种调优用到的工具 一&#xff0c;环境准备 首先我们需要准备好Java环境&#xff0c;和win上的jdk环境&#xff08;图形化界面如jconsole只有jdk中有&#xff09;。 有这样一个类Prolem&#xff0c;每个线程都会带来100个垃圾对象&#xff0c;线程new完100…

翻译《The Old New Thing》- What does the CS_OWNDC class style do?

What does the CS_OWNDC class style do? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20060601-06/?p31003 Raymond Chen 2006年06月01日 简要 本文讨论了CS_OWNDC窗口类样式的影响&#xff0c;它让窗口管理器为窗口创建一个永久的设…

品牌银饰售卖|基于SSM+vue的品牌银饰售卖平台的设计与实现(源码+数据库+文档)

品牌银饰售卖平台 目录 基于SSM&#xff0b;vue的品牌银饰售卖平台的设计与实现 一、前言 二、系统设计 三、系统功能设计 1前台功能模块 2后台功能模块 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题…

Redission分布式锁 - 抢课系统

使用Redission分布式锁与Kafka消息队列&#xff0c;实现学生抢课系统&#xff08;高并发秒杀场景&#xff09;。 目录 一、思路1.为频繁访问的信息设置缓存&#xff08;1&#xff09;登陆&#xff08;2&#xff09;课程任务信息&#xff08;3&#xff09;用户抢课记录 2.消息队…

知识图谱开发日志

应用于应用环境的配置.测试.发布 假如你写了一个web,并且测试调试都没有问题 并且,你想发给你的朋友,导师,或者部署到远程云服务器上 那么,你需要配置相同的软件,比如数据库,web服务器,必要的插件,库,etc…但这并不一定能保证软件的正常运行,因为别人可能使用完全不同的操作系统…

在VMware安装Androidx86_64系统要点

上篇使用VirtualBox安装过Androidx86_64系统&#xff0c;尝试了没有蓝牙共享的好方法。本篇记录下使用Vmware虚机安装改系统&#xff0c;并使用蓝牙共享功能。 1.准备材料 本篇安装环境是安装Window10_64位系统。需要下载好Vmware安装包&#xff0c;VMWare版本&#xff1a;VMw…

winform中实现Oxyplot.WindowsForms.Plot的鼠标悬停坐标值展示

界面增加Oxyplot.WindowsForms.Plot&#xff0c;鼠标悬停显示坐标值。 PlotType PlotType.XY private void InitPlotModel() {this.plot.Model _PlotModel;this.plot.Enabled true;this.plot.MouseHover PlotView_MouseHover;this.plot.MouseHover PlotView_M…