【复习笔记】FreeRTOS(六) 队列操作

news2024/11/27 10:40:44

本文是FreeRTOS复习笔记的第六节,队列操作。

上一篇文章: 【复习笔记】FreeRTOS(五)时间片调度

文章目录

  • 1.队列操作
    • 1.1.队列操作过程
    • 1.2.队列操作常用的API函数
  • 二、实验设计
  • 三、测试例程
  • 四、实验效果


1.队列操作

队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中断之间传递消息,队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之间要交流的数据保存在队列中,叫做队列项目。队列所能保存的最大数据项目数量叫做队列的长度,创建队列的时候会指定数据项目的大小和队列的长度。由于队列用来传递消息的,所以也称为消息队列。

1.1.队列操作过程

创建队列
在这里插入图片描述
上图中任务 A 要向任务 B 发送消息,这个消息是x 变量的值。首先创建一个队列,并且指定队列的长度和每条消息的长度。这里我们创建了一个长度为 4 的队列,因为要传递的是x值,而x是个 int类型的变量,所以每条消息的长度就是 int 类型的长度,在 STM32 中就是4字节,即每条消息是 4 个字节的。
向队列发送第一个消息
在这里插入图片描述
上图中任务A的变量x值为10,将这个值发送到消息队列中。此时队列剩余长度就是3了。队列中发送消息是采用拷贝的方式,所以一旦消息发送完成变量x就可以再次被使用,赋其他的值。
向队列发送第二个消息
在这里插入图片描述
上图中任务 A 又向队列发送了一个消息,即新的x 的值,这里是 20。此时队列剩余长度为 2。
从队列中读取消息
在这里插入图片描述
上图中任务 B 从队列中读取消息,并将读取到的消息值赋值给 y,这样 y 就等于 10了。任务 B 从队列中读取消息完成以后可以选择清除掉这个消息或者不清除。当选择清除这个消息的话其他任务或中断就不能获取这个消息了,而且队列剩余大小就会加一,变成 3。如果不清除的话其他任务或中断也可以获取这个消息,而队列剩余大小依旧是 2。

队列的内容除了队列的创建、队列的出队、入队函数、队列的环形缓冲区的实现,还有数据的拷贝、先进先出、以及后进先出的实现、队列锁、以及队列任务级函数与中断级函数的区别等知识。

由于队列的知识也比较多,这里只是进行一个简单的使用,学会队列的基本操作。

1.2.队列操作常用的API函数

函数名称作用
xQueueCreate()动态创建队列
xQueueCreateStatic()静态创建队列
xQueueSend()队列数据发送
xQueueReceive()队列数据接收

二、实验设计

实验目的:学会对FreeRTOS 简单队列操作
实验设计:设计两个任务: task1 task 和 task2 task ,其中 task1 task 和 task2 task的任务优先级相同,这两个任务的任务功能如下:

  • task1 task :发送一串字符
  • task2 task :接收任务1的字符

三、测试例程

主函数 main.c代码如下:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"


/*使用结构体储存数据*/
struct QueuePrint
{
	uint8_t Tick;
	char Data[20];
};

QueueHandle_t myPrintfQueue;

void task1_task(void *p); //任务函数
void task2_task(void *p); //任务函数


int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
	delay_init(168);		//初始化延时函数
	uart_init(115200);     	//初始化串口
	LED_Init();		        //初始化LED端口

	/*动态创建队列,2个队列项目,一个发送一个接收,以及消息长度(结构体大小)*/
	myPrintfQueue=xQueueCreate(2,sizeof(struct QueuePrint));
	if(myPrintfQueue==NULL)
	{
		printf("队列创建失败!\r\n");
	}
    xTaskCreate(task1_task,"task1_task",128,NULL,2,NULL); //任务1        
    xTaskCreate(task2_task,"task2_task",128,NULL,2,NULL);  //任务2 	
	
    vTaskStartScheduler();          //开启任务调度
}
 

//任务1函数 发送数据
void task1_task(void *p)
{
	struct QueuePrint SendData={
		.Data="adafsf" //随便发个字符串
	};

	while(1)
	{
		SendData.Tick++;
		xQueueSend(myPrintfQueue,&SendData,0); //队列句柄,发送内容的地址,阻塞时间
		printf("task1发送数据:%s 次数%d\r\n",SendData.Data,SendData.Tick);
		vTaskDelay(500);
	}
}   


//任务2函数接收数据 
void task2_task(void *p)
{

	struct QueuePrint ReceData;
	BaseType_t xStatus;
	while(1)
	{
		xStatus=xQueueReceive(myPrintfQueue,&ReceData,portMAX_DELAY);//portMAX_DELAY:读不到数据就会一直停留在此
		if(xStatus==pdPASS) //判断接收到数据
		{
			taskENTER_CRITICAL();           //进入临界区
		     printf("task2收到数据:%s 次数%d\r\n",ReceData.Data,ReceData.Tick);
			taskEXIT_CRITICAL();            //退出临界区
		}
	}
}

四、实验效果

实验效果如下:
在这里插入图片描述

接上串口,可以看到每500ms,串口打印任务1发送的内容和任务运行次数,以及任务2接收到的内容和任务执行次数,而且收发的数据保持一致。

本节主要是学习和掌握队列操作,以及相关API函数的基本使用。其实在FreeRTOS中队列的重要性也不言而喻,与FreeRTOS任务调度同等重要,因为后面的各种信号量基本都是基于队列的。
完整程序放在gitee仓库上:程序下载。

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

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

相关文章

LabVIEW供热管道泄漏监测与定位

LabVIEW供热管道泄漏监测与定位 在现代城市的基础设施建设中,供热管道系统起着极其重要的作用。然而,管道泄漏问题不仅导致巨大的经济损失,还对公共安全构成威胁。因此,开发一种高效、准确的管道泄漏监测与定位技术显得尤为关键。…

【复现】MajorDoMo 远程命令执行漏洞_73

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 MajorDoMo是MajorDoMo社区的一个开源DIY智能家居自动化平台。 该漏洞源于文件thumb.php存在命令执行漏洞。 二 .漏洞影响 通过提交…

如何理解Vue 3组件的component关键字

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

个人网站制作 Part 24 添加用户反馈功能[Userback] | Web开发项目添加页面缓存

文章目录 👩‍💻 基础Web开发练手项目系列:个人网站制作🚀 添加用户反馈功能🔨使用反馈工具🔧步骤 1: 选择反馈工具🔧步骤 2: 注册Userback账户🔧步骤 3: 获取反馈按钮代码 使用Vue.…

排序(四)——归并排序 + 外排序

目录 1.归并排序递归实现 代码 2.归并排序非递归 代码 3.比较快排、归并和堆排序 4.归并排序实现外排序 1.归并排序递归实现 我们之前对两个有序数组进行排序就用到了归并的思想,对于两个有序数组,我们分别取他们首元素比较大小,取小的插…

2011年认证杯SPSSPRO杯数学建模C题(第二阶段)你的爱车入保险了吗全过程文档及程序

2011年认证杯SPSSPRO杯数学建模 C题 你的爱车入保险了吗 原题再现: 近几年,国内汽车销售市场异常火爆,销售量屡创新高。车轮上的世界,保险已经与我们如影随形。汽车保险,简称车险,是指对机动车辆由于自然…

嵌入式工程师有哪些必备技能,和电子爱好者有很大区别!

要掌握的技能实际上是非常多的。在这里,我来结合自己亲身经历,从技术、思维、项目管理等方面来谈一下我认为嵌入式开发需要掌握的技能。 技术方面 C语言和汇编语言能力 C语言是嵌入式开发最核心的编程语言。在我的初学阶段,我花费了很多时间…

微服务项目实战-黑马头条(三):APP端文章详情

文章目录 一、文章详情-实现思路1.1 传统实现方式1.2 静态模版分布式文件系统 二、FreeMaker模板引擎2.1 FreeMaker 介绍2.2 环境搭建&&快速入门2.2.1 创建测试工程2.2.2 配置文件2.2.3 创建模型类2.2.4 创建模板2.2.5 创建controller2.2.6 创建启动类2.2.7 测试 2.3 F…

常用的数据结构及算法

一、数据结构 (一)线性结构:一对一。 1.可以使用数组、链表来表示。数组又分为静态数组和动态数组两种。链表常用的是单链表。 2.两种特殊的线性结构:队列和栈。其中队列是先进先出(排队),栈…

OCR识别图片的字体与正常的字不同怎么调回来呢?

一般来说,OCR的任务是将图片文字转化成计算机可编辑的文字,一般不识别字体,当然,也不排除某些OCR软件可以识别字体的,具体来说,造成这种现象的可能原因如下: 1. **字体匹配问题**:OC…

IPFS分布式存储系统

一、 引言 IPFS是InterPlanetary File System的缩写。它是一个分布式的网络传输协议,它可以把文件分成很多小块放到服务器的不同地方,然后用一种特别的方式来寻找和传输这些小块。这样,我们就可以更快、更安全、更抗容错了的存储文件了。 可能…

FinalShell 远程连接 Linux(Ubuntu)系统

Linux 系列教程: VMware 安装配置 Ubuntu(最新版、超详细)FinalShell 远程连接 Linux(Ubuntu)系统Ubuntu 系统安装 VS Code 并配置 C 环境 ➡️➡️➡️提出一个问题:为什么使用 FinalShell 连接&#xff0…

文件msvcr120.dll丢失怎样修复?这三种方法能准确修复msvcr120.dll

小编为大家总结了解决msvcr120.dll文件缺失问题的三种方法,以帮助你快速解决这一难题。首先,我们来看看msvcr120.dll文件为何会出现丢失的情形。 一.msvcr120.dll丢失问题的常见原因包括 病毒感染:病毒或恶意软件侵入电脑有可能会损毁或删除…

NPL预训练模型-GPT-3

简介及特点 GPT-3是一个由OpenAI开发的自然语言处理(NLP)预训练模型,它是生成式预训练变换器(Generative Pretrained Transformer)系列的第三代模型。GPT-3以其巨大的规模和强大的语言处理能力而闻名,具有…

LLM学习笔记-1

过往历史 ​​ 大体框架 手戳GPT2-small 一些概念 pytorch注意力机制(Transformer)LLM 过程 模型参数 GPT_CONFIG_124M {"vocab_size": 50257, # 词表大小"ctx_len": 1024, # 上下文长度"emb_dim": 768, # 嵌入维度"n…

python笔记 | 哥德巴赫猜想

哥德巴赫猜想:每个不小于6的偶数都可以表示成两个素数之和。 素数:只能被1和自身整除的正整数。就是大于1且除了1和它本身之外没有其他因数的数。例如,2、3、5、7、11等都是素数,而4、6、8、9等则不是素数。 下面这段Python代码…

vue实现文字转语音的组件,class类封装,实现项目介绍文字播放,不需安装任何包和插件(2024-04-17)

1、项目界面截图 2、封装class类方法(实例化调用) // 语音播报的函数 export default class SpeakVoice {constructor(vm, config) {let that thisthat._vm vmthat.config {text: 春江潮水连海平,海上明月共潮生。滟滟随波千万里&#xf…

力扣哈哈哈哈

public class MyStack {int top;Queue<Integer> q1;Queue<Integer> q2;public MyStack() {q1new LinkedList<Integer>();q2new LinkedList<Integer>();}public void push(int x) {q2.offer(x);//offer是入队方法while (!q1.isEmpty()){q2.offer(q1.pol…

内网代理技术总结

代理技术就是解决外网和内网的通信问题&#xff0c;例如&#xff0c;我的一个外网主机想要找到另外一个网段下的一个内网主机&#xff0c;理论上是无法找到的。如果我们想要进行通信的话就要使用代理技术。我们可以找到一个与目标内网主机在容易网段下可以通信的外网主机&#…