8.FreeRTOS_队列集

news2024/12/25 12:40:57

队列集使用在系统需要支持多个输入设备的情况,这是每个输入设备的数据都存放在一个队列中,队列集将他们管理起来,可以实现实时识别哪一个队列中有数据并将数据读取出来。

相关配置

使用队列集的函数,需要先开启宏开关。具体操作如下:

创建队列集

函数声明如下:

QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength )

uxEventQueueLength :队列集长度,该值等于所存队列的长度之和

QueueSetHandle_t :队列集句柄

队列与队列集建立联系

队列要先与队列集建立联系,这时队列集中并没有队列的句柄。

函数声明如下:

BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,
                               QueueSetHandle_t xQueueSet )

xQueueOrSemaphore:队列句柄

xQueueSet :队列集句柄

读队列集

函数声明如下:

QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet,
                                                TickType_t const xTicksToWait )

返回值:有数据的队列句柄

xQueueSet:队列集句柄

xTicksToWait :超时时间,portMAX_DELAY为死等

验证实验

实验内容为:创建三个任务,其中两个任务分别向自己的队列中写数据,任务三对队列集进行读取,并打印读到的数据。编写步骤如下:

  • 创建任务1、任务2所用的队列
  • 创建队列集
  • 将队列与队列集建立联系
  • 编写任务处理函数:任务1,任务2不断写队列,任务3读队列集

 具体代码如下:

void Task1Function(void *param){

	int i=1;
	
	while(1){
		xQueueSend((QueueHandle_t)param,&i,portMAX_DELAY);/* 写队列 */
		i++;
		vTaskDelay(10);
	}
}
void Task2Function(void *param){
	int i=-1;
	while(1){
		xQueueSend((QueueHandle_t)param,&i,portMAX_DELAY);/* 写队列 */
		i--;
		vTaskDelay(10);
	}
}
void Task3Function(void *param){
	
	QueueSetMemberHandle_t handle;
	int i;
	
	while(1){
		
		/* 读队列集,返回有数据的队列句柄 */
		handle = xQueueSelectFromSet((QueueSetHandle_t)param,portMAX_DELAY);
		
		/* 读队列,获取数据 */
		xQueueReceive(handle,&i,0);
		
		printf("%d ",i);
		
	}
}
int main( void )
{
	
	TaskHandle_t xHandleTask1;
	TaskHandle_t xHandleTask2;
	TaskHandle_t xHandleTask3;
	QueueHandle_t QueueHandle_Test1;			/* 队列句柄,这是个指针 */
	QueueHandle_t QueueHandle_Test2;			/* 队列句柄,这是个指针 */
	QueueSetHandle_t QueueSetHandle_Test;       /* 队列集句柄,这是个指针 */
	
	struct test tParam;
	
	prvSetupHardware();
	SerialPortInit();
	printf("UART TEST\r\n");
	
	/* 1.创建队列 */
	QueueHandle_Test1 = xQueueCreate(2,sizeof(int));/* 创建队列1 */
	if(QueueHandle_Test1 == NULL){
		printf("queue create fail\r\n");
	}
	QueueHandle_Test2 = xQueueCreate(2,sizeof(int));/* 创建队列2 */
	if(QueueHandle_Test2 == NULL){
		printf("queue create fail\r\n");
	}
	
	/* 2.创建队列集 */
    /* 队列1和队列2的长度都为2,所以队列集的长度=2+2=4 */
	QueueSetHandle_Test = xQueueCreateSet(4);
	
	/* 3.队列与队列集建立链接 */
	xQueueAddToSet(QueueHandle_Test1,QueueSetHandle_Test);
	xQueueAddToSet(QueueHandle_Test2,QueueSetHandle_Test);
	
	/* 4.创建任务 */
	xTaskCreate(Task1Function,"Task1",100,(void*)QueueHandle_Test1,2,&xHandleTask1);
	xTaskCreate(Task2Function,"Task2",100,(void*)QueueHandle_Test2,1,&xHandleTask2);
	xTaskCreate(Task3Function,"Task3",100,(void*)QueueSetHandle_Test,1,&xHandleTask3);
	
	vTaskStartScheduler();
	
	return 0;
}

运行结果如下:

可以看到任务3已经读到了来自任务1、任务2写入队列1、队列2的数据。

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

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

相关文章

N1 - OneHot编码

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目录 one-hot编码优点缺点 英文文本案例中文文本案例中文结巴分词示例作业心得体会 one-hot编码 自然语言处理(NLP)入门,绕…

Go: IM系统技术架构梳理

概述 整个IM系统的一般架构如下 我们这张图展示了整个IM系统的一般架构可见分为四层那最上面这一层是前端,包括哪些东西呢? 它包括两部分,第一部分是跟用户直接交互的比如说各种IOS APP, 各种安卓 APP还有各种 web APP 在浏览器里面打开的以…

【爬虫】爬虫基础

目录 一、Http响应与请求1、Http请求2、Http响应3、状态码 二、Requests库1、发起GET请求2、发起POST请求3、处理请求头 三、BeautifulSoup库1、解析HTML文档2、查找和提取数据Ⅰ、查找单个元素Ⅱ、查找所有元素Ⅲ、使用CSS选择器Ⅳ、获取元素属性 四、爬取豆瓣电影榜 一、Http…

PBE注册/PBE汉化/美测服汉化/美测服下载/美测服注册教程

英雄联盟PBE美测服是一个可以提前参与游戏测试,提前享受英雄联盟或者云顶之弈新版本的服务器,我们可以更快的了解到游戏的更新内容,很多玩家都想要游玩pbe美测服,下面我就个idaj带来美测服汉化/美测服下载/美测服注册教程&#xf…

【动态规划Ⅰ】斐波那契、爬楼梯、杨辉三角

动态规划—斐波那契系列 什么是动态规划斐波那契数组相关题目509. 斐波那契数 Easy1137. 第 N 个泰波那契数 Easy 杨辉三角118. 杨辉三角 Easy 爬楼梯相关题目70. 爬楼梯 Easy746. 使用最小花费爬楼梯 Easy 什么是动态规划 动态规划是一种通过将原问题分解为相对简单的子问题来…

【代码规范】.train(False)和.eval()的相似性和区别

【代码规范】.train(False)和.eval()的相似性和区别 文章目录 一、.train(False) 和 .eval() 的功能二、.train(False) 和 .eval() 的区别2.1 .eval()2.2 .train(False)2.3 总结 三、.eval()更加规范 一、.train(False) 和 .eval() 的功能 .train(False) 和 .eval() 在功能上非…

STM32CubeMX配置STM32G071输入捕获(HAL库开发)

1.时钟配置HSI主频配置64M 2.配置好串口,选择异步模式 3.配置TIM1_CH1产生1KHz的信号,主频64MHz,分频(64-1),计数周期(1000-1),这样即可生成1KHz信号。 4.配置TIM3_CH1和…

Linux 07:基础IO

stdin & stdout & stderr C默认会打开三个输入输出流,分别是stdin, stdout, stderr。仔细观察发现,这三个流的类型都是FILE*, fopen返回值类型,文件指针。 文件读取函数(库函数): fopen、fread、…

2024 年你需要知道的免费 API-独立产品灵感周刊 DecoHack #061

本周刊记录有趣好玩的独立产品设计开发相关内容,每周发布,往期内容同样精彩,感兴趣的伙伴可以 点击订阅我的周刊。为保证每期都能收到,建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。 💻 产品推荐 1. Pintree 首先…

01- 收入数据集【Pytorch入门实战】

目录 一、机器学习基础 二、实战例子 1.数据集分析 2.实战训练 3.总结 三、参考资料 一、机器学习基础 为了解决这个问题,人们想到数据驱动方法,也就是让计算机从现有的大量的带标签图片电学习规律,一旦计算机学习到了其中的规律&…

【绝命Coding助力秋招】Python实现<实习僧>海投脚本

hello hello~ ,这里是绝命Coding——老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页:绝命Coding-CSDN博客 &a…

异常、File

异常、File 异常 异常就是代表程序出现的问题 Error:代表的系统级别错误(属于严重问题)。系统一旦出现问题,sun公司会把这些错误封装成Error对象。Error是给sun公司自己用,不是给我们程序员用的。因此我们开发人员不…

SpringCloud--常用组件和服务中心

常用组件 Euroke和nacos 区别 负载均衡 负载均衡策略有哪些 自定义负载均衡策略

AV1 编码标准中帧内预测技术概述

AV1 编码标准帧内预测 AV1(AOMedia Video 1)是一种开源的视频编码格式,旨在提供比现有标准更高的压缩效率和更好的视频质量。在帧内预测方面,AV1相较于其前身VP9和其他编解码标准,如H.264/AVC和H.265/HEVC,…

自建文件分享平台Pingvin Share系统

Pingvin Share可以用来代替 WeTransfer 等的分享网站,如果你有自己的服务器,可以支持通过 Docker 部署或者 Stand-alone 部署。 功能介绍 完全自建:轻松使用私有服务器搭建文件共享平台 完全隐私:你的文件只属于你!不…

相交链表+判断环型链表+求环型链表的入口节点

链表OJ题 一.相交链表二.判断环型链表三.求环型链表的入口节点 一.相交链表 相交链表 相交:两个链表从头开始遍历,尾节点一定是同一个节点。 情况一:当两个链表长度相同时: 情况二:当两个链表长度不同时&#xff1…

【详解】Spring Cloud概述

🎥 个人主页:Dikz12🔥个人专栏:Spring学习之路📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 1. 认识微服务 1.1 单体架构 1.2 集群和分布式架构 1.3 集群和分布式…

如何利用windows本机调用Linux服务器,以及如何调用jupyter界面远程操控

其实这篇文章没必要存在,教程太多了 参考博客(1 2 3),如侵删 奈何网上的大神总是会漏掉一些凡人遇到的小问题 (1) 建议下载PuTTy for windows,从而建立与远程服务器的SSH连接 需要确认目标服…

nodejs安装部署运行vue前端项目

文章目录 1.安装nodejs2.安装Vue CLI1.配置npm镜像源:2.安装Vue CLI:3.创建Vue项目4.启动Vue项目5.Express 1.安装nodejs Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境,它让开发人员能够创建服务器、Web 应用、命令行工具和脚…

【C++PythonJava】字符处理详细解读_字符_ASCLL码_字母数字转换_算法竞赛_开发语言

文章目录 Beginning1)ASCLL 码2)大小比较2)判断数字字符3)字符、数字间的相互转换End Beginning 在 C 中,字符和整数有着密不可分的关系。原因就是在计算机中,字符是以一种较 ASCLL 码的整数存储的。自然&…