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

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

上一篇文章: 【复习笔记】reeRTOS(四) 列表项的插入和删除

文章目录

  • 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);//设置系统中断优先级分组4delay_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.rhkb.cn/news/309114.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IP地址的主要功能及其在网络中的重要性

在当今数字化时代,互联网已经成为人们生活和工作中不可或缺的一部分。而IP地址(Internet Protocol Address)作为互联网中的关键组成部分,发挥着至关重要的作用。本文将探讨IP地址的主要功能以及其在网络中的重要性。 IP地址查询&…

Xcode 15.0 新 #Preview 预览让 SwiftUI 界面调试更加悠然自得

概览 从 Xcode 15 开始,苹果推出了新的 #Preview 宏预览机制,它无论从语法还是灵活性上都远远超过之前的预览方式。#Preview 不但可以实时预览 SwiftUI 视图,而且对 UIKit 的界面预览也是信手拈来。 想学习新 #Preview 预览的一些超实用调试…

【GEE实践应用】按照字段提取想要的研究区域

有的时候,我们在GEE中加载研究区域时,我们现有的矢量数据可能不止自己想要的研究区域的范围,这个时候,为了避免在ArcGIS中重新导出打包上传等操作,我们可以在GEE中按照字段进行选择我们想要的研究区域。下面是操作实例…

杰发科技AC7840——CAN通信简介(4)_过滤器设置

0. 简介 注意:过滤器最高三位用不到,因此最高位随意设置不影响过滤器。 1. 代码分析 注意设置过滤器数量 解释的有点看不懂 详细解释...也看不大懂 Mask的第0位是0,其他位都是1(就是F?),那就指定了接收值就是这个数,…

ASP.NET Core 标识(Identity)框架系列(二):使用标识(Identity)框架生成 JWT Token

前言 JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络上以 JSON 对象的形式安全地传输信息。 JWT 通常用于在用户和服务器之间传递身份验证信息,以便在用户进行跨域访问时进行身份验证。 JWT 由…

matlab 安装 mingw64(6.3.0),OPENEXR

matlab安装openexr 1. matlab版本与对应的mingw版本选择2. mingw(6.3.0)下载地址:3. matlab2020a配置mingw(6.3.0)流程“4. matlab 安装openexr方法一:更新matlab版本方法二:其他博文方法方法三…

MySQL——链表

主键:非空 唯一(针对整列数据而言) 为了方便管理一般主键都是设置为自增 外键:一张表中的一列的值是另一张表的主键,使用外键建立两张数据表的数据关系 一、两张表连接 将两张表格拼接成一个表 1、格式:s…

爬虫 | 网易新闻热点数据的获取与保存

Hi,大家好,我是半亩花海。本项目是一个简单的网络爬虫,用于从网易新闻的热点新闻列表中提取标题和对应的链接,并将提取到的数据保存到一个 CSV 文件中。 目录 一、技术栈 二、功能说明 三、注意事项 四、代码解析 1. 导入所需…

【C++进阶】RAII思想&智能指针

智能指针 一,为什么要用智能指针(内存泄漏问题)内存泄漏 二,智能指针的原理2.1 RAII思想2.2 C智能指针发展历史 三,更靠谱的shared_ptr3.1 引用计数3.2 循环引用3.3 定制删除器 四,总结 上一节我们在讲抛异…

PostgreSQL入门到实战-第二十九弹

PostgreSQL入门到实战 PostgreSQL中数据分组操作(四)官网地址PostgreSQL概述PostgreSQL中CUBE命令理论PostgreSQL中CUBE命令实战更新计划 PostgreSQL中数据分组操作(四) 如何使用PostgreSQL CUBE生成多个分组集 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不…

InternlM2

第一次作业 基础作业 进阶作业 1. hugging face下载 2. 部署 首先,从github上git clone仓库 https://github.com/InternLM/InternLM-XComposer.git然后里面的指引安装环境

【Golang学习笔记】从零开始搭建一个Web框架(二)

文章目录 模块化路由前缀树路由 前情提示: 【Golang学习笔记】从零开始搭建一个Web框架(一)-CSDN博客 模块化路由 路由在kilon.go文件中导致路由和引擎交织在一起,如果要实现路由功能的拓展增强,那将会非常麻烦&…

[尚硅谷flink] 检查点笔记

在Flink中,有一套完整的容错机制来保证故障后的恢复,其中最重要的就是检查点。 文章目录 11.1 检查点11.1.1 检查点的保存1)周期性的触发保存2)保存的时间点3)保存的具体流程 11.1.2 从检查点恢复状态11.1.3 检查点算法…

【python】 numpy 中常用随机数函数的使用和记忆(不易混淆)

文章目录 概述固定分布随机数(只需指定形状的随机函数)np.random.randomnp.random.randnp.random.randn 随机范围随机数(需要指定范围和形状的随机函数)np.random.randintnp.random.uniformnp.random.normalnp.random.poisson 代码…

乐写9612手写板实测故障

闲鱼上淘了二手的 ①需要驱动很强的usb口,老usb口会不识别,尤其是笔记本容易不识别,非常容易出现下面这种问题: ②需要microsoft2013以上的,兼容性做的比较差 ③由于可视化,导致数据线容易烧,…

超标量处理器设计:基于竞争的分支预测分支预测的更新

★ 继续学习体系结构的知识。 接着上一讲继续写 ★上一讲:超标量处理器设计:基于全局历史的分支预测-CSDN博客 ★上上一讲:超标量处理器设计:两位饱和计数器&基于局部历史的分支预测-CSDN博客 知识回顾: 基于局部…

策略模式【行为模式C++】

1.概述 策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。 策略模式通常应用于需要多种算法进行操作的场景,如排序、搜索、数据压缩等。在这些情况下&#x…

将公式用MathType转换导入LaTex的方法 Mathtype+laTex 混合使用 在mathtype中打latex代码编辑公式

关于LaTex和Word之间孰优孰劣的争论已经持续了很长时间,有些朋友在写论文时还会纠结是用Word好还是用LaTex好,其实他们两也是各有优势,LaTeX 与 Word 是两种不同类型的文本编辑处理系统。Latex是无格式的明文文档,格式保存在源文件…

dbeaver数据库语言编辑器设置jdbc驱动

打开 dbeaver 软件 数据库 -> 驱动管理器 以mysql为例 双击 MySQL -> 库 -> 添加工件 然后 打开maven组件库 官网 找到mysql驱动对应的maven工件地址 复制进去然后确认就行了 参考 大神博客

stm32f103c8t6hal库使用看门狗

STM32F103C8T6是一款性能强大的微控制器,它具有丰富的外设和功能,其中之一就是看门狗(Watchdog)。看门狗是一种重要的硬件设备,它可以在系统出现异常时自动重启系统,以保证系统的稳定运行。我们将详细介绍如…