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

本文是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.mfbz.cn/a/555482.html

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

相关文章

极狐GitLab x LigaAI,AI 时代研发提效新范式

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 近日,极狐GitLab 和 LigaAI 宣布合作,双…

分布式锁设计

一、为什么需要分布式锁 1.1 单体项目同步实现 在单进程(启动一个jvm)的系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步,使其在修改这种变量时能够线…

vue2中props属性设置一个对象或数组的默认值

在Vue.js中,如果您想要为一个props属性设置一个对象或数组的默认值,您应该使用一个函数来返回这个默认值。这是因为对象和数组是引用类型,直接将它们作为默认值可能会导致预设的默认值被所有实例共享,这不是我们想要的结果。 下面…

zabbix 自定义模板,邮件报警,代理服务器,自动发现与自动添加及snmp

目录 一. 自定义监控内容 1. 在客户端创建自定义 key 2. 在 web 页面创建自定义监控项模块 2.1 创建模板 2.2 创建应用集 2.3 创建监控项 2.4 创建触发器 2.5 创建图形 2.6 将主机与模板关联起来 登录测试 2.7 设置邮件报警 测试邮件报警 3. nginx 服务状况的检测…

Vue中SourceMap的使用方法详解

目录 一、概述 二、使用方法 三、生成SourceMap 四、优化 五、结语 一、概述 Vue.js是一套构建用户界面的渐进式框架,通过HTML模板或者直接写render函数可以快速开发单页应用。在开发过程中,很多时候我们需要调试代码,追踪错误。Vue官方…

Linux:调试器 - gdb

Linux:调试器 - gdb gbd基本概念gbd调试浏览断点运行变量 gbd基本概念 GDB (GNU Debugger) 是一个强大的命令行调试工具,用于调试各种编程语言(如C、C、Java、Python等)编写的程序。使用 gdb可以帮助开发人员更快地定位和修复程序中的缺陷,提高代码质量和开发效率。…

Python介绍(未完)

文章目录 Python 背景知识Python 是谁创造的?Python 可以用来干什么?Python 的优缺点 搭建 Python 环境安装 Python搭建 PyCharm 环境新工具到手,赶紧试试中文设置第一个Python程序 Python基础语法基础语法(1)常量和表…

Error : java 错误 : 不支持发行版本5 ( 完美解决)

解决方案 1. 原因 idea的默认配置JDK版本与当前项目所需版本不一样 方案一(每一个项目可能都要配置一遍) Ctrlshitalts 打开项目结构,设置项目所需的JDK版本,本项目需要JDK8 Modules的JDK版本为5,这时就会报Error …

最大公约数和最小公倍数(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现最大公约数函数&#xff1b; int max(int x, int y) {//初始化变量值&#xff1b;int judge 1;//运算&#xff1b;judge x %…

Ubuntu 23.10.1 nginx源码安装

注&#xff1a;以下所有命令均在root管理员模式下&#xff0c;若不是&#xff0c;请在所有命令前加sudo 1、安装依赖库 1.1、安装gcc g的依赖库 apt-get install build-essential apt-get install libtool1.2、安装pcre依赖库 apt-get update apt-get install libpcre3 lib…

剑指Offer题目笔记33(并查集)

面试题116&#xff1a; 解决方案&#xff1a; ​ 一个班级可以包含一个或多个朋友圈&#xff0c;对应的图中可能包含一个或多个子图&#xff0c;每个朋友圈对应一个子图。因此&#xff0c;这个问题可以转化为如何求图中子图的数目。图的搜索算法可以用来计算图中子图的数目。扫…

企业Linux特殊权限位/为什么会存在SUID?/企业环境测试(原理剖析)-4989字解析

企业高薪思维&#xff1a; 坚持很难&#xff0c;优秀的人才是少数&#xff0c;很重要 坚持不下去&#xff0c;问自己想要什么&#xff1f; 问问自己想要好的生活状态&#xff1f;问自己有背景吗&#xff1f;你学历是亮点吗&#xff1f;有钱没&#xff0c;你也就是一般家庭&…

selenium 下载文件取消安全下载的方法

问题描述 我要从一个网站上下载文件&#xff0c;谷歌浏览器总是自动阻止下载&#xff0c;并询问我是否保留。 可是&#xff0c;我想要的是不要询问&#xff0c;默认下载即可。 运行环境 OS: macOSselenium: 4.19.0python: 3.10.11Chrome: 124.0.6367.62selenium chromedrive…

工会排队模式:创新营销的双赢之道

工会排队模式全面解读 在当今数字化营销的大潮中&#xff0c;促销方式层出不穷&#xff0c;但能真正抓住消费者眼球并带来双方共赢的模式并不多见。而工会排队模式便是在这样的背景下崭露头角&#xff0c;它巧妙地融合了工会积分、奖金池与排队机制&#xff0c;为消费者与商家…

linux进阶篇:重定向和管道操作

Linux中的重定向和管道操作 llinux中的三种IO设备&#xff1a; 标准输入&#xff08;STDIN&#xff09;,文件描述符号为&#xff1a;0&#xff0c;默认从键盘获取输入 标准输出&#xff08;STDOUT&#xff09;,文件描述符号位&#xff1a;1&#xff0c;默认输出到显示终端 标准…

java宠物领养系统的设计与实现(springboot+mysql+源码)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的宠物领养系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于Spring Bo…

udemy视频教程下载:AI和ChatGPT提示工程精通指南

欢迎来到 ChatGPT 大师班&#xff01; 这个 ChatGPT 大师班&#xff1a;AI 和提示工程指南是您通往 AI 未来的全通道通行证。 以下是您的学习旅程&#xff1a; 理解和掌握 ChatGPT&#xff1a;您将深入了解 AI 和语言模型&#xff0c;重点是 ChatGPT。我们设计了这个部分&am…

Linux--进程间的通信-命名管道

前文&#xff1a; Linux–进程间的通信-匿名管道 Linux–进程间的通信–进程池 命名管道的概念 命名管道是一种进程间通信&#xff08;IPC&#xff09;机制&#xff0c;运行不同进程之间进行可靠的、单向或双向的数据通信。 特点和作用&#xff1a; 跨平台性&#xff1a;在W…

ue4打包多模块

首先&#xff0c;每个模块&#xff0c;包含插件内的模块在内&#xff0c;都要用IMPLEMENT_MODULE(类名, 模块名)的方式&#xff0c;模块名就是带.build.cs的第一个单词。 build.cs里就说了这个模块该怎么用&#xff0c;用c#编写。 打包中要考虑到target.cs,将工程中相应的模块…

Linux服务器磁盘满了如何清理

生产环境中&#xff0c;磁盘很容易被日志文件沾满&#xff0c;如何查找和清理呢&#xff1f; 分享一下个人的经验&#xff1a; 1.先查询到哪个磁盘占用的最多 使用命令&#xff1a;df -h 2.查询/目录下磁盘占用情况 使用命令&#xff1a;du -sh * 3.同理进入占用磁盘比较大…
最新文章