FreeRTOS 互斥信号量和二值信号量对比

2023-05-16

互斥信号量

1.有优先级继承。

2.尽量不要在中断中调用

3.xSemaphoreCreateMutex创建后,可以直接take使用。

二值信号量

1.无优先级继承。

2.允许在中断中调用。

3.可以当做标志位来使用。

4.xSemaphoreCreateBinary创建后,必须得先give一下才能被take。

这么说其实很笼统,直接代码测试。

这里使用的是互斥信号量

1.创建两个测试任务,app_mqtt_get_properties_handle_task和app_mqtt_set_properties_handle_task

2.两个任务内容

这两个任务其实没做什么动作。就是在take give 然后就挂起等待。

任务1:take,等待200ms,give ,等待200ms。

任务2:take,等待1000ms,give,等待200ms。

理论上来说任何一个任务take了之后,另外一个任务就无法take,必须等待give之后。直接上输出结果。

这里把take before和after,give before和after都打印出来。看箭头的位置,任务1 take before,当时的时间是28931。接下来任务2 give before,时间是29725.中间有800ms的时间差。这个就是任务1在等待任务2 give信号量。

如果把代码中的互斥信号量换成二值信号量,输出的结果是一样的。那就有个疑问了。为什么会一样呢?说白了,不管是互斥信号量还是二值信号量,都是信号量。互斥信号量是二值信号量的子集。他们的应用场景是不同的。但是在如上代码的应用场景中,是没有区别的。因为是把他们当信号量来使用了,所以结果也是相同的。

那这两者的不同之处在哪里呢?

最大的区别就是互斥信号量解决了优先级翻转的问题。这里直接引用别人的文章内容:

二值信号量和互斥锁到底有什么区别? - 代码螺丝钉 - 博客园

假定我们现在有三个任务,task1,task2,task3,任务优先级task1最高,然后依次降低。我们知道在系统调度的时候当两个任务同时处于就绪态的时候,系统会优先执行优先级高的任务

优先级翻转分析(使用信号量)


 在例子中,我们使用pend()函数来表示获取信号量,用post()函数来表示释放信号量

如上图所示,过程分下面几步

1.一开始task3开始运行,先获取到信号量

2.task1开始运行尝试去获取信号量失败被阻塞等待task3执行完

3.task3运行过程中,task2被触发,由于其优先级高于task3,task2被运行,浪费了大量时间

4.继续运行task3,运行完后释放信号量

5.task1继续运行

看到这里我们可以得知,本应该优先级最高的task1结果居然是最后开始运行的,这就是优先级反转现象。这明显是不利的。比如如果有安装看门狗,task1在长时间没有得到执行,就会触发看门狗,导致系统的重启。

改进分析(使用互斥锁)


  在例子中,我们使用lock()函数来表示获取互斥锁,用unlock()函数来表示释放互斥锁

 

如上图所示,过程分下面几步

1.一开始task3开始运行,先获取到互斥锁

2.task1开始运行尝试去获取互斥锁失败被阻塞等待task3执行完,但是此时提升task3的优先级,让其优先级跟自己一样

3.task3运行过程中,task2被触发,由于其优先级低于task3(第2步被提升过),task2等待运行

4.继续运行task3,运行完后释放互斥锁

5.task1继续运行

6.task1执行完,执行task2

所以过程跟前面的虽然一样,但是互斥锁多做了一个步骤就是将task3的优先级提升到task1的级别,防止task2中途出来搅局浪费大量时间。

说到底,其实就是两个信号量的应用场景不同。互斥信号量是防止出现优先级翻转导致卡死的情况。这个的前提是一个公共资源被多个任务调用的情况下。如果没有这种情况,二值信号量就可以应对。就像一个标志位一样。

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

FreeRTOS 互斥信号量和二值信号量对比 的相关文章

  • 详解FreeRTOS中的软件定时器

    软件定时器用于让某个任务定时执行 或者周期性执行 比如设定某个时间后执行某个函数 或者每隔一段时间执行某个函数 由软件定时器执行的函数称为软件定时器的回调函数 参考资料 Mastering the FreeRTOS Real Time Ke
  • STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)

    STM32F103移植FreeRTOS必须搞明白的系列知识 1 Cortex CM3中断优先级 STM32F103移植FreeRTOS必须搞明白的系列知识 2 FreeRTOS任务优先级 STM32F103移植FreeRTOS必须搞明白的系
  • STM32CubeMX+FreeRTOS学习笔记(一)

    嵌入式实时操作系统FreeRTOS 基本概述 在嵌入式领域当中 实时操作系统的应用越来越广泛了 目前嵌入式操作系统种类很多 例如 Clinux C OS II C OS III FreeRTOS RT Thread等等 这篇文章所记录的就是
  • FreeRTOS软件定时器创建、复位、开始和停止(备忘)

    目录 一 简介 1 1 开发环境 1 2 摘要 二 STM32CubeIDE配置 三 创建定时器 3 1 头文件声明 3 2 工程文件定义 3 3 创建定时器 3 4 开启 复位 和关闭定时器 四 定时器回调函数 一 简介 1 1 开发环境
  • 解决错误“ #error “include FreeRTOS.h“ must appear in source files before “include event_groups.““例子分享

    今天来给大家分享一下 关于之前自己在学习FreeRTOS过程中遇到的一个错误提示 话不多说 我们直接来看 错误分析 首先 我们看一下错误的提示 error 35 error directive include FreeRTOS h must
  • Freertos中vTaskDelay()是怎么用的

    1 常见的使用场景 void vLED Task void pvParameters while 1 Heartbeat LED vTaskDelay 1000 portTICK RATE MS 说明 上面这段代码的意思是 led翻转后经过
  • 【FreeRTOS开发问题】FreeRTOS内存溢出

    FreeRTOS内存溢出 如下图所示 FreeRTOS编译完成后可以看到 系统提示无法分配内存到堆 Objects Template axf Error L6406E No space in execution regions with A
  • STM32移植FreeRTOS的Tips

    转自 http bbs armfly com read php tid 7140 1 在FreeRTOS的demo文件夹中拷贝对应的FreeRTOSConfig h文件后 需要加入一行 define configUSE MUTEXES 1
  • 【FreeRTOS(三)】任务状态

    文章目录 任务状态 任务挂起 vTaskSuspend 取消任务挂起 vTaskResume 挂起任务调度器 vTaskSuspendAll 取消挂起任务调度器 xTaskResumeAll 代码示例 任务挂起 取消任务挂起 代码示例 挂起
  • 基于HAL库的FREERTOS-----------三.队列

    一 队列简介 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式 但是如果在使用操作系统的应用中用
  • freertos————互斥锁

    线程安全 多线程程序处于一个多变的环境 可访问的全局变量和堆数据随时可能被其他的线程改变 多个线程同时访问一个共享数据 可能造成严重的后果 出现问题的是之前移植了一个freemodbus的从站 多个任务访问全局变量保持寄存器区 导致最后读出
  • FreeRTOS,串口中断接收中使用xQueueOverwriteFromISR()函数,程序卡死在configASSERT

    原因 UART的中断优先级设置的太高 高于了configMAX SYSCALL INTERRUPT PRIORITY宏定义的安全中断等级 UART的中断等级小于等于宏定义的优先等级即可
  • FreeRTOS学习(三)开关中断

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 背景知识 Cotex M3的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽 NMI 1个Systick 滴答定时器 Cortex M处理
  • 基于STM32的FreeRTOS学习之中断测试实验(五)

    记录一下 方便以后翻阅 本章内容是接着上一章节进行的实际演练 1 实验目的 FreeRTOS可以屏蔽优先级低于configMAX SYSCALL INTERRUPT PRIORITY的中断 不会屏蔽高于其的中断 本次实验就是验证这个说法 本
  • FreeRTOS笔记(十)中断

    中断 当CPU在执行某一事件A时 发生另外一个更重要紧急的事件B请求CPU去处理 产生了中断 于是CPU暂时中断当前正在执行的事件A任务而对对事件B进行处理 CPU处理完事件B后再返回之前中断的位置继续执行原来的事件A 这一过程统称为中断
  • 【FreeRTOS 事件】任务通知事件

    普通任务通知事件创建创建及运行 参阅安富莱电子demo define BIT 0 1 lt lt 0 define BIT 1 1 lt lt 1 static TaskHandle t xHandleTaskUserIF NULL sta
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • 防止GCC LTO删除函数

    我使用 GCC ARM Embedded 和 FreeRTOS FreeRTOS具有的功能vTaskSwitchContext 仅在某些情况下使用 内联汇编代码 问题是 当我使用LTO时 GCC不考虑内联汇编代码并认为该函数没有被使用 因此
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d

随机推荐

  • UCOS III移植到STM32F407过程

    UCOS III移植步骤 第一步 首先打开找到Mirium的官网 找到下载区域 按照MCU制造商来查找 看图 来下载对应的UCOS III系统 由于官方并没有直接对stm32f407系列的移植 所以我们就在官网上找到和stm32f407相近
  • Android 7.0手机打开相机或相册报错解决方案

    原文地址 xff1a http www jianshu com p edec55192944 在android 7 0以上的手机上打开相机 相册会报如下错误 android os FileUriExposedException expose
  • Python爬虫:用BeautifulSoup进行NBA数据爬取

    爬虫主要就是要过滤掉网页中无用的信息 xff0c 抓取网页中有用的信息 一般的爬虫架构为 xff1a 在python爬虫之前先要对网页的结构知识有一定的了解 xff0c 如网页的标签 xff0c 网页的语言等知识 xff0c 推荐去W3Sc
  • Python 不带参数和带参数装饰器

    链接1 xff1a https blog csdn net u010358168 article details 77773199 链接2 xff1a https blog csdn net qq 34788903 article deta
  • VLAN网络支持ipv6的交换机和虚机配置

    VLAN支持ipv6的交换机和虚机配置 前言一 创建VLAN网络并配置交换机1 规划并在OpenStack上创建 VLAN网络2 在交换机上配置VLAN 二 Ubuntu虚机配置1 创建虚机2 在OpenStack上查看port3 登录虚机
  • MyBatis-Plus-Generator 3.5.2 配置详解

    官方用例 所需MAVEN依赖 span class token tag span class token tag span class token punctuation lt span dependencies span span cla
  • 用keras搭建一个简单的一维卷积神经网络

    编程环境 xff1a python 3 6 8 tensorflow 1 12 3 点击下载离线包 matplotlib 3 1 2 numpy 1 17 4 数据集说明 xff1a 我所采用的数据集 xff0c 是我自己构建的一个网络流量
  • java中的编码转换(以utf8和gbk为例)

    在正常javaweb开发中经常会发现字符转换的需求 xff0c 会存在中文字符转换乱码的现象 xff0c 如何解决以及其转换原理我至今懵懵懂懂 xff0c 于是专门写了个测试代码进行尝试 xff0c 总算理清了编码 xff0c 先上结论 x
  • ERROR com.alibaba.druid.pool.DruidDataSource - init datasource error, url jdbcmysql

    部署一个开源项目报错 ERROR com alibaba druid pool DruidDataSource init datasource error url jdbcmysql 很明显是数据库连接错误 但排除一下错误后 xff0c 我
  • KVM下的Windows虚拟机盘符扩容

    今天发现工作站上的一个Windows虚拟机的一个盘符没有空间了 xff0c 需要为其进行扩容 探究过程如下 xff1a 1 确认需要调整的盘符对应的文件 2 关闭虚拟机 3 调整存储文件的大小 打开终端 xff0c 进入文件在所目录 xff
  • IDEA lombok包的@Data注解报错找不到符号

    问题描述 xff1a 工程编译报错 java 找不到符号 问题抽象 定位错误可以发现是getter setter的问题 由于采用了 64 Data注解 xff0c 所以优先考虑是lombok的问题 解决方案 首先排除以下可能 lombok插
  • python配合阿里云域名解析实现DDNS功能

    前置工作 安装阿里模块 pip span class token function install span aliyun python sdk core v3 pip span class token function install s
  • linux开机自启服务简单配置

    使用任意方式在 usr lib systemd system路径下新建一个demo service文件并在其中以如下模板编写内容 span class token punctuation span Unit span class token
  • git取消超过范围大文件并重新提交

    问题报错 remote error File db383b59a623629b36cc62dd3917db21c1375cf0 span class token number 690 93 span MB exceeds span clas
  • 基于pyqt的无边框浏览器

    自己写了个基于pyqt的无边框浏览器 xff0c 可以配合源阅读的web看书 xff0c 自用自取 目录结构 xff1a ui ui webview pycall webview y 环境安装 xff1a pip span class to
  • Pycharm默认输入状态是insert状态,选中文字无法直接输入替换或删除

    最近开始学习python xff0c 使用Pycharm编辑器进行学习过程中却发现 xff1a 打开一个新的py文件 xff0c 我的光标处于加粗状态 xff0c 也就是编程软件经常出现的insert插入编辑模式 xff0c 我就点击了一下
  • 输入字体之间的间隔突然变大了

    额 xff0c 这个问题之前也遇到几次 xff0c 后来莫名其妙变好了 我就没深究 最近写代码又出现了这种情况 就是敲了个快捷键 xff0c 就变成 后来发现是IDE的快捷键和输入法快捷键冲突了 解决方法 xff1a 按一下 shift 4
  • 西瓜的JSON笔记

    1 JSON是什么 JSON 指的是 JavaScript 对象表示法 xff08 J ava S cript O bject N otation java xff0c 脚本 xff0c 对象 xff0c 注释 xff09 JSON的特点
  • Windows 下安装 Ubuntu 双系统

    转载自 xff1a Windows 下安装 Ubuntu 双系统 一 准备 xff1a xff08 一 xff09 准备工具 xff1a U盘一个 xff08 请提前备份U盘里面的资料 xff0c 因为后面操作要格式化U盘 xff09 Ub
  • FreeRTOS 互斥信号量和二值信号量对比

    互斥信号量 1 有优先级继承 2 尽量不要在中断中调用 3 xSemaphoreCreateMutex创建后 xff0c 可以直接take使用 二值信号量 1 无优先级继承 2 允许在中断中调用 3 可以当做标志位来使用 4 xSemaph