[转]FreeRTOS消息队列、信号量、事件标志组、任务通知

2023-05-16

功能及区别列表

消息队列

(需要传递消息时使用) 在任务与任务间、 中断和任务间传递信息,可以数据传输

事件标志组

(多个事件同步,不需要传递消息时使用) 实现任务与任务间、 中断和任务间的同步,无数据传输。

可实现一对多、多对多的同步, 可选择是 “ 逻辑或 ” 触发还 是 “ 逻辑与 ”触发。即 一 个任务可以等待多个事件的发生。

信号量

(单个事件同步,不需要传递消息时使用)

#二值信号量

类似一个标志位。仅”空“(0)和”非空“(1)两种状态

#计数信号量

用来事件计数和资源管理

#互斥信号量

(中断中无法使用)拥有优先级继承的二值信号量

任务通知

可以在一定场合下替代 FreeRTOS 的信号量, 队列、事件组等。

消息队列

(可以在任务和中断中使用)通过消息队列服务,任务或中断服务例程可以将一条或多条消息放入消息队列中。同 样,一个或多个任务可以从消息队列中获得消息。当有多个消息发送到消息队列时,通常是将先进入消息队列的消息先传给任务,也就是说,任务先得到的是最先进入消息队列的消息,即先进先出原则(FIFO),但是也支持后进先出原则(LIFO)。

特性:

  • 消息支持先进先出方式排队,支持异步读写工作方式。
  • 读写队列均支持超时机制。
  • 消息支持后进先出方式排队,往队首发送消息(LIFO)。
  • 可以允许不同长度(不超过队列节点最大值)的任意类型消息。
  • 一个任务能够从任意一个消息队列接收和发送消息。
  • 多个任务能够从同一个消息队列接收和发送消息。
  • 当队列使用结束后,可以通过删除队列函数进行删除。

事件标志组

(可以在任务和中断中使用)事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件通信只能是事件类型的通信,无数据传输。与信号量不同的是,它可以实现一对多,多对多的同步。 即一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。同样,也可以是多个任务同步多个事件。

特性:

  • 事件只与任务相关联,事件相互独立,一个 32 位的事件集合(EventBits_t 类型的变量,实际可用与表示事件的只有 24位),用于标识该任务发生的事件类型,其中每一位表示一种事件类型(0 表示该事件类型未发生、1 表示该事件类型已经发生),一共 24 种事件类型。
  • 事件仅用于同步,不提供数据传输功能。
  • 事件无排队性,即多次向任务设置同一事件(如果任务还未来得及读走),等效于 只设置一次。
  • 允许多个任务对同一事件进行读写操作。
  • 支持事件等待超时机制。

信号量

信号量主要实现以下两个功能:

  • 两个任务之间或者中断函数跟任务之间的同步功能,这个与事件标志组是类似的。其实就是共享资源为 1 的时候。
  • 多个共享资源的管理。正在使用的资源有多少,信号量就减多少。
  • 二值信号量(可以在任务和中断中使用)
  • 信号量资源被获取了,信号量值就是 0,信号量资源被释放,信号量值就是 1,把这种只有 0 和 1 两种情况的信号量称之为二值信号量。
  • 类似一个标志位,事件产生置1,事件处理后置0。
  • 计数信号量(可以在任务和中断中使用)
  • 事件计数:事件产生–释放信号量(信号量+1),事件处理–获取信号量(信号量-1),减到零表示所有事件处理完毕
  • 资源管理:信号量值代表当前资源的可用数量,比如停车场当前剩余的停车位数量。信号量值为 0 时说明没有资源了

优先级翻转:在很多场合中,某些资源只有一个,当低优先级任务正在占用该资源的时候,即便高优先级任务也只能乖乖的等待低优先级任务使用完该资源后释放资源。这里高优先级任务无法运行而低优先级任务可以运行的现象称为“优先级翻转”。

  • 互斥信号量(可以在任务中使用,不可以在中断中使用)

互斥信号量其实就是一个拥有优先级继承的二值信号量,在同步的应用中(任务与任务或中断与任务之间的同步)二值信号量最适合。

优先级继承:当一个互斥信号量正在被一个低优先级的任务使用,而此时有个高优先级的任务也尝试获取这个互斥信号量的话就会被阻塞。不过这个高优先级的任务会将低优先级任务的优先级提升到与自己相同的优先级,这个过程就是优先级继承。优先级继承尽可能的降低了高优先级任务处于阻塞态的时间,并且将已经出现的 “优先级翻转”的影响降到最低。

互斥信号量不能用于中断服务函数中, 原因如下:

  • 互斥信号量有优先级继承的机制,所以只能用在任务中,不能用于中断服务函数。
  • 中断服务函数中不能因为要等待互斥信号量而设置阻塞时间进入阻塞态。

任务通知

通过任务通知方式可以实现计数信号量,二值信号量,事件标志组和消息邮箱(消息邮箱就是消息队列长度为 1 的情况)。

  • 在使用队列、信号量前,必须先创建队列和信号量,目的是为了创建队列数据结构。而由于任务通知的数据结构包含在任务控制块中,只要任务存在,任务通知数据结构就已经创建完毕,可以直接使用。
  • 任务通知可以在任务中向指定任务发送通知,也可以在中断中向指定任务发送通知,FreeRTOS 的每个任务都有一个 32 位的通知值,任务控制块中的成员变量 ulNotifiedValue 就是这个通知值。
  • 只有在任务中可以等待通知,而不允许在中断中等待通知。
  • 处理更快,RAM 开销更小。
  • 限制:

1、任务通知方式仅可以用在只有一个任务等待信号量,消息邮箱或者事件标志组的情况。

2、使用任务通知方式实现的消息邮箱替代消息队列时,发送消息的任务不支持超时等待,即消息队列中的数据已经满

了,可以等待消息队列有空间可以存新的数据,而任务通知方式实现的消息邮箱不支持超时等待。

FreeRTOS 提供以下几种方式发送通知给任务 :

  • 发送通知给任务, 如果有通知未读,不覆盖通知值。
  • 发送通知给任务,直接覆盖通知值。
  • 发送通知给任务,设置通知值的一个或者多个位 ,可以当做事件组来使用。
  • 发送通知给任务,递增通知值,可以当做计数信号量使用

---------------------
作者:丨匿名用户丨
来源:CSDN
原文:https://blog.csdn.net/p1279030826/article/details/103471564
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[转]FreeRTOS消息队列、信号量、事件标志组、任务通知 的相关文章

  • PHP+MYSQL+HTML 学生成绩查询

    首先创建一个数据库名为 xscj xff0c 表信息如下 xff1a 页面信息为 xff1a lt DOCTYPE html PUBLIC 34 W3C DTD XHTML 1 0 Transitional EN 34 34 http ww
  • php试题与答案(一)

    1 xff0e mysql connect 与 64 mysql connect 的区别是 B A 64 mysql connect 不会忽略错误 将错误显示到客户端 B mysql connect 不会忽略错误 将错误显示到客户端 C 没
  • php试题与答案(二)

    37 xff0e 在str replace 1 2 3 函数中1 2 3 所代表的名称是 B A 34 取代字符串 xff02 xff0c xff02 被取代字符串 xff02 xff0c xff02 来源字符串 xff02 B xff02
  • PHP实现上一页下一页翻页代码实例

    lt php 1 xff0c 将数据库的所有记录查询出来 xff0c 然后再一页一页的显示 link 61 mysql connect 39 localhost 39 39 root 39 39 123 39 mysql select db
  • 论文笔记:Dual-Level Collaborative Transformer for Image Captioning

    前言 论文详情可以参照这篇 xff0c 写得很好 本小白这篇内容主要是对论文中的一些思想和图以及部分公式进行自己的解读 如有错误 xff0c 请多多谅解 论文思想 首先 xff0c 根据论文第一作者在知乎所说 xff08 搜这篇论文名称可以
  • win10环境下基于OpenVINO部署yolov5模型

    以在Intel的OpenVINO上部署Yolov5模型为例 xff0c 加深对模型部署的理解 1 训练准备 获取yolov5模型及数据集 git clone git github com ultralytics yolov5 pt模型 co
  • docker常用命令集锦

    登录服务器 ssh v 64 192 sudo权限 su 查看docker版本 docker version 查看内核版本 uname a 启动docker docker ps a docker start container名 docke
  • git详细使用

    git搭建 amp 更新远程仓库 配置用户 span class token function git span config global user name span class token string 34 John Doe 34
  • Mindspore安装

    本文用于记录搭建昇思MindSpore开发及使用环境的过程 xff0c 并通过MindSpore的API快速实现了一个简单的深度学习模型 什么是MindSpore 昇思MindSpore是一个全场景深度学习框架 xff0c 旨在实现易开发
  • 机械臂的运动控制

    前言 xff1a 近年来 xff0c 随着服务机器人的兴起 xff0c 机械臂也正走进我们的日常生活 xff0c 近年来出现了一些低成本的 小型的 桌面版 的机械臂的产品 xff0c 相信这将是服务机器人的一个重要方向 xff01 机械臂由
  • Gazebo仿真

    在ROS中有3个可以模拟机器人的模拟器软件 xff1a Gazebo Stage ArbotiX 就是RVIz 你可以任选一个 xff1a Gazebo是一个仿真环境 xff08 平台 xff09 xff0c 可以进行三维机器人动力学仿真等
  • [小插曲]VC学习——基于MFC的模拟时钟程序

    一 程序窗口设计步骤 xff08 1 xff09 用AppWizard生成一个名为Clock的单文档 xff08 SDI xff09 程序框架 为了简化应用程序 xff0c 在第四步时去掉Docking toolbar和Initial st
  • gazebo官网例程

    首先官网下载代码https github com ros simulation gazebo ros demos 1 创建编译工作空间 cd catkin ws src git clone https github com ros simu
  • ROS action

    Actionlib是ROS非常重要的库 xff0c 像执行各种运动的动作 xff0c 例如控制手臂去抓取一个杯子 xff0c 这个过程可能复杂而漫长 xff0c 执行过程中还可能强制中断或反馈信息 xff0c 这时Actionlib就能大展
  • opencv3 特征检测与匹配及寻找目标

    1 算法 xff1a surf特征提取算法 SURF算法是著名的尺度不变特征检测器SIFT Scale Invariant Features Transform 的高效变种 xff0c 它为每个检测到的特征定义了位置和尺度 xff0c 其中
  • 论文笔记:Beyond a Pre-Trained Object Detector:Cross-Modal Textual and Visual Context for Image Caption

    前言 这篇论文是CVPR2022的一篇文章 xff0c 代码也已经开源 这博客主要分享自己的一些理解 xff0c 详情可以去阅读原文 论文思想 这篇论文首先提出了一个问题是当前的大多数图像描述模型主要依赖预训练的图像特征和一个固定的目标检测
  • Stm32定时器中断触发AD采样

    Stm32的ADC有DMA功能这都毋庸置疑 xff0c 也是我们用的最多的 xff01 然而 xff0c 如果我们要对一个信号 xff08 比如脉搏信号 xff09 进行定时采样 xff08 也就是隔一段时间 xff0c 比如说2ms 有三
  • permission denied (publickey)问题的解决

    使用ssh key这种方式进行clone xff0c pull github上面的项目 xff0c 使用 git clone或者git pull origin master出现permission denied publickey xff0
  • 【图像识别与处理】ros下使用realsense d435获取点云

    realsense驱动安装见上篇博文 1 通过源码安装intel RealSense ROS 1 创建catkin工作空间 mkdir p catkin ws src cd catkin ws src 2 将下载的源码复制到 catkin
  • 【图像识别与处理】构建用于垃圾分类的图像分类器

    1 构建图像分类器 训练一个卷积神经网络 xff0c 用fastai库 xff08 建在PyTorch上 xff09 将图像分类为纸板 xff0c 玻璃 xff0c 金属 xff0c 纸张 xff0c 塑料或垃圾 使用了由Gary Thun

随机推荐

  • kitti数据集各个榜单介绍

    kitti数据集网站 下面我们分别介绍下KITTI的几项benchmark Stereo Stereo Evaluation xff08 立体评估 xff09 基于图像的立体视觉和3维重建 xff0c 从一个图像中恢复结构本质上是模糊的 x
  • 解决ubuntu20.04虚拟机无法上网的问题

    64 linux虚拟机无法正常上网 前言 刚建立好的linux虚拟机使用NAT方式可以连接外网 xff0c 系统重启几次 xff0c 系统无法上网 xff0c 这是什么问题导致的呢 xff1f 提示 xff1a 以下是本篇文章正文内容 xf
  • [Linux] 使用vim保存文件时报E45错误

    今天在使用vim为Linux系统设置静态IP时 xff0c 报了E45错误 xff1a 环境说明 系统 xff1a Ubuntu18 04 操作步骤 1 打开到静态IP配置文件 打开到netplan目录 cd etc netplan amp
  • 【C++】类和对象-继承

    目录 一 继承基本方式 1 公 共 继 承 2 保 护 继 承 3 私 有 继 承 二 继承中的对象模型 三 继承中的构造和析构顺序 四 继承中同名成员处理方式 1 成员变量的处理方式 2 成员函数的处理方式 五 继承同名静态成员处理方式
  • Pytorch param.grad.data. 出现 AttributeError: ‘NoneType‘ object has no attribute ‘data‘

    程序中有需要优化的参数未参与前向传播
  • 大白话谈谈ChatGPT:多点人工,多点智能

    对于NLP领域 xff0c 本人也是门外汉 xff0c 就是最近了看到的博文 xff0c 记录自己的一些体会 ChatGPT简介 ChatGPT的全称是 34 Conversational Generative Pre training T
  • GO如何查看变量大小和数据类型

    如何查看一个变量的大小和数据类型 如何查看一个变量的大小和数据类型 paceage main import 34 fmt 34 34 unsafe 34 var n2 int64 61 10 fmt Printf 34 n2的类型 T n2
  • GO语言百分号参数

    常用 参数 v 值的默认格式 T 值得类型的GO语法表示 t 单词true或者false b 表示为二进制 c 该值对应的unicode码值 d 表示十进制 o 表示八进制 f 有小数部分但无指数部分 q 双引号输出
  • java第八节-重复执行

    import java util Scanner public class hello public static void main String args for System out println 34 hello 34 impor
  • java基础第九节-跳转控制语句-数组

    continue用在循环中 xff0c 基于条件控制 xff0c 跳过某次循环体内容的执行 xff0c 继续下一次的执行 break用在循环中 xff0c 基于条件控制 xff0c 终止循环体内容的执行 xff0c 结束当前的整个循环 数组
  • JAVA基础-基本类型转换

    int 和string的相互转换 1 int转换String public static String valuesOf int i 返回int参数的字符串表示形式 xff0c 该方法是String类的方法 1 String转换int pu
  • ubuntu系统-查看系统版本信息

    cat etc issue
  • Ubuntu查看cpu使用情况

    top命令查看cpu等信息 id是 xff1a 空闲 CPU 占用的 CPU 百分比
  • Ubuntu系统查看内存信息

    free命令查看内存信息 h 选项会在数字后面加上适于可读的单位 free h total xff1a 总物理内存大小 used xff1a 内存使用量 free xff1a 剩余可用内存
  • 嘉立创打样的阻抗匹配

    一 适用条件 最好使用4层板以上 xff0c 2层做匹配没啥意义 xff0c 套用大佬的话 主要是中间层和表层的距离近 xff0c 表层和中间层的玻璃纤维厚度是0 2mm xff0c 双层板最少是0 6mm xff0c 这里的差距很大 xf
  • echo 命令总结

    echo命令的功能是在显示器上显示一段文字 xff0c 一般起到一个提示的作用 此外 xff0c 也可以直接在文件中写入要写的内容 也可以用于脚本编程时显示某一个变量的值 xff0c 或者直接输出指定的字符串 echo命令的语法是 xff1
  • Android音频子系统(十三)------audio音频测试工具

    你好 xff01 这里是风筝的博客 xff0c 欢迎和我一起交流 测试音频延时的话 xff0c 一般使用WALT来测试是最为准确的 xff0c 他是借助了外部硬件来捕获音频信号 xff0c 某宝上有卖 xff1a 就是有丢丢小贵 xff0c
  • 一位北邮信通硕士的求职历程,看看 或许有帮助

    序 xff1a 写在前面的话 这篇文章的适用对象为 xff1a 非技术类方向的同学 xff0c 如果你是技术大牛 xff0c 你可以跳过这篇文章了 如果你觉得自己不喜欢技术或者技术不适合你 xff0c 此文或许会给你些有用的东西 简单介绍一
  • [转]STM32 串口传输处理方式 FreeRTOS+队列+DMA+IDLE (二)

    紧接着上一篇文章 xff0c 如何合理处理多个串口接收大量数据 此种方法 xff0c 很厉害 xff0c 很NB xff0c 首先 xff0c 利用DMA 可节省大量CUP资源 其次 xff0c 利用IDLE空闲中断来接收位置个数的数据 最
  • [转]FreeRTOS消息队列、信号量、事件标志组、任务通知

    功能及区别列表 消息队列 xff08 需要传递消息时使用 xff09 在任务与任务间 中断和任务间传递信息 xff0c 可以数据传输 事件标志组 xff08 多个事件同步 xff0c 不需要传递消息时使用 xff09 实现任务与任务间 中断