消息队列篇

news2024/12/23 12:58:51

1、队列简介

概念:

 队列是任务到任务、任务到中断、中断到任务数据交流的一种机制,说白了,队列就是用来传递消息的。

---------------------------------------------------------------------------------------------------------------------------------

类似全局变量的作用,但又和全局变量有所不同。

全局变量的弊端:数据无保护,导致数据不安全,当多个任务同时对该变量操作时,数据易受损。

当有一个任务写队列或者读队列的时候,会组织其他任务对队列进行操作,就会避免全局变量的弊端。

---------------------------------------------------------------------------------------------------------------------------------

队列项目和队列长度:

在队列中可以存储数量有限、大小固定的数据。队列中的每一个数据叫做队列项目,队列能够存储队列项目的最大数量称为队列长度。 

队列的特点:

1、数据入队出队方式:队列通常采用“先进先出”(FIFO)的数据存储缓冲机制,即先入队的数据会先从队列中被读取,FreeRTOS中也可以配置为”后进先出“LIFO方式。

2、数据传递方式:FreeRTOS中队列采用实际值传递,即将数据拷贝到队列中进行传递,FreeRTOS采用拷贝数据传递,也可以传递指针,所以在传递较大的数据的时候采用指针传递。

3、多任务访问:队列不属于某个任务,任何任务和中断都可以向队列发送/读取消息。

4、出队、入队阻塞:当任务向队列发送消息时,可以指定一个阻塞时间,假设此时当队列已满无法入队:

①若阻塞时间设置为0 :直接返回不会等待;

②若阻塞时间设置为0-port_MAX_DELAY:等待设定的阻塞时间,若在该时间内还无法入队,超时后直接返回不再等待;

③若阻塞时间设为port_MAX_DELAY:死等,一直等到可以入队为止。出队阻塞与入队阻塞类似。

那返回是什么意思?应该不是简单的不再传递数据,肯定会有相应的错误处理。

注意,当多个任务写入消息给一个”满队列“时,这些任务都会进入阻塞状态,也就是说有多个任务在等待同一个队列的空间。当队列中有空间时,优先级最高的任务会进入就绪态,如果大家优先级都相同,那么等待时间最久的任务会进入就绪态。

队列的基本操作过程:

2、队列结构体

队列分为两部分,一部分为队列结构体,另一部分为存储区域。

后边两个队列锁,听课说是当上锁的时候,可以正常读写队列,然是不能操作等待发送列表和等待接收列表,咱也不知道用处是啥,慢慢学,后边见分晓。

后边介绍那个联合体

最后,上一张队列图。

3、队列相关API函数

我们使用队列的一般流程是:创建队列,然后写队列,最后读队列嘛。

创建队列相关API函数:

动态方式创建队列

xQueueCreate() 

它其实是一个宏定义,穿了个马甲,下边看看穿上马甲的全貌吧。

#define xQueueCreate (  uxQueueLength,   uxItemSize  )     
 xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), (queueQUEUE_TYPE_BASE ))

第一个参数uxQueueLength是队列的长度,第二个参数uxItemSize是队列项目的大小,第三个参数queueQUEUE_TYPE_BASE是创建的类型是啥,先看看都有啥类型。

有这些,由此我们便可以想到,队列集、互斥信号量等等其实都是由这个函数干的,只不过后边它穿上了不同的马甲。

再来说下返回值吧,当返回值是NULL的时候,表示队列创建失败,当返回值是其他值的时候,代表队列的句柄,表示队列创建成功,句柄还是比较重要的,操作队列需要用到。

由于经常使用的是动态方式创建队列,所以课程里边只介绍了动态方式,等后边我搜搜资料,我再把静态方式加进来。

写队列相关API函数:

写队列主要分为两种吧,一个是在任务中写队列,一个是在中断中写队列。其实又可以分为另外三种,往队列首部写、尾部写和覆写。分类方式不同。

看看穿上马甲的全貌

写入位置相关的宏定义

形参和返回值说明

读队列相关API函数

这个信息读取缓冲区,就是接收消息的一个变量的地址,注意它这是一个指针常量。

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

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

相关文章

【Python机器学习】NLP概述——深度处理

自然语言处理流水线的各个阶段可以看作是层,就像是前馈神经网络中的层一样。深度学习就是通过在传统的两层机器学习模型架构(特征提取建模)中添加额外的处理层来创建更复杂的模型和行为。 上图中,前四层对应于聊天机器人流水线中的…

MCtalk·CEO对话×每刻科技:经济挑战期,企业如何将“好钢”用在“刀刃”上?

2015 年 10 月,网易数智发布第一款产品,正式踏上了 ToB 商业化之路。从那以后,我们每年举办不同主题的科技峰会,分享最新的行业体感和洞察;访谈各界企业领导者,记录他们的创新与创业经历;走过大…

dubbo:dubbo+zookeeper整合nginx实现网关(四)

文章目录 0. 引言1. nginx简介2. 集成nginx2.1 负载均衡实现 3. 源码4. 总结 0. 引言 我们之前讲解过dubbozookeeper实现服务调用和注册中心,但是还缺乏一个统一的入口,即网关服务。dubbozookeeper的模式更加适合的网关组件为nginx,所以今天…

Unity编辑器扩展:创建一个欢迎窗口,在启动Editor的时候显示自定义窗口。

Unity编辑器扩展:创建一个欢迎窗口,在启动Editor的时候显示自定义窗口。 在Unity开发过程中,经常会遇到需要向其他人展示重要信息的情况,比如项目文档、脚本说明、插件介绍等。这个窗口不仅能够展示必要的文档信息,还…

苍穹外卖(瑞吉外卖)--环境搭建

作为软件开发工程师,在编码的过程中就不可避免地会接触多种软件环境,我们主要来分析在工作中经常遇到的三套环境, 分别是: 开发环境、测试环境、生产环境 开发环境 在开发阶段使用的环境,就是开发环境,一般外部用户无…

解决ubuntu22.04无法识别CH340/CH341和vscode espidf插件无法选择串口设备节点问题

文章目录 解决ubuntu22.04无法识别CH340/CH341和vscode espidf插件无法选择串口设备节点问题不识别CH340/CH341报错解决办法升级驱动编译安装 卸载brltty程序 vscode espidf插件无法选择串口设备节点问题解决办法编译安装 解决ubuntu22.04无法识别CH340/CH341和vscode espidf插…

路径规划——Jump Point Search算法

路径规划——Jump Point Search算法 算法原理 跳点搜索算法(Jump Point Search),简称JPS,是由澳大利亚两位教授于2011年提出的基于Grid格子的寻路算法。JPS算法在保留A Star算法的框架的同时,进一步优化了A Star算法寻找后继节点的操作。 A…

异常在代码中的两个作用

一.异常的作用: 作用一:异常是用来查询bug的关键参考信息。 作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况。 二.举例: 例1: 一个JavaBean类: package com.itheima.a01MyExpection;public class Student { private String name; private int…

Mamba-YOLO : 基于SSM的YOLO目标检测算法(附代码)

代码地址:GitHub - HZAI-ZJNU/Mamba-YOLO: the official pytorch implementation of “Mamba-YOLO:SSMs-based for Object Detection” 论文地址:https://arxiv.org/pdf/2406.05835 在深度学习技术的快速进步推动下,YOLO系列为实时…

前端VUE低代码平台有哪些?盘点几款,你且看看有没有用得上的

前端低代码平台有哪些?盘点几款,你且看看有没有用得上的。 1、GOVIEW GoView 是一个使用 Vue3 搭建的低代码数据可视化开发平台,将图表或页面元素封装为基础组件,无需编写代码即可完成业务需求。它的技术栈为:Vue3 T…

vant 组件中事件选择器的一些小用法

获取当前所在的月份的月初和当天的日期 computed: {// 默然展示月初的第一天formattedFirstDayOfMonth() {const now new Date();const firstDayOfMonth new Date(now.getFullYear(), now.getMonth(), 1);const year firstDayOfMonth.getFullYear();const month (firstDay…

聚星文社原版本绘唐科技AI推文工具

聚星文社原版本绘唐科技AI推文工具是一种可以帮助用户生成推文内容的人工智能工具。它通过分析大量的文本和数据,学习了推文的写作风格和语言特点,并能够根据用户提供的关键词和要求,生成符合要求的推文内容。 这个工具可以快速生成高质量的推…

C语言一笔画迷宫

目录 开头程序程序的流程图程序游玩的效果结尾 开头 大家好&#xff0c;我叫这是我58。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <Windows.h> void printmaze(const char strmaze[11][11]) {int ia 0;…

金蝶云星空元数据冲突SVN:replaced,tree conflict树冲突解决过程

文章目录 SVN:replaced,tree conflict树冲突解决过程问题解决方案 SVN:replaced,tree conflict树冲突解决过程 问题 解决方案

五参数防爆气象站

五参数防爆气象站是一种用于监测环境气象条件和预测潜在爆炸危险的装置。其功能包括以下五个方面&#xff1a; 温度监测&#xff1a;防爆气象站能够实时监测环境的温度变化&#xff0c;并且能够提供温度的历史记录和趋势预测。这对于防止设备过热和爆炸具有重要意义。 湿度监测…

场外个股期权优劣有哪些?场外个股期权有风险吗?

今天带你了解场外个股期权优劣有哪些&#xff1f;场外个股期权有风险吗&#xff1f;个股场外期权&#xff0c;作为非交易所交易的股票期权合约&#xff0c;为投资者提供了独特的投资渠道。 场外个股期权&#xff08;OTC个股期权&#xff09;的优势&#xff1a; 1.灵活性&…

网络间通信

1、udp通信 特点&#xff1a;&#xff08;1&#xff09;无连接 &#xff08;2&#xff09;不可靠 2、udp编程&#xff08;c/s模型&#xff09; ssize_t recvfrom(int sockfd, //socket的fd void *buf, //保存数据的一块空间的地址 …

鸿蒙弹窗实现乱象?带你玩转正确的实现姿势

最近看到很多童鞋吐槽鸿蒙自定义弹窗的实现,也有不少童鞋提供了各式各样的低耦,轻巧方向的优化方案,但多数参差不齐,甚至有基于老API(白玩,以后还得废弃掉…)给的方案,为避免如此“乱象”遂提出正确的实现姿势。 姿势一 如果您没有特别的要求,系统AlertDialog(API 6+)…

新加坡门店客流计数器,AI智能识别算法加持,精准完成统计分析

在数字化转型的大潮下&#xff0c;零售业正经历着前所未有的变革。为了更好地理解顾客行为并优化店铺运营&#xff0c;新加坡的零售门店开始采用搭载AI智能识别算法的客流计数器系统。这套系统不仅能够精准统计顾客流量&#xff0c;还能提供深入的分析报告&#xff0c;帮助商家…

tcp 和udp通信

一.recvfrom recvfrom函数是一个系统调用&#xff0c;用于从套接字接收数据。该函数通常与无连接的数据报服务&#xff08;如 UDP&#xff09;一起使用&#xff0c;但也可以与其他类型的套接字使用。与简单的 recv() 函数不同&#xff0c;recvfrom() 可以返回数据来源的地址信息…