首页 > 其他分享 >12_FreeRTOS消息队列

12_FreeRTOS消息队列

时间:2024-03-28 20:35:56浏览次数:16  
标签:12 err FreeRTOS 队列 void queue key date

FreeRTOS消息队列

队列简介

image-20240325172618356

image-20240325172702439

image-20240325172711815

image-20240325172720935

image-20240325172734247

image-20240325172742249

队列操作基本过程

image-20240325172801400

队列结构体介绍

image-20240326141028645

image-20240325172853553

队列结构体整体示意图:

image-20240325172907593

队列相关API函数介绍

image-20240326142630465

创建队列相关API函数介绍

image-20240326142648352

image-20240325172931983

image-20240325172945546

往队列写入消息API函数

image-20240326142725016

image-20240325173003905

image-20240325173010247

image-20240325173019352

从队列读取消息API函数

image-20240326142755331

image-20240325173033660

image-20240325173045283

队列操作实验

image-20240325173059283

代码

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"

/******************************************************************************************************/
/*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;

#define TASK3_STACK_SIZE 		128
#define TASK3_PRIO				4
TaskHandle_t task3_handler;

QueueHandle_t key_queue;		/* 小数据 */
QueueHandle_t big_date_queue;	/* 大数据 */
char buff[100] = {"我是一个大数组 sdjfsdj 865463"};

 
void start_task( void * pvParameters );

void task1( void * pvParameters )
{
	BaseType_t err = 0;
	uint8_t key = 0;
	char * buf = buff; /* buf = &buff[0] */
	while(1)
	{
		key = key_scan(0);
		if(key == KEY0_PRES || key == KEY1_PRES)
		{
			 err = xQueueSend(key_queue, &key, portMAX_DELAY); //死等
			if(err != pdTRUE)
			{
				printf("key_queue队列写入失败!!!\r\n");
			}
		}else if(key == WKUP_PRES)
		{
			err = xQueueSend(big_date_queue, &buf, portMAX_DELAY);
			if(err != pdTRUE)
			{
				printf("big_date_queue队列写入失败!!!\r\n");
			}
		}
		vTaskDelay(10);
	}
}

void task2( void * pvParameters )
{
	uint8_t key = 0;
	BaseType_t err = 0;
	while(1)
	{
		err = xQueueReceive(key_queue, &key, portMAX_DELAY); //死等
		if(err != pdTRUE)
		{
			printf("key_queue队列读取失败!!!\r\n");
		}else
		{
			printf("key_queue队列读取成功, 数据为: %d!!!\r\n", key);
		}
	}
}

void task3( void * pvParameters )
{
	char * buf;
	BaseType_t err = 0;
	
	while(1)
	{
		err = xQueueReceive(big_date_queue, &buf, portMAX_DELAY); //死等
		if(err != pdTRUE)
		{
			printf("big_date_queue队列读取失败!!!\r\n");
		}else
		{
			printf("big_date_queue队列读取成功, 数据为: %s!!!\r\n", buf);
		}
		delay_ms(10);
	}
}


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

/**
 * @brief       FreeRTOS例程入口函数
 * @param       无
 * @retval      无
 */
void freertos_demo(void)
{
	/* 队列的创建 */
	key_queue = xQueueCreate(2, sizeof(uint8_t));
	if(key_queue!=NULL)
	{
		printf("key_queue队列创建成功!!!\r\n");
	}else
	{
		printf("key_queue队列创建失败!!!\r\n");
	}
	
	big_date_queue = xQueueCreate(1, sizeof(char *));
	if(big_date_queue!=NULL)
	{
		printf("big_date_queue队列创建成功!!!\r\n");
	}else
	{
		printf("big_date_queue队列创建失败!!!\r\n");
	}
    xTaskCreate(start_task, "start_task", START_TASK_STACK_SIZE, NULL, START_TASK_PRIO, &start_task_handler);
	vTaskStartScheduler();
}

void start_task( void * pvParameters )
{
	taskENTER_CRITICAL(); //进入临界区
	xTaskCreate(task1, "task1", TASK1_STACK_SIZE, NULL, TASK1_PRIO, &task1_handler);
	xTaskCreate(task2, "task2", TASK2_STACK_SIZE, NULL, TASK2_PRIO, &task2_handler);
	xTaskCreate(task3, "task3", TASK3_STACK_SIZE, NULL, TASK3_PRIO, &task3_handler);
    vTaskDelete(NULL);
	taskEXIT_CRITICAL(); //退出临界区
}

标签:12,err,FreeRTOS,队列,void,queue,key,date
From: https://www.cnblogs.com/mzx233/p/18102551

相关文章

  • 11_FreeRTOS时间管理
    FreeRTOS时间管理延时函数介绍延时函数演示实验代码freertos_demo.c/*******************************************************************************************************@filefreertos.c*@author正点原子团队(ALIENTEK)*@version......
  • 14_队列集
    队列集队列集简介队列集相关API函数介绍创建队列集往队列集中添加队列从队列集中移除队列获取队列集中有有效消息的队列队列集操作实验代码freertos_demo.c/***********************************************************************************************......
  • P1284 三角形牧场
    原题链接题解1.看到数据范围很小,所以我们可以穷举如何穷举呢?三个方向的背包dp,令\(dp[i][j][k]\)来表示三边长度为\(i,j,k\)时能否达到,然后最外面一维是所用的木板由于她想用所有的木板所以\(k=total-i-j\),所以可以变成两维注意这里的背包dp要倒着来,不然继承的状态是......
  • 12-Ajax异步交互技术
     同步与异步操作最主要的区别:同步操作必须按照以上步骤执行,而异步操作在第四步响应客户端时,可以继续执行第二步请求服务器,即客户端可以执行其它操作 数据地址:console-mock.apipost.cn/mock/4250f8d4-b605-47eb-9777-07e29548dbb8/list <!DOCTYPEhtml><htmllang="......
  • P1265 公路修建
    原题链接题解1.每个城市选择一个与它最近的城市2.如果三个或以上的城市申请修建的公路成环。如下图,A申请修建公路AB,B申请修建公路BC,C申请修建公路CA。则政府将否决其中最短的一条公路的修建申请;但是这条不成立,请看这条题解或者下图由此得出这题就是最小生成树,虽略有......
  • 深入了解RabbitMQ:构建高效的消息队列系统(三)
    本系列文章简介:        本系列文章将深入了解RabbitMQ的工作原理、特性和最佳实践。我们将介绍如何安装和配置RabbitMQ服务器,以及如何开发生产者和消费者应用程序。我们还将探讨如何处理消息的持久化、消息路由和消息过滤。除此之外,我们将研究如何使用RabbitMQ进行负......
  • 深入了解RabbitMQ:构建高效的消息队列系统(二)
    本系列文章简介:        本系列文章将深入了解RabbitMQ的工作原理、特性和最佳实践。我们将介绍如何安装和配置RabbitMQ服务器,以及如何开发生产者和消费者应用程序。我们还将探讨如何处理消息的持久化、消息路由和消息过滤。除此之外,我们将研究如何使用RabbitMQ进行负......
  • 西门子变频器G120C固件版本升级
    前言:现场使用的变频器损坏购买新变频器更换,下载参数是发现固件版本不一致;现场使用变频器固件版本为4.1.10;购买的变频器版本为4.7.6;通过组态没办法更改版本,只能通过升级固态版本解决;下载固件根据对应地址下载完成后,解压至内存卡中;根据升级步骤进行升级即可;......
  • ARC112F 做题记录
    link主要记录一下这种题的做题过程。第一步我们发现第\(j\)种牌每满\(2j\)张就会向下一位进一,考虑套路:我们用第\(1\)种牌来表示第\(j\)种牌,权值为\(W_{j-1}=\prod\limits_{i=1}^{j-1}2i\)。这样我们可以只用第\(1\)种牌的数量,即一个数来代替一组牌,不妨设初始数......
  • DSP-CCS12在线仿真,设置断点提示AET资源不够!
    刚刚开始学习DSP,在用CCS12开发环境在线仿真时出现这样的提示:"ThistaskcannotbeaccomplishedwiththeexistingAETresources."网上查找一番,得出这样的解释:CCS会默认载入工程上一次设置的断点,会占用断点资源;另外,手动暂停和使能CIO功能也会占用一个断点。这样很容易就就出现......