FreeRTOS之队列集操作(实践)

    多个任务在在同一队列中传递的同一种数据类型,而队列集能够在任务之间传递不同的数据类型。

配置流程:(更详细流程参考正点原子的教程)

1、启用队列集将configUSE_QUEUE_SETA置1)

2、创建队列集

3、创建队列或信号量

4、往队列集添加队列或信号量

5、往队列发送信息及信号量

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
#include "sys.h"
#include "semphr.h"
#include "queue.h"
/****************************************************
STM32F103C8T6单片机freertos移植实验
作者:KJX
时间:2023-12-22
*****************************************************/
//优先级
#define START_TASK_PRIO         1
//堆栈大小
#define START_STK_SIZE        128
//任务函数
void start_task(void * pvParameters);
//任务句柄
TaskHandle_t StartTask_Handler;

//task1优先级
#define TASK1_TASK_PRIO      	3
//task1堆栈大小
#define TASK1_STK_SIZE        128
//task1函数声明
void task1_task(void * pvParameters);
//task1任务句柄
TaskHandle_t  Task1Task_Handler;

//task2优先级
#define TASK2_TASK_PRIO      	2
//task2堆栈大小
#define TASK2_STK_SIZE        128
//task2函数声明
void task2_task(void * pvParameters);
//task2任务句柄
TaskHandle_t  Task2Task_Handler;

//相关信号量
QueueSetHandle_t queueset_handle;
QueueHandle_t    queue_handle;
QueueHandle_t    semphr_handle;

int main(void)
{
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
		delay_init();
		uart_init(9600);
		LED_Init();
		LED0=0;	
	
		xTaskCreate((TaskFunction_t )  start_task,     //指向任务函数的指针,必须为第一个
								(char *   			) "start_task",   //任务名字
								(uint16_t 			) START_STK_SIZE, //任务堆栈大小,字为单位
								(void *         	) NULL, 		  //传递给任务函数的参数
								(UBaseType_t    	) START_TASK_PRIO,//任务优先级,数值大,则优先级大
								(TaskHandle_t * 	) &StartTask_Handler);//任务句柄(控制块)									
		vTaskStartScheduler();//开启任务调度							
}

//开始任务
//返回值为pdPASS则创建任务成功
 void start_task(void * pvParameters)
{
	    taskENTER_CRITICAL();//进入临界区,创建任务完成后,才开始执行优先级任务
        
	    //队列集相关
	    queueset_handle=xQueueCreateSet(2);//创建数列集,可存放2个队列
	    if(queueset_handle!= NULL)
		{
		    printf("队列集创建成功!!\r\n");
		}
		queue_handle = xQueueCreate(1,sizeof(uint8_t));//创建队列
		semphr_handle = xSemaphoreCreateBinary();//创建二值信号量
		
		//加入队列集
		xQueueAddToSet(queue_handle,queueset_handle);
		xQueueAddToSet(semphr_handle,queueset_handle);
		
	    //创建Task1
		xTaskCreate((TaskFunction_t ) task1_task,
								(char *   			) "task1_task",
								(uint16_t 			) TASK1_STK_SIZE,
								(void *         	) NULL,
								(UBaseType_t    	) TASK1_TASK_PRIO,
								(TaskHandle_t * 	) &Task1Task_Handler);
        //创建Task2
		xTaskCreate((TaskFunction_t ) task2_task,
								(char *   			) "task2_task",
								(uint16_t 			) TASK2_STK_SIZE,
								(void *         	) NULL,
								(UBaseType_t    	) TASK2_TASK_PRIO,
								(TaskHandle_t * 	) &Task2Task_Handler);
								
		vTaskDelete(StartTask_Handler);//删除开始任务,删除自身用NULL
		taskEXIT_CRITICAL();//退出临界区
}


//任务一,队列发送及信号量释放
void task1_task(void * pvParameters)
{    
	uint8_t key=1;
	BaseType_t err;	
	while(1)
	{
		if(key==1)
		{	    
			err=xQueueSend(queue_handle,&key,portMAX_DELAY);
		    if(err==pdPASS)
			{
			   printf("往队列写入数据成功!!\r\n");	
			}		
		}else if(key==2)
		{
		     err=xSemaphoreGive(semphr_handle);
			 if(err==pdPASS)
			 {
			    printf("释放信号量成功!!\r\n");	
			 }
		}
		vTaskDelay(10);
	}
}

//任务二,获取队列信息
void task2_task(void * pvParameters)
{   
	QueueSetMemberHandle_t  member_handle;
	uint8_t key;
	while(1)
	{
	    member_handle = xQueueSelectFromSet(queueset_handle,portMAX_DELAY);
		if(member_handle == queue_handle)
		{
		    xQueueReceive(member_handle,&key,portMAX_DELAY);
		    printf("获取的队列数据为:%d\r\n",key);
		}else if(member_handle==semphr_handle )
		{
		    xSemaphoreTake(member_handle,portMAX_DELAY);
			printf("获取信号量成功!!\r\n");
		}
		
	}
}


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java中的Stream流收集器

目录 1、归约和汇总 2、分组 3、分区 4、理解收集器接口 Java 中 Stream 流用来帮助处理集合,类似于数据库中的操作。 在 Stream 接口中,有一个抽象方法 collect,你会发现 collect 是一个归约操作(高级规约)&#…

[NISACTF 2022]easyssrf

[NISACTF 2022]easyssrf wp ssrf 的题目,提示了会使用 curl 连接输入的网站并返回响应包。 测试连接百度 直接在输入框中写 www.baidu.com 是无法连接的,需要在前面加入 http 或者 https ,因为 curl 的使用方式就是: curl htt…

linux系统和网络(二):进程和系统时间

本文主要探讨linux系统进程和系统相关知识,本博客其他博文对该文章的部分内容有详细介绍 main函数 int main(int argc,char *argv[],char *envp[]); 操作系统下main执行前先执行引导代码,编译连接引导代码和程序连接在一起构成可执行程序,加载器将程序加载到内存中…

MyBatis关联查询(三、多对多查询)

MyBatis关联查询(三、多对多查询) 需求:查询角色及角色赋予的用户信息。 分析:一个用户可以拥有多个角色,一个角色也可以赋予多个用户,用户和角色为双向的一对多关系,多对多关系其实我们看成是…

代码随想录第三十八天(一刷C语言)|零钱兑换II组合总数和 IV

创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。 一、零钱兑换II 思路:参考carl文档 1、确定dp数组以及下标的含义:凑成总金额j的货币组合数为dp[j]。 2、确定递推公式:dp[j] 就是所有的dp[j - coins[i…

lpg期货指数(LPG期货指数盘整整理)

什么是LPG期货指数? LPG期货指数是以液化石油气(Liquefied Petroleum Gas)作为标的物的期货指数,涵盖了LPG国内期货市场的价格变化。LPG是一种广泛用于家庭、工业和交通等领域的燃料。在中国,LPG期货主要交易于上海国…

面试遇到了接口分析和测试用例分析题,该如何下手?

只要有软件产品的公司百分之九十以上都会做接口测试,要做接口测试的公司那是少不了接口测试工程师的,接口测试工程师相对于其他的职位又比较轻松并且容易胜任。如果你想从事接口测试的工作那就少不了对接口进行分析,同时也会对测试用例进行研…

使用Docker-镜像命令

镜像名称一般分两部分组成:[repository]:[tag] 在没有指定tag时,默认是latest,代表最新版本的镜像 目录 案例一:从DockerHub中拉取一个nginx镜像并查看 1.1. 首先去镜像仓库搜索nginx镜像,比如DockerHub ​编辑 1.2.操作拉取n…

【算法刷题】Day23

文章目录 1. 打家劫舍 II题干:算法原理:(dp)1. 状态表示:2. 状态转移方程3. 初始化4. 填表顺序5. 返回值 代码: 2. 和为 K 的子数组题干:算法原理:1. 暴力枚举2. 前缀和 哈希表 代码…

(十七)Flask之大型项目目录结构示例【二扣蓝图】

大型项目目录结构: 问题引入: 在上篇文章讲蓝图的时候我给了一个demo项目,其中templates和static都各自只有一个,这就意味着所有app的模板和静态文件都放在了一起,如果项目比较大的话,这就非常乱&#xf…

macOS 开发 - MASShortcut

文章目录 关于 MASShortcut项目结构 快速使用源码学习检测是否有热键冲突处理 Event macOS 开发交流 秋秋群:644096295,V : ez-code 关于 MASShortcut MASShortcut 是一款快捷键管理工具,替代和兼容 ShortcutRecorder github : https://git…

解决找不到vcruntime140.dll无法继续执行的多种方法分享

最近,我在使用电脑时遇到了一个问题,即“由于找不到vcruntime140.dll无法继续执行”。vcruntime140.dll是Visual C Redistributable Packages中的一个组件,它是Visual Studio 2015中运行C程序所必需的。如果找不到vcruntime140.dll文件&#…

java-sec-code中rmi

java-sec-code中rmi 暂时没有搞懂原理,这里只说明利用方法 java-sec-code 作者给出的是使用ysoserial进行利用 测试环境搭建 docker环境下,1099端口默认不开启,这里使用idea运行org.joychou.RMI.Server即可 个人电脑java环境分为1.8.381 1.8.…

生成式AI大爆发,2024年人工智能3大发展趋势预测

人工智能(AI)多年来一直是技术界讨论的热门话题,但在2023年,它完全抓住了大众的注意力和想象力。ChatGPT和类似的技术让外行人也能接触到人工智能,生成式AI以前所未有的速度从小众走向主流。在大家都普遍认为AI存在着能力局限性的情况下&…

c# OpenCV 检测(斑点检测、边缘检测、轮廓检测)(五)

在C#中使用OpenCV进行图像处理时,可以使用不同的算法和函数来实现斑点检测、边缘检测和轮廓检测。 斑点检测边缘检测轮廓检测 一、斑点检测(Blob) 斑点检测是指在图像中找到明亮或暗的小区域(通常表示为斑点)&#…

CSS3多列分页属性

CSS3多列 Firefox浏览器支持该属性的形式是-moz-column-count,而基于Webkit的浏览器,例如Safari和Chrome,支持该属性的形式是-webkit-column-count column-count:该属性定义多列文本流中的栏数 语法:column-count:int…

机器学习 | Pandas超详细教程

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

千帆 AppBuilder 初体验,不仅解决解决了我筛选简历的痛苦,更是让提效10倍!

文章目录 🌟 前言🌟 什么是百度智能云千帆 AppBuilder🌟 百度智能云千帆 AppBuilder 初体验🌟 利用千帆AppBuilder搭建简历小助手🌟 让人眼前一亮的神兵利器 - 超级助理 🌟 前言 前两天朋友 三掌柜 去北京…

基于JSP+Servlet+Mysql的调查管理系统

基于JSPServletMysql的调查管理系统 一、系统介绍二、功能展示1.项目内容2.项目骨架3.数据库3.登录4.注册3.首页5.系统管理 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称:基于JSPServlet的调查管理系统 项目架构:B/S架构 开发语言&#…

Oracle中的异常

一、关于PL/SQL异常 二、区分ERROR 和 EXCEPTION 三、异常分类 四、PL/SQL抛出异常方法 五、处理异常 5.1捕获异常: 5.1.1如何捕获异常 5.1.2如何捕获预定义异常 5.1.3如何捕获非预定义异常 5.1.4捕获异常的两个函数 5.1.5捕获用户自定义异常 5.1.5rais…