队列以及信号量

news2025/2/24 15:36:21

什么是队列

队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任
务间传递信息。
为什么不使用全局变量?
如果使用全局变量,兔子(任务1)修改了变量 a ,等待树獭(任务3)处理,但树獭处理速度很
慢,在处理数据的过程中,狐狸(任务2)有可能又修改了变量 a ,导致树獭有可能得到的不是
正确的数据。
在这种情况下,就可以使用队列。兔子和狐狸产生的数据放在流水线上,树獭可以慢慢一个个依
次处理。
关于队列的几个名词:
队列项目:队列中的每一个数据;
队列长度:队列能够存储队列项目的最大数量;
创建队列时,需要指定队列长度及队列项目大小。

队列特点

1. 数据入队出队方式
通常采用先进先出(FIFO)的数据存储缓冲机制,即先入队的数据会先从队列中被读取。
也可以配置为后进先出(LIFO)方式,但用得比较少。
2. 数据传递方式
采用实际值传递,即将数据拷贝到队列中进行传递,也可以传递指针,在传递较大的数据的时候
采用指针传递。
3. 多任务访问
队列不属于某个任务,任何任务和中断都可以向队列发送/读取消息
4. 出队、入队阻塞
当任务向一个队列发送消息时,可以指定一个阻塞时间,假设此时当队列已满无法入队。
阻塞时间如果设置为:
0:直接返回不会等待;
0~port_MAX_DELAY:等待设定的阻塞时间,若在该时间内还无法入队,超时后直接返回不
再等待;
port_MAX_DELAY:死等,一直等到可以入队为止。出队阻塞与入队阻塞类似;

队列相关 API 函数

  1. 创建队列
    在这里插入图片描述
    参数:
    uxQueueLength:队列可同时容纳的最大项目数 。
    uxItemSize:存储队列中的每个数据项所需的大小(以字节为单位)。
    返回值: 如果队列创建成功,则返回所创建队列的句柄 。 如果创建队列所需的内存无法分配 ,则返回 NULL。
  2. 写队列
    在这里插入图片描述
    在这里插入图片描述
    参数:
    xQueue:队列的句柄,数据项将发送到此队列。
    pvItemToQueue:待写入数据
    xTicksToWait:阻塞超时时间
    返回值:
    如果成功写入数据,返回 pdTRUE,否则返回 errQUEUE_FULL。
  3. 读队列
    在这里插入图片描述
    参数:
    xQueue:待读取的队列
    pvItemToQueue:数据读取缓冲区
    xTicksToWait:阻塞超时时间
    返回值:
    成功返回 pdTRUE,否则返回 pdFALSE。

cubeMX配置创建

在Queues里面点击Add即可然后配置对应的参数即可!
在这里插入图片描述

二值信号量

什么是信号量?

信号量(Semaphore),是在多任务环境下使用的一种机制,是可以用来保证两个或多个关键代
码段不被并发调用。
信号量这个名字,我们可以把它拆分来看,信号可以起到通知信号的作用,然后我们的量还可以
用来表示资源的数量,当我们的量只有0和1的时候,它就可以被称作二值信号量,只有两个状
态,当我们的那个量没有限制的时候,它就可以被称作为计数型信号量。
信号量也是队列的一种。

什么是二值信号量?

二值信号量其实就是一个长度为1,大小为零的队列,只有0和1两种状态,通常情况下,我们用它来进行互斥访问或任务同步。
互斥访问:比如门钥匙,只有获取到钥匙才可以开门
任务同步:比如我录完视频你才可以看视频

二值信号量相关 API 函数

在这里插入图片描述

  1. 创建二值信号量
    在这里插入图片描述
    参数:

    返回值:
    成功,返回对应二值信号量的句柄;
    失败,返回 NULL 。
  2. 获取二值信号量
    在这里插入图片描述
    参数:
    xSemaphore:要获取的信号量句柄
    xTicksToWait:超时时间,0 表示不超时,portMAX_DELAY表示卡死等待;
    返回值:
    成功,返回 pdPASS ;
    失败,返回 errQUEUE_FULL 。

cubMX创建

点击Binary Semaphore即可创建二值信号量,然后选择创建的方式(动态,静态)即可创建!
在这里插入图片描述

计数型信号量

什么是计数型信号量?

计数型信号量相当于队列长度大于1 的队列,因此计数型信号量能够容纳多个资源,这在计数型
信号量被创建的时候确定的。

计数型信号量相关 API 函数

在这里插入图片描述
参数:
uxMaxCount:可以达到的最大计数值 uxInitialCount:创建信号量时分配给信号量的计数值
返回值:
成功,返回对应计数型信号量的句柄;
失败,返回 NULL 。

cubMX创建

在Counting Semaphores栏点击Add即可,唯一和二值信号量不同的是,计数型信号量需提前Config parameters栏搜索的 USE_COUNTING_SEMAPHORES 设置为 Enabled 才可以创建!!!
在这里插入图片描述
操作完之后,Counting Semaphores栏里面的Add按键就会变成蓝色,可点击!
在这里插入图片描述

互斥量

什么是互斥量?

在多数情况下,互斥型信号量和二值型信号量非常相似,但是从功能上二值型信号量用于同步,而互斥型信号量用于资源保护。互斥型信号量和二值型信号量还有一个最大的区别,互斥型信号量可以有效解决优先级反转现象。

什么是优先级翻转?

互斥量就是靠这个以达到保护资源的目的!
在这里插入图片描述
假设创建的是普通的二值信号量,TaskH和TaskL均为获取信号量,TaskM为普通其他任务(比如打印发送串口信息),任务优先级由高到底为H->M->L,假如在某一个时刻,TaskL在运行过程中,突然TaskH运行了,但是信号量大小只有一个并且已经被TaskL获取了,所以TaskH就会被阻塞无法运行,TaskL就会继续运行,但是如果运行过程中TaskM突然要运行,因为TaskM任务不是获取信号量,所以TaskM就会中断TaskL,然后等待TaskM完成后TaskL才能再继续运行,那这样的话TaskH就只能更迟的运行起来了!这样的话就使得优先级高的反而不能及时地运行!
因此,有了互斥量,假设上面创建的不是二值信号量,而是互斥信号量,在TaskL运行的过程中,虽然TaskH还是无法打断TaskL,但是在TaskL运行过程中(没有释放出互斥信号量)系统就会将TaskL提升到TaskH(无法获取信号量被阻塞的任务)的优先级!这样TaskM就无法打断TaskL,等到TaskL完成后(释放互斥信号量)TaskH就会立即运行!这样就达到了效果!

互斥量相关 API 函数

互斥信号量不能用于中断服务函数中!
在这里插入图片描述

cubMX创建

在Mutexes栏里面点击Add然后选择创建方式(静态或动态)即可创建!!!
在这里插入图片描述

代码示例解析(便于理解)

创建的是互斥量:
在这里插入图片描述
运行结果:
(TaskM无法打断TaskL)
在这里插入图片描述
假设创建的是二值信号量,运行结果对比(只有创建的信号量类型不同,其他均相同):(TaskM可以打断TaskL)
在这里插入图片描述

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

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

相关文章

LeetCode LCR 179. 和为s的两个数字

原题链接:LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode) 题目的意思:通过给定的数组,找出两个值,相加并等于目标值。 第一种思路,暴力枚举,伪代码如下: for (…

【Linux】详解信号的保存信号屏蔽字的设置

一、信号处理的一些常见概念 实际执行信号的处理动作称为信号递达(Delivery)。信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞 (block )某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。注意:阻…

传感器测试脉冲电源 —测试传感器性能的电源设备

传感器测试脉冲电源是一种专门用于测试传感器性能的电源设备。传感器测试脉冲电源可以输出不同幅值、频率和形状的脉冲信号,以模拟传感器在实际应用中可能遇到的各种电压和电流波形。通过这种电源,可以对传感器进行全面的性能测试,包括动态响…

信号,信号列表,信号产生方式,信号处理方式

什么是信号 信号在我们的生活中非常常见;如红绿灯,下课铃,游戏团战信号,这些都是信号;信号用来提示接收信号者行动,但接收信号的人接收到信号会进行一系列的行为,完成某个动作;这就…

qt学习篇---界面按键关联(信号和槽)

目录 1.qt基础 2.做一个界面 创建project UI界面设计 信号和槽 1.控件改名字 2.什么是信号和槽 3.怎么关联信号和槽 自动关联 手动关联 1.qt基础 qt可移植性强,不久会用到MCU。很有意义学习 2.做一个界面 创建project 不要中文路径 选择QWidget .pro文件…

字符串函数与字符函数运用(1)

字符串与字符函数介绍1 前言一、字符分类函数字符函数练习 二、字符函数转换1.引入库2.代码改进 字符串函数strlen函数strcpy 结尾 前言 字符串函数大概有以下这几种 strcpy、strcat 、strcmp、strncpy、strncat、strncmp、strstr、strtok、strerror 这些函数可以很好的解决你…

数据结构的队列(c语言版)

一.队列的概念 1.队列的定义 队列是一种常见的数据结构,它遵循先进先出的原则。类似于现实生活中排队的场景,最先进入队列的元素首先被处理,而最后进入队列的元素则要等到前面的元素都被处理完后才能被处理。 在队列中,元素只能…

什么,你的EasyExcel导出一万条数据就OOM了?

前言 前段时间在做一个导出的功能,本以为是平平无奇的一个功能。就用公司内部的一个导出工具类三下五除二就写完了,做法是直接查全量数据,然后直接往Excel里写。一开始没多少数据也没什么问题,但是当数据量逐渐多了起来后&#x…

【OpenCV • c++】图像平滑处理(2) —— 方框滤波 | 盒滤波 | 源码分析

文章目录 前言一、方框滤波代码演示 二、源码分析 前言 前文我们了解了什么是图像平滑处理、图像滤波、邻域算子与线性邻域滤波、以及如何使用方框滤波,本文我们来分析一下方框滤波的源码。 一、方框滤波 void boxFilter(InputArray src, OutputArray dst, int ddep…

面试常见 | 项目上没有亮点,如何包装?

很多技术人在公司用的老技术,而且很多都是搬业务代码且做枯燥乏味的CRUD,在面试提交简历或做自我介绍的时候并不突出,这种情况,如何破局? 首先不管你做的啥项目,全世界不可能只有你自己在做,比…

Android Handler用法

Android Handler用法 为什么要设计Handler机制?Handler的用法1、创建Handler2、Handler通信2.1 sendMessage 方式2.2 post 方式 Handler常用方法1、延时执行2、周期执行 HandlerThread用法主线程-创建Handler子线程-创建Handler FAQMessage是如何创建主线程中Looper…

Agent AI智能体的未来

未来社会中的智能使者:Agent AI智能体的可能性与挑战 随着科技的迅速进步,人工智能已深入我们生活的各个领域,而Agent AI智能体作为与人工智能紧密相关的一个分支,其未来发展无疑是值得期待的。Agent AI智能体,或称为…

JAVA Coding 规范

Coding 规范 文章目录 Coding 规范一.文件规范1.1 声明1.2 缩进1.3 空行1.4 空格1.5 对齐1.6 小括号1.7 花括号1.8 代码长度 二.命名规范2.1 命名总则2.2 命名空间2.3 类与接口2.4 方法命名2.5 属性命名2.6 常量命名2.7 变量命名 三.语句规范3.1 语句总则3.2 循环语句3.3 Switc…

【note3】linux驱动基础,

文章目录 1.互斥锁和自旋锁选择:自旋锁(开销少)的自旋时间和被锁住的代码执行时间成正比关系2.linux错误码:64位错误指针指向内核空间最后一页,对于 1.互斥锁和自旋锁选择:自旋锁(开销少&#x…

QT:核心控件-QWidget

文章目录 控件enableobjectNamegeometrysetWindowTitleopacitycursorFonttooltipstyleSheet 控件 什么是控件? 如上所示,就是控件,而本篇要做的就是对于这些控件挑选一些比较有用的常用的进行讲解分析 在QT的右侧,会有对应的空间…

【面试经典 150 | 分治】将有序数组转换为二叉搜索树

文章目录 写在前面Tag题目来源解题思路方法一:中序遍历递归建树 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等…

如何有效地合并和分类多个文件目录?

在现代办公环境中,文件管理和组织是至关重要的。随着科技的发展,我们不再仅仅依赖于纸质文件,而是更多地使用电子设备来存储和管理信息。这种转变带来了一些新的挑战,其中之一就是如何有效地合并和分类多个目录文件。一&#xff0…

Sortable 拖拽行实现el-table表格顺序号完整例子,vue 实现表格拖拽行顺序号完整例子

npm install sortable<template><vxe-modalref"modalRef"v-model"showModal"title"详情"width"70vw"height"60vh"class"his"transfer><el-table ref"tableRef" :data"tableData&q…

树莓派5用docker运行Ollama3

书接上回&#xff0c;树莓派5使用1panel安装 Ollama 点击终端就可以进入容器 输入以下代码 ollama run llama3Llama3 是市场推崇的版本。您的 树莓派5上必须至少有 4.7GB 的可用空间&#xff0c;因此用树莓派玩机器学习就必须配置大容量的固态硬盘。用1panel部署网络下载速度…

4G远程温湿度传感器在农业中的应用—福建蜂窝物联网科技有限公司

解决方案 农业四情监测预警解决方案 农业四情指的是田间的虫情、作物的苗情、气候的灾情和土壤墒情。“四情”监测预警系统的组成包括管式土壤墒情监测站、虫情测报灯、气象站、农情监测摄像机&#xff0c;可实时监测基地状况,可以提高监测的效率和准确性&#xff0c;为农业生…