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

news2024/12/23 9:42:28

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.coloradmin.cn/o/2151796.html

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

相关文章

Python使用YOLOv5图像识别教程包成功-以识别桥墩缺陷详细步骤分享

前置环境资源下载 提示:要开外网才能下载的环境我都放在了网盘里,教程中用到的环境可从这里一并下载: https://pan.quark.cn/s/f0c36aa1ef60 1. 下载YOLOv5源码 官方地址:GitHub - ultralytics/yolov5: YOLOv5 🚀 …

【源码+文档+调试讲解】微信小程序的投票系统

摘 要 伴随着我国社会的发展,人民生活质量日益提高。于是对各种需求进行规范而严格是十分有必要的,所以许许多多的微信小程序应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套微信小程序的投票系统,进行作品信…

python画图|曲线分段设置颜色基础教程

前期已经学习了大量的python画图教程,但颜色的设计一直是次要角色,今天我们就一起学习一下如何对图形分段设置颜色。 一些前期通过颜色区分图形的文章链接如下: python画图|极坐标下的3D surface_python 根据经纬度 海拔高度 绘制三维立体-…

AIDI工业AI视觉检测软件

AIDI工业AI视觉检测软件 AIDI2.4,工业AI视觉检测软件,全模块永久使用最高权限,支持8卡同时运算,提供远程测试

对接阿里asr和Azure asr

1&#xff1a;对接阿里asr 1.1&#xff1a;pom <dependency><groupId>com.alibaba.nls</groupId><artifactId>nls-sdk-recognizer</artifactId><version>2.2.1</version> </dependency>1.2&#xff1a;生成token package c…

同态加密明文矩阵乘密文向量优化:BSGS小步大步法

摘要 本文介绍如何使用小步大步&#xff08;Baby-Step-Giant-Step&#xff0c;BSGS&#xff09;优化RLWE同态加密的明文矩阵和密文向量的乘法。使用 n n n\times n nn明文矩阵的对角打包和BSGS&#xff0c;可以将密文旋转的次数降低为 O ( n ) O(\sqrt{n}) O(n ​). 明文运算…

3、无线通信系统的组成

通常把实现信息传输的系统称为通信系统&#xff0c;下图表示一个通信系统的基本组成。在通信系统中&#xff0c;一般要进行两种变换与反变换。在发送端&#xff0c;第一个变换是输入变换器&#xff0c;它把要传输的信号变为电信号&#xff0c;该信号一般是低频的&#xff0c;而…

数字英文验证码识别 API 对接说明

数字英文验证码识别 API 对接说明 本文将介绍一种 数字英文验证码识别 API 对接说明&#xff0c;它是基于深度学习技术&#xff0c;可用于识别变长英文数字验证码。输入验证码图像的内容&#xff0c;输出验证码结果。 接下来介绍下 数字英文验证码识别 API 的对接说明。 注册…

【d45】【Java】【力扣】206.反转链表

思路 解法1&#xff1a;适用于数字不多的 1.把节点的数&#xff0c;都放进一个arraylist中 2.调用Collections.reverse(list)方法&#xff0c;将list转置 3.再遍历list&#xff0c;逐个放入数字 代码 解法1 import java.util.ArrayList; import java.util.Collections;p…

window批处理脚本:将本地的三个文件通过SCP传输到Linux设备上

文件名send_file.bat&#xff1a; echo off setlocal:: 提示用户输入远程IP地址 set /p remoteIpAddressplease input IP::: 定义本地文件名 set "localFile1111" set "localFile2222" set "localFile3333":: 获取本地文件的完整路径 set "…

【AI视频】Runway:Gen-2 图文生视频与运动模式详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI视频 | Runway 文章目录 &#x1f4af;前言&#x1f4af;仅图片生成视频方法一&#xff1a;通过Midjourney生成图片方法二&#xff1a;通过Runway预览生成图片注意点 &#x1f4af;图加文生成视频方式一&#xff1a;Midjourney…

百度飞浆Paddle OCR检测和识别【OCR数据收集、标注、数据集划分、检测识别模型训练、导出模型】

文章目录 前言一、OCR数据集采集二、OCR数据标注三、划分数据集四、数据训练五、导出模型 前言 1、我的电脑没有GPU&#xff0c;如果不使用AI Studio训练的话&#xff0c;第一遍我是按照CPU进行环境配置和训练的&#xff0c;可以参考这篇文章&#xff0c;我按着弄了一遍&#…

安克创新25届校招CATA北森测评:笔试攻略、真题题库、高分技巧

安克创新自适应能力CATA测评是该公司用于评估候选人认知能力的计算机自适应测评系统。该测评系统由北森题库提供支持&#xff0c;是国内唯一被国际计算机自适应测验协会(IACAT)收录的产品。测评主要评估以下几个维度&#xff1a; 言语能力&#xff1a;测试理解言语信息并基于这…

25届计算机专业毕设选题推荐-基于python+Django协调过滤的新闻推荐系统

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于协调过滤的新闻推荐系统…

浅谈穷举法

穷举法 穷举法是一种通过逐一列举所有可能情况来寻找解决方案的方法。就像找到一把钥匙打开一把锁&#xff0c;我们会尝试每一把钥匙直到找到正确的那一把。比如&#xff0c;如果你忘记了自己的密码&#xff0c;可以尝试每一种可能的组合直到找到正确的密码为止 穷举法的结构 …

【计算机网络 - 基础问题】每日 3 题(十六)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

spring boot启动报错:so that it conforms to the canonical names requirements

springboot 2.x的版本中对配置文件中的命名规范有了强制性的要求&#xff0c;如下图所示中的dataSource属性属于驼峰格式&#xff0c;但是在springboot 2.x中不允许使用驼峰形式。 根据错误提示可知将其使用 - 来分割即可 错误信息的含义&#xff1a;“Canonical names should…

51单片机-红外遥控器(NEC标准)

作者&#xff1a;Whappy 时间&#xff1a;2024.9.20 总结一下&#xff01;基础实验到这儿里就圆满结束&#xff0c;历经25天&#xff0c;将51单片机学完并亲自手敲代码近5000行&#xff0c;在手敲代码过程中&#xff0c;明显感觉的看和敲&#xff0c;明显就是不同的感觉&…

基于PHP的CRM管理系统源码/客户关系管理CRM系统源码/php源码/附安装教程

源码简介&#xff1a; 这是一款基于PHP开发的CRM管理系统源码&#xff0c;全称客户关系管理CRM系统源码&#xff0c;它是由php源码开发的&#xff0c;还附带了一整套详细的安装教程哦&#xff01; 功能亮点&#xff1a; 1、公海管理神器&#xff1a;不仅能搞定公海类型&…