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

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

  • 延时函数API
    • 1. vTaskDelay()
    • 2. vTaskDelayUntil()
    • 3. xTaskDelayUntil()
    • 相对延时和绝对延时的区别
    • 4. xTaskAbortDelay()

上一期,我们学习了任务相关API使用,这一期我们开始学习FreeRTOS延时函数的API使用

延时函数API

在FreeRTOS官方提供的技术文档中,一共提供了三种延时的函数,他们的功能都只有一种:延时,但是又存在一定的差异,让我们来看一下:
在这里插入图片描述

1. vTaskDelay()

函数 vTaskDelay()用于对任务进行延时,延时的时间单位为系统时钟节拍,使用此函数,需要将宏 INCLUDE_vTaskDelay 配置为 1。其函数原型如下:

/*** @brief       vTaskDelay* @param       xTicksToDelay : 需要延时的时间,延时单位为系统节拍* @retval      无*/
void vTaskDelay( const TickType_t xTicksToDelay );//使用示例如下:
/*** @brief       task2* @param       pvParameters : 传入参数(未用到)* @retval      无*/
void task1(void *pvParameters)
{while(1){HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);  /* LED0闪烁 */vTaskDelay(500);                                               /* 延时1000ticks */}
}	

需要注意以下两点

  1. vTaskDelay延时的单位是系统节拍,具体长度由宏 configTICK_RATE_HZ 决定,在FreeRTOS默认的源码里面,该值为1000 HZ,那么一个系统节拍对应的时间就是1/1000s = 1ms ,500个系统节拍就是500ms。
  2. vTaskDelay函数的延时时间,是从调用该函数开始的,由于vTaskDelay前面的代码运行时间不确定,所以实际上下一次运行任务1的时间并不是准确的500ms,只能是大概500ms。

2. vTaskDelayUntil()

函数vTaskDelayUntil()用于以一个绝对的时间阻塞任务,适用于需要按照一定频率运行的任务,函数vTaskDelayUntil()实际上是一个宏,在task.h文件中有定义,具体的代码如下所示:

#define vTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement ) \
{ \( void ) xTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement ); \
}

通过观察代码,我们发现vTaskDelayUntil内部是直接调用了 xTaskDelayUntil() 函数,所以我们直接来介绍xTaskDelayUntil() 函数

3. xTaskDelayUntil()

和vTaskDelayUntil() 函数相同,xTaskDelayUntil()也是用于一个绝对的时间阻塞任务,适用于需要按照一定频率运行的任务,其函数原型如下:

/*** @brief       xTaskDelayUntil* @param       pxPreviousWakeTime: 用于记录上一次任务解除阻塞的系统节拍数(系统时间),改变量首次使用前必须初始化,* 				后续会在xTaskDelayUntil()中自动更新。* @param       xTimeIncrement : 周期时间段。任务将在 (*pxPreviousWakeTime + xTimeIncrement) 时间取消阻塞。* 				使用 相同的 xTimeIncrement 	参数值调用 xTaskDelayUntil 将导致任务以固定的间隔周期执行 。* @retval      返回值为pdTRUE表示任务实际延时,如果为pdFALSE表示下一个预计唤醒的时间已过,无法执行延时,任务将不延时。*/
BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,const TickType_t xTimeIncrement );//使用示例如下:
/*** @brief       task2* @param       pvParameters : 传入参数(未用到)* @retval      无*/
void task2(void *pvParameters)	
{	TickType_t xLastWakeTime;										/*定义上一次解除阻塞的时间*/const TickType_t xFrequency = 500;								/*定义周期时间段*/BaseType_t xWasDelayed;xLastWakeTime = xTaskGetTickCount ();while(1){HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);   					/* LED0闪烁 */xWasDelayed = xTaskDelayUntil(&xLastWakeTime,xFrequency);}
}

相对延时和绝对延时的区别

  1. vTaskDelay() 函数是相对延时,指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间结束。在这个过程中,如果vTaskDelay() 函数前面的内容执行了一段时间(我们这里举个栗子:50ms) ,并且我们通过vTaskDelay() 函数延时了500个系统节拍,那么这个任务实际运行的间隔就是550ms。
  2. vTaskDelayUntil() 和 xTaskDelayUntil() 函数是绝对延时,指将整个任务的运行周期看成一个整体,适用于需要按照一定频率运行的任务,比如我们这里使用xTaskDelayUntil()函数延时500ms,那么整个任务的运行间隔就是500ms(前提是任务里面的代码整体运行实际不能超过500ms)。
    在这里插入图片描述

下面我简单的看一段代码,深入了解以下:

void task1(void *pvParameters)
{while(1){HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_0);   				/* LED0闪烁 */HAL_Delay(250);												/*强制延时250ms,模拟代码运行*//*在freeRTSO的任务里面本不应该出现整个延时函数*//*这里出现时为了做演示,让效果更明显*/vTaskDelay(500);                                           /* 延时500没事、*/}
}	
/*** @brief       task2* @param       pvParameters : 传入参数(未用到)* @retval      无*/
void task2(void *pvParameters)	
{	TickType_t xLastWakeTime;										/*定义上一次解除阻塞的时间*/const TickType_t xFrequency = 500;								/*定义周期时间段*/BaseType_t xWasDelayed;xLastWakeTime = xTaskGetTickCount ();while(1){HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);   					/* LED0闪烁 */HAL_Delay(250);												/*强制延时250ms,模拟代码运行*//*在freeRTSO的任务里面本不应该出现整个延时函数*//*这里出现时为了做演示,让效果更明显*/xWasDelayed = xTaskDelayUntil(&xLastWakeTime,xFrequency);		/*绝对延时500ms*/}
}
  • 在任务1当中,我们先调用HAL_Delay() 进行强制延时,模拟代码正在运行,如何调用vTaskDelay(500)执行了时长为500ms的相对延时,那么任务1的执行周期应该就是750ms
  • 在任务2当中,我们先调用HAL_Delay() 进行强制延时,模拟代码正在运行,如何调用xTaskDelayUntil(500)执行了时长为500ms的绝对延时,那么任务1的执行周期应该就是500ms

以上是我们分析得到的,下面我们来看一下实际情况:

在这里插入图片描述

和理论一致,没有问题!

4. xTaskAbortDelay()

函数 xTaskAbortDelay()用于终止处于阻塞态任务的阻塞,此函数在 task.c 文件中有定义。函数原型如下:

/*** @brief       xTaskAbortDelay* @param       xTask : 将被强制退出阻塞状态的任务的句柄。* @retval      如果 xTask 引用的任务不在“阻塞”状态,则返回 pdFAIL。否则返回 pdPASS。*/
BaseType_t xTaskAbortDelay( TaskHandle_t xTask );

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL--导入SQL文件(命令行导入)

MySQL--导入SQL文件 一、前言二、导入SQL文件 一、前言 用可视化编辑工具编写,并且在控制台输入命令行在MySQL中导入SQL文件。 在导入SQL文件之前查看了目前存在的数据库 **目标:**在可视化编辑工具(这里以word文档为例)中编写SQL语句&…

【算法竞赛】栈

栈的特点是"先进后出"。 栈在生活中的原型有:坐电梯,先进电梯的被挤在最里面,只能最后出来;一管泡腾片,最先放进管子的药片位于最底层,最后被拿出来。 栈只有唯一的出入口,从这个口进入,也从这个口弹出,这是它与队列最大的区别。 队列有一个入…

【动态规划】最大正方形

最大正方形(难度:中等) 该题对应力扣网址 思路 min_valuemin({dp[i-1][j-1],dp[i-1][j],dp[i][j-1]}) dp[i][j]min_value 关键点是正方形的右下角(n>1时),通过画图,可以看出,在基础正方形22中&#x…

unordered_map/set(底层实现)——C++

目录 前言: 1.开散列 1. 开散列概念 2. 开散列实现 2.1哈希链表结构体的定义 2.2哈希表类即私有成员变量 2.3哈希表的初始化 2.4迭代器的实现 1.迭代器的结构 2.构造 3.* 4.-> 5. 6.! 2.5begin和end 2.6插入 2.7Find查找 2.8erase删除 3.unordered_ma…

在vue中:style 的几种使用方式

在日常开发中:style的使用也是比较常见的&#xff1a; 亲测有效 1.最通用的写法 <p :style"{fontFamily:arr.conFontFamily,color:arr.conFontColor,backgroundColor:arr.conBgColor}">{{con.title}}</p> 2.三元表达式 <a :style"{height:…

Gitlab学习(006 gitlab操作)

尚硅谷2024最新Git企业实战教程&#xff0c;全方位学习git与gitlab 总时长 5:42:00 共40P 此文章包含第21p-第24p的内容 文章目录 git登录修改root密码 设置修改语言取消相对时间勾选 团队管理创建用户创建一个管理员登录管理员账号创建一个普通用户登录普通用户账号 群组管理…

第6天:趋势轮动策略开发(年化18.8%,大小盘轮动加择时)

原创内容第655篇&#xff0c;专注量化投资、个人成长与财富自由。 轮动策略是一种投资策略&#xff0c;它涉及在不同的资产类别、行业或市场之间进行切换&#xff0c;以捕捉市场机会并优化投资组合的表现。 这种策略的核心在于识别并利用不同资产或市场的相对强弱&#xff0c…

自然语言处理-基于注意力机制的文本匹配

背景&#xff1a; 任务三&#xff1a;基于注意力机制的文本匹配 输入两个句子判断&#xff0c;判断它们之间的关系。参考ESIM&#xff08;可以只用LSTM&#xff0c;忽略Tree-LSTM&#xff09;&#xff0c;用双向的注意力机制实现。 参考 《神经网络与深度学习》 第7章 Reaso…

clousx6整点报时指令怎么写?

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

大模型的实践应用30-大模型训练和推理中分布式核心技术的应用

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用30-大模型训练和推理中分布式核心技术的应用。本文深入探讨了大模型训练和推理中分布式核心技术的应用。首先介绍了项目背景,阐述了大模型发展对高效技术的需求。接着详细讲解了分布式技术的原理,包括数据并行、模型并…

SAP-MM-变式的设置

1、报表变式 业务需求: 业务人员查询报表时有些值是需要经常输入的,能不能设置成默认值?能不能设置成每次进入报表不选择变式直接是默认值? 解决措施: 1、事物码:MB51 以MB51物料凭证查询为例,其他报表自行举一反三 2、设置变式 首先进入MB51入下图 上图是没有选…

ros2编译RTSP驱动打开网络摄像头

按照这个链接里面的方法即可实现如下效果。

consul服务注册发现与配置中心

目录 1 consul安装与运行 1.1 下载方式 1.2 安装 1.3 启动 1.4 访问方式 2 consul 实现服务注册与发现 2.1 引入 2.2 服务注册 2.3 服务发现 3 consul配置中心 3.1 基础配置 Eureka已经停止更新了&#xff0c;consul是独立且和微服务功能解耦的注册中心&#xff0c;…

Tomcat 后台弱⼝令部署war包

漏洞原理 在tomcat8环境下默认进⼊后台的密码为 tomcat/tomcat &#xff0c;未修改造成未授权即可进⼊后台&#xff0c;或者管理员把密码设置成弱⼝令。 影响版本 全版本(前提是⼈家存在弱⼝令) 环境搭建 8 cd vulhub-master/tomcat/tomcat8 docker-compose up -d 漏洞复…

Python基于flask框架的智能停车场车位系统 数据可视化分析系统fyfc81

目录 技术栈和环境说明解决的思路具体实现截图系统设计python语言django框架介绍flask框架介绍性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示技术路线操作可行性详细视频演示源码获取 技术栈和环境说明 结合用户的使用需求&…

引领长期投资新篇章:价值增长与财务安全的双重保障

随着全球金融市场的不断演变&#xff0c;长期投资策略因其稳健性和对价值增长的显著推动作用而日益受到投资者的重视。在这一背景下&#xff0c;Zeal Digital Shares&#xff08;ZDS&#xff09;项目以其创新的数字股票产品&#xff0c;为全球投资者提供了一个全新的长期投资平…

flutter遇到问题及解决方案

目录 1、easy_refresh相关问题 2、 父子作用域关联问题 3. 刘海屏底部安全距离 4. 了解保证金弹窗 iOS端闪退 &#xff08;待优化&#xff09; 5. loading无法消失 6. dialog蒙版问题 7. 倒计时优化 8. scrollController.offset报错 9. 断点不走 10.我的出价报红 11…

大气网格化精细化监管监测系统

大气网格化精细化监管监测系统是一种先进的环境监测与管理手段&#xff0c;它通过安装传感器、监测设备等手段&#xff0c;对大气环境进行精细化监测和控制。以下是朗观视觉小编对该系统的详细介绍&#xff1a; 一、系统概述 大气网格化精细化监管监测系统利用网格化布点技术&…

linux入门到实操-9 linux文件操作命令:创建文件、复制文件或文件夹、删除和移动文件、多种查看文件的方法

教程来源&#xff1a;B站视频BV1WY4y1H7d3 3天搞定Linux&#xff0c;1天搞定Shell&#xff0c;清华学神带你通关_哔哩哔哩_bilibili 整理汇总的课程内容笔记和课程资料&#xff08;包含课程同版本linux系统文件等内容&#xff09;&#xff0c;供大家学习交流下载&#xff1a;…

Qt 构建版本

Qt提供了三种不同的构建版本&#xff1a;Debug版本&#xff08;调试版本&#xff09;、Release版本&#xff08;发布版本&#xff09;和Profile版本&#xff08;概述版本&#xff09;&#xff0c;每种版本都有其特定的用途和编译设置。 Debug版本&#xff08;调试版本&#x…