首页 > 其他分享 >14_队列集

14_队列集

时间:2024-03-28 20:34:38浏览次数:21  
标签:handle 14 队列 void queue key include

队列集

队列集简介

image-20240328151420716

队列集相关API函数介绍

image-20240328151448059

创建队列集

image-20240328151547760

往队列集中添加队列

image-20240328151625970

从队列集中移除队列

image-20240328151750746

获取队列集中有有效消息的队列

image-20240328151841947

队列集操作实验

image-20240328151856559

代码

freertos_demo.c

/**
 ****************************************************************************************************
 * @file        freertos.c
 * @author      正点原子团队(ALIENTEK)
 * @version     V1.4
 * @date        2022-01-04
 * @brief       FreeRTOS 移植实验
 * @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
 ****************************************************************************************************
 * @attention
 *
 * 实验平台:正点原子 探索者F407开发板
 * 在线视频:www.yuanzige.com
 * 技术论坛:www.openedv.com
 * 公司网址:www.alientek.com
 * 购买地址:openedv.taobao.com
 *
 ****************************************************************************************************
 */

#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"
#include "./MALLOC/malloc.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
/******************************************************************************************************/
/*FreeRTOS配置*/

/* START_TASK 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define START_TASK_STACK_SIZE 	128
#define START_TASK_PRIO			1
TaskHandle_t start_task_handler;

#define TASK1_STACK_SIZE 		128
#define TASK1_PRIO				2
TaskHandle_t task1_handler;

#define TASK2_STACK_SIZE 		128
#define TASK2_PRIO				3
TaskHandle_t task2_handler;

QueueSetHandle_t queue_set_handle;
QueueHandle_t queue_handle;
QueueHandle_t semphr_handle;

void start_task( void * pvParameters );

void task1( void * pvParameters )
{
	uint8_t key = 0;
	BaseType_t err;
	while(1)
	{
		key = key_scan(0);
		if(key == KEY0_PRES)
		{
			err = xQueueSend(queue_handle, &key, portMAX_DELAY);
			if(err == pdTRUE)
			{
				printf("队列写入成功!!!\r\n");
			}
		}else if(key == KEY1_PRES)
		{
			err = xSemaphoreGive(semphr_handle);
			if(err == pdPASS)
			{
				printf("信号量释放成功!!!\r\n");
			}
		}
	}
}

void task2( void * pvParameters )
{
	QueueSetMemberHandle_t member_handle;
	uint8_t key;
	BaseType_t err;
	while(1)
	{
		member_handle = xQueueSelectFromSet(queue_set_handle, portMAX_DELAY);
		if(member_handle == queue_handle)
		{
			err = xQueueReceive(member_handle, &key, portMAX_DELAY);
			if(err == pdTRUE)
			{
				printf("queue_handle的值为:%d\r\n", key);
			}
		}else if(member_handle == semphr_handle)
		{
			err = xSemaphoreTake(member_handle, portMAX_DELAY);
			if(err == pdTRUE)
			{
				printf("semphr_handle获取信号量成功!!!\r\n");
			}
		}
	}
}

/******************************************************************************************************/

/**
 * @brief       FreeRTOS例程入口函数
 * @param       无
 * @retval      无
 */
void freertos_demo(void)
{
    xTaskCreate(start_task, "start_task", START_TASK_STACK_SIZE, NULL, START_TASK_PRIO, &start_task_handler);
	vTaskStartScheduler();
}

void start_task( void * pvParameters )
{
	taskENTER_CRITICAL(); //进入临界区
	queue_set_handle = xQueueCreateSet(2); //创建队列集,可以存放2个队列
	if(queue_set_handle != NULL)
	{
		printf("队列集创建成功!!!\r\n");
	}else
	{
		printf("队列集创建失败!!!\r\n");
	}
	queue_handle = xQueueCreate(1, sizeof(uint8_t)); //创建队列
	if(queue_handle != NULL)
	{
		printf("队列创建成功!!!\r\n");
	}else
	{
		printf("队列创建失败!!!\r\n");
	}
	semphr_handle = xSemaphoreCreateBinary(); //创建二值信号量
	if(semphr_handle != NULL)
	{
		printf("二值信号量创建成功!!!\r\n");
	}else
	{
		printf("二值信号量创建失败!!!\r\n");
	}
	xQueueAddToSet(queue_handle, queue_set_handle); //添加队列到队列集
	xQueueAddToSet(semphr_handle, queue_set_handle); ////添加二值信号量到队列集
	xTaskCreate(task1, "task1", TASK1_STACK_SIZE, NULL, TASK1_PRIO, &task1_handler);
	xTaskCreate(task2, "task2", TASK2_STACK_SIZE, NULL, TASK2_PRIO, &task2_handler);
    vTaskDelete(NULL);
	taskEXIT_CRITICAL(); //退出临界区
}

队列集使用流程

image-20240328151914790

标签:handle,14,队列,void,queue,key,include
From: https://www.cnblogs.com/mzx233/p/18102553

相关文章

  • 软件工程日报014
     第14天第二天第三天第四天第五天所花时间(包括上课) 5h    代码量(行) 1000    博客园(篇) 1    所学知识 ListView,RecyclerView    ......
  • Android14 新特性及变更
    目录一、Android14基本信息1.2迁移到Android14二、针对所有应用的变更2.1字体缩放2.2sdk版本>=33的变更2.2.1默认拒绝设定精确的闹钟2.2.2授予对照片和视频的部分访问权限2.3上下文注册的广播会在应用缓存期间加入队列2.4应用只能终止自己的后台进程2.5最低可安装的......
  • 深入了解RabbitMQ:构建高效的消息队列系统(三)
    本系列文章简介:        本系列文章将深入了解RabbitMQ的工作原理、特性和最佳实践。我们将介绍如何安装和配置RabbitMQ服务器,以及如何开发生产者和消费者应用程序。我们还将探讨如何处理消息的持久化、消息路由和消息过滤。除此之外,我们将研究如何使用RabbitMQ进行负......
  • 深入了解RabbitMQ:构建高效的消息队列系统(二)
    本系列文章简介:        本系列文章将深入了解RabbitMQ的工作原理、特性和最佳实践。我们将介绍如何安装和配置RabbitMQ服务器,以及如何开发生产者和消费者应用程序。我们还将探讨如何处理消息的持久化、消息路由和消息过滤。除此之外,我们将研究如何使用RabbitMQ进行负......
  • 014、渭川田家
    014、渭川田家唐●王维斜阳照墟落,穷巷牛羊归。野老念牧童,倚杖候荆扉。雉雊麦苗秀,蚕眠桑叶稀。田夫荷锄至,相见语依依。即此羡闲逸,怅然吟《式微》。 【现代诗意译】渭水农家 西斜阳光映照着渭水边的小村落,深巷里牧童赶着牛羊归来。老农夫惦念放牧晚归的牧童,拄着拐杖......
  • 6.2GHz默秒全!酷睿i9-14900KS图赏
    Intel日前发布了酷睿14代家族的顶级限量版本——i9-14900KS,国行定价6299元。它在历史上第一次将PC处理器的加速频率做到了惊人的6.2GHz,超频更是破9.1GHz!连创四大世界记录。现在,这款处理器已经来到我们评测室,下面为大家带来图赏。i9-14900KS可以看作是i9-14900K的特挑加速版,同样......
  • 消息队列的七种经典应用场景
    在笔者心中,消息队列,缓存,分库分表是高并发解决方案三剑客。在职业生涯中,笔者曾经使用过ActiveMQ、RabbitMQ、Kafka、RocketMQ这些知名的消息队列。这篇文章,笔者结合自己的真实经历,和大家分享消息队列的七种经典应用场景。1异步&解耦笔者曾经负责某电商公司的用户服务,该......
  • 合肥工业大学oj-4014 ch4-4.车辆问题
    描述一个停车场里只停三轮车和四轮小汽车,共有m辆,轮子有n个。输入m和n的值,编程求出三轮车和小汽车各有多少辆?输入两个正整数,车辆总数m和轮子个数n,m和n均小于10000。输出三轮车和四轮小汽车的数量,以空格分开。如果无解,输出-1-1输入样例11040输出样例1010输入样......
  • 《leetcode hot100》142. 环形链表 II
    Accode:publicclassSolution{publicListNodedetectCycle(ListNodehead){ListNodeslow=head,fast=head;while(true){if(fast==null||fast.next==null)returnnull;slow=slow.next;......
  • 14个必须掌wo的数据库面试问题
    2、B+树索引和哈希索引的区别B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接,是有序的,如下图:哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希......