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

news2024/11/25 0:23:33

目录

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

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

相关文章

YOLOv8改进 | Conv篇 | 在线重参数化卷积OREPA助力二次创新(提高推理速度 + FPS)

一、本文介绍 本文给大家带来的改进机制是一种重参数化的卷积模块OREPA,这种重参数化模块非常适合用于二次创新,我们可以将其替换网络中的其它卷积模块可以不影响推理速度的同时让模型学习到更多的特征。OREPA是通过在线卷积重参数化(Online Convolutional Re-parameteriza…

基于Java+SSM技术的宠物领养系统设计与实现【附源码】

基于JavaSSM技术的宠物领养系统设计与实现【附源码】 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统 …

架设一台NFS服务器,并按照以下要求配置

1、开放/nfs/shared目录,供所有用户查询资料 2、开放/nfs/upload目录,为192.168.xxx.0/24网段主机可以上传目录, 并将所有用户及所属的组映射为nfs-upload,其UID和GID均为210 3、将/home/tom目录仅共享给192.168.xxx.xxx这台主机,…

【嘉立创EDA-PCB设计指南】2.详解BOM表+C0603封装绘制流程+元件封装其它注意点总结+原理图转到PCB流程

前言:本文详解BOM表C0603封装绘制流程元件封装其它注意点总结原理图转到PCB流程。最终会实现如下图所示的PCB初态。对于封装绘制的流程是一样的,所以只在第2章节对C0603进行详细的封装流程描述,对该PCB的其它元件在第3章节-元件封装的其它注意…

Windows如何安装VNC+Viewer+cpolar实现远程Ubuntu桌面?

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

基于springboot+vue的图书个性化推荐系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

STL中的stack、queue以及deque

目录 一、关于deque容器(双端队列) 1、deque的底层实现 2、deque的缺点 3、关于stack与squeue默认使用deque容器 二、stack简介 1、stack的成员函数(接口) 2、stack的模拟实现 三、queue简介 1、queue的成员函数&#xff08…

生产环境LVM磁盘扩容

使用df -Th 命令查看磁盘信息 ,可以看到当前LVM逻辑卷容量是38G [rootZ ~]# df -TH 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root xfs 38G 2.4G 36G 7% / devtmpfs devtmpfs 1.1G 0 1.1G …

「sdkman」「nvm」Linux:基于sdkman安装多版本Java;安装maven;基于nvm安装多版本nodejs;安装yarn

1. 基于sdkman 安装多版本Java Linux环境下管理多版本java可以使用sdkman,官网: https://sdkman.io/ 需要注意sdkman 依赖 zip和unzip 命令,记得提前下载再下载sdkman 安装命令按官网走也很简单: curl -s “https://get.sdkman.io” | bash source “$HOME/.sdkman/bin/sdkm…

软件测试|使用matplotlib绘制箱型图

简介 绘制箱型图(Box Plot)是一种常用于可视化数据分布的方法,它可以显示数据的中位数、四分位数、异常值等统计信息。Matplotlib 是一个强大的 Python 数据可视化库,可以轻松绘制箱型图。在本文中,我们将介绍如何使用…

抗炎药行业分析:整体规模早已超过100亿元

抗炎药是指直接对身体内的炎症起治疗作用的药物。它具有解热、镇痛、抗炎、抗风湿的作用,如阿司匹林、布洛芬等,就属于这类药。由于炎症是人体的一种防御机能反应,会有局部渗出、水肿、毛细血管扩张等表现,而抗炎药的效应就是能改…

ONLYOFFICE:开源、免费、安全,打造定制化办公平台的最佳选择

文章目录 写在前面ONLYOFFICE是什么?ONLYOFFICE的惊艳之处齐全的插件,助你锦上添花部署一款自己的安全可靠的办公平台写在最后 写在前面 说起 Office 办公软件,我想大家最常用的应该就是微软的 Microsoft Office 以及国产的 WPS Office。两款…

大数据 - Kafka系列《一》- Kafka基本概念

目录 🐶1.1 什么是kafka 🐶1.2 Kafka可以用来做什么 🐶1.3 kafka的特点 🥙1. 高吞吐量、低延迟 🥙2. 可扩展性 🥙3. 持久性、可靠性 🥙4. 容错性 🥙5. 高并发 &#x1f436…

国产阿里的Copilot能提效30%吗?

国产阿里的Copilot能提效30%吗? Copilot简介 GitHub 和 OpenAI 共同打造的一款编程神器–Copilot, 这是一款立足于人工智能技术的编程助手。在此基础上,借助于 GitHub 庞大的代码库和来自全球的开源社区帮助,搭配 OpenAI 在自然…

日志项目1

文章目录 【C - 基于多设计模式下的同步&异步日志系统】项目介绍 前置技术1. 项目介绍2. 开发环境3. 核心技术4. 环境搭建5. 日志系统介绍5.1 为什么需要日志系统5.2 日志系统技术实现5.2.1 同步写日志5.2.2 异步写日志 6. 前置技术补充6.1 不定参函数6.1.1 不定参宏函数6…

7.6 MySQL基本函数的使用(❤❤❤)

7.6 MySQL基本函数的使用 1. 提要2. 数字函数3. 字符函数3.1 替换字符3.2 左填充字符及截取字符串 4. 日期函数4.1 日期函数4.2 表达式占位符4.3 日期偏移计算4.4 日期间隔 5. 条件函数5.1 IF语句5.2 case...when语句 1. 提要 2. 数字函数 3. 字符函数 3.1 替换字符 -- INSERT…

FPGA引脚选择(Select IO)--认知1

主要考虑功能角度(速度,电平匹配,内部程序编写)去找研究芯片内部资源 1. 关键字 HP I/O Banks, High performance The HP I/O banks are deisgned to meet the performance requirements of high-speed memory and other chip-to-…

软件测试|使用Python轻松裁剪视频

简介 裁剪视频是在视频编辑和处理中常见的任务之一,Python提供了多种库和工具,可以用来裁剪视频。在本文中,我们将详细讨论如何使用Python来裁剪视频,并提供示例代码。 步骤1:环境准备 首先,我们要安装必…

如何使用CureIAM自动清理GCP基础设施中的IAM账号权限

关于CureIAM CureIAM是一款针对GCP基础设施的账号权限安全检查与管理工具,该工具易于使用,是一个功能强大且易于使用的可靠高性能引擎。在该工具的帮助下,广大研究人员能够以自动化的形式在GCP云基础设施上实践最低权限原则。 CureIAM可以允…

如何在Linux运行RStudio Server并实现Web浏览器远程访问

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” 文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. …