FreeRTOS学习第7篇--周期性延迟和相对性延迟函数

目录

  • FreeRTOS学习第7篇--周期性延迟和相对性延迟函数
    • 时间延迟
    • vTaskDelay函数原型
    • vTaskDelayUntil函数原型
    • PrintTask_Task任务相关代码片段
    • 实验现象
    • 本文中使用的测试工程

FreeRTOS学习第7篇–周期性延迟和相对性延迟函数

本文目标:学习与使用FreeRTOS中的延迟函数,主要是学习两个函数的使用。

按照本文的描述,应该可以跑通实验并举一反三。

本文实验条件:拥有C语言基础,装有编译和集成的开发环境,比如:Keil uVision5

时间延迟

在freertos中的时间延迟有两个:vTaskDelayUntil和vTaskDelay,区别如下:

vTaskDelay是相对延时函数,它指定的是从调用该函数后开始计算的延时时间,单位是系统节拍时钟周期。这个函数适合需要固定时间间隔的延时操作,但是它可能受到其他任务和中断的影响,导致下一次执行的时间不准确。

vTaskDelayUntil是绝对延时函数,它指定的是一个绝对的唤醒时间,单位也是系统节拍时钟周期。这个函数适合实现周期性的延时操作,它可以保证任务以固定的频率执行,不受其他因素的干扰。但是如果指定的唤醒时间已经过去,那么该函数会立即返回,不会有延时效果。

vTaskDelay函数原型

void vTaskDelay( const TickType_t xTicksToDelay );

函数描述:

函数 vTaskDelay 用于任务的延迟。

参数 xTicksToDelay 用于设置延迟的时钟节拍个数,范围 1- 0xFFFFFFFF。延迟时间的最大值在portmacro.h 文件里面有定义:

typedef uint32_t TickType_t;

#define portMAX_DELAY ( TickType_t )0xffffffffUL

即延迟时间的范围是:1- 0xFFFFFFFF

vTaskDelayUntil函数原型

void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement ); 

函数描述:

函数 vTaskDelayUntil 用于周期性延迟。

第 1 个参数,存储任务上次处于非阻塞状态时刻的变量地址。

第 2 个参数,周期性延迟时间。

使用这个函数要注意的点:

使用此函数需要在 FreeRTOSConfig.h 配置文件中配置如下宏定义为 1

#define INCLUDE_vTaskDelayUntil             1

这个两个的函数使用举例可以看我下面的代码片段

PrintTask_Task任务相关代码片段

void PrintTask(void *params)
{struct TaskPrintInfo *pInfo = params;uint32_t cnt = 0;OLED_Init();TickType_t ticks;BaseType_t preTime;uint64_t t1, t2;preTime = xTaskGetTickCount();while (1){/* 打印信息 */if (g_LCDCanUse){g_LCDCanUse = 0;OLED_ShowString(pInfo->x,pInfo->y,pInfo->name,16);OLED_ShowNum((pInfo->x + 8 * 6),pInfo->y,cnt++,4,16);g_LCDCanUse = 1;mdelay(cnt & 0x07);  // 简单限制  模拟干一些活  使得运行PrintTask这个函数有不一样的时长}t1 = system_get_ns();ticks = 500 / portTICK_PERIOD_MS;vTaskDelayUntil(&preTime, ticks);   // 绝对延迟 打印出来的时间差是跟下面的时间差有区别
//		vTaskDelay(ticks);  // 相对延迟函数 会进行Block t2 = system_get_ns();OLED_ShowNum((pInfo->x + 8),pInfo->y + 16,t2-t1,9,16);OLED_Refresh();     }
}
 xTaskCreate(PrintTask, "task1", 128, &g_Task1Info, osPriorityNormal, NULL);
static struct TaskPrintInfo g_Task1Info = {0, 0,   "Task1"};

实验现象

下载代码到板子上,使用vTaskDelay的相对延迟函数时,我显示的时间差始终是稳定的,我使用vTaskDelayUntil的绝对延迟时,我显示的时间差就有部分变化。

绝对延迟显示

相对延迟显示

本文中使用的测试工程

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

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

相关文章

Spring Boot - Application Events 的发布顺序_ApplicationFailedEvent

文章目录 Pre概述Code源码分析 Pre Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent 概述 Spring Boot 的广播机制是基于观察者模式实现的,它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#…

选择安全数据交换系统时 要考虑哪些因素?

安全数据交换系统是一种专门设计用于在不同的网络环境(如内部不同网络,内部网络和外部网络)之间安全传输数据的解决方案。它通常包括一系列的技术和流程,旨在确保数据在传输过程中的完整性、机密性和可用性。 安全数据交换系统可以…

Maven工程 — 继承与聚合 相关知识点详解

简介:这篇帖子主要讲解Maven工程中的继承与聚合的相关知识点,用简洁的语言和小编自己的理解,深入浅出的说明Maven工程的继承与聚合。 目录 1、继承 1.1 继承关系的实现 1.2 版本锁定 2、聚合 2.1 聚合方法 3、总结 1、继承 图 1-1 继承…

springBoot项目打包发布

打包 项目代码编写完成后&#xff0c;在pom.xml文件中引用打包的插件&#xff1a; <!-- 打包插件坐标--><build><plugins><!--打包插件--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-mave…

vue 指定区域可拖拽的限定拖拽区域的div(如仅弹窗标题可拖拽的弹窗)

<template><div class"container" ref"container"><div class"drag-box" v-drag><div class"win_head">弹窗标题</div><div class"win_content">弹窗内容</div></div><…

探索设计模式的魅力:抽象工厂模式的艺术

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;用于在不指定具体类的情况下创建一系列相关或相互依赖的对象。它提供了一个接口&#xff0c;用于创建一系列“家族”或相关依赖对象&#xff0c;而无需指定它们的具体类。 主要参…

Jest 28发布

Jest 28终于来了&#xff0c;它带来了一些长期以来一直要求的特性&#xff0c;比如支持跨多台机器的测试运行分片、包导出和自定义假计时器行为的能力。 新特性 安装大小减少了大约 1/3 正如在去年的Jest 27博客中所宣布的那样&#xff0c;已经从默认安装中删除了一些不再默…

阿赵UE学习笔记——11、地形系统

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的用法&#xff0c;这次来学习一下虚幻引擎的地形系统的用法。 一、创建地形 在选项模式里面&#xff0c;选择地形&#xff1a; 进入到地形界面之后&#xff0c;需要先创建一个地形&#xff1a; 留意看…

stm32 - GPIO

stm32 - GPIO 基本结构输入输出 基本结构 所有GPIO都挂在APB2总线上 寄存器&#xff1a;内核通过APB2总线对寄存器进行读写&#xff0c;实现电平的读写 GPIO引脚的每一位对应寄存器中的某一位 GPIO中的驱动器是增加信号驱动能力的&#xff0c;用于增大驱动能力 输入 读取端口的…

吃瓜教程Task1:概览西瓜书+南瓜书第1、2章

由于本人之前已经学习过西瓜书&#xff0c;本次学习主要是对以往知识的查漏补缺&#xff0c;因此本博客记录了在学习西瓜书中容易混淆的点以及学习过程中的难点。更多学习内容可以参考下面的链接&#xff1a; 南瓜书的地址&#xff1a;https://github.com/datawhalechina/pumpk…

mobi文件怎么转换成pdf?

mobi文件怎么转换成pdf&#xff1f;在数字化时代&#xff0c;电子书籍成为了越来越受欢迎的阅读方式。我们可以通过多种格式的电子书来获取知识和娱乐&#xff0c;其中一种常见的格式就是Mobi文件。Mobi文件是亚马逊公司开发的一种电子书格式&#xff0c;它主要用于Kindle设备和…

C语言通过MSXML6.0读写XML文件(同时支持char[]和wchar_t[]字符数组)

开发环境&#xff1a;Visual Studio 2010 运行环境&#xff1a;Windows XP SP3 第一节 读取XML文件&#xff08;使用wchar_t[]字符数组&#xff09; /* 这个程序只能在C编译器下编译成功, 请确保源文件的扩展名为c */ #define COBJMACROS #include <stdio.h> #include …