FreeRTOS消息队列、信号量、互斥量、递归互斥量实现步骤

2023-05-16

文章目录

      • 消息队列
          • 消息队列结构
          • 读队列步骤
          • 写队列步骤
        • 作用
      • 信号量
          • 信号量结构
        • 获取信号量
        • 释放信号量
      • 互斥量(锁)
          • 互斥量结构
        • 获取互斥量
        • 释放互斥量
      • 递归互斥量(递归锁)
        • 获取递归互斥量
        • 释放递归互斥量

消息队列

消息队列结构

由消息队列控制块+消息存储buffer组成,是全局变量,结构如下
在这里插入图片描述
消息队列控制块中的链表

	List_t xTasksWaitingToSend;	//记录发送阻塞的TCB
	List_t xTasksWaitingToReceive;//记录接收阻塞的TCB
读队列步骤
 step1.关中断 
 step2.如果buffer中有数据,goto step3
       如果buffer中没数据,
          如果xTicksToWait=0,开中断,返回ERR
          如果xTicksToWait!=0,
              把当前TCB记录到xTasksWaitingToReceive
              把当前TCB从xReadyTasksLists移调到xDelayedTaskList让当前任务休眠
 step3.从环形buffer拷贝数据
       把xTasksWaitingToSend列表上的第一个TCB移除
       把xTasksWaitingToSend列表上的第一个TCB从xDelayedTaskList移调到xReadyTasksLists唤醒需要发送的任务
 step4.开中断
写队列步骤
 step1.关中断 
 step2.如果buffer中还能写数据,goto step3
       如果buffer中数据满了,
          如果xTicksToWait=0,开中断,返回ERR
          如果xTicksToWait!=0,
              把当前TCB记录到xTasksWaitingToSend
              把当前TCB从xReadyTasksLists移调到xDelayedTaskList让当前任务休眠
 step3.拷贝数据到环形buffer
       把xTasksWaitingToReceive列表上的第一个TCB移除
       把xTasksWaitingToReceive列表上的第一个TCB从xDelayedTaskList移调到xReadyTasksLists唤醒需要发送的任务
 step4.开中断

注意,上述是有任务主控发送接收导致对端唤醒,还有一种方式是延时时间到了由tick中断来唤醒

作用

常用于任务间数据传递

信号量

信号量结构

信号量借用的消息队列数据结构,用uxMessagesWaiting来代指资源个数,二值信号量就是这个值只能是0和1,且没有后面的buffer,如下,所以发送接收和队列基本相同
在这里插入图片描述

获取信号量

 step1.关中断 
 step2.如果uxMessagesWaiting>0goto step3
       如果uxMessagesWaiting=0,
          如果xTicksToWait=0,开中断,返回ERR
          如果xTicksToWait!=0,
              把当前TCB记录到xTasksWaitingToReceive
              把当前TCB从xReadyTasksLists移调到xDelayedTaskList让当前任务休眠
 step3.uxMessagesWaiting--
       把xTasksWaitingToSend列表上的第一个TCB移除
       把xTasksWaitingToSend列表上的第一个TCB从xDelayedTaskList移调到xReadyTasksLists唤醒需要发送的任务
 step4.开中断

释放信号量

 step1.关中断 
 step2.如果uxMessagesWaiting已经是最大值,开中断,返回ERR
 step3.uxMessagesWaiting++
       把xTasksWaitingToReceive列表上的第一个TCB移除
       把xTasksWaitingToReceive列表上的第一个TCB从xDelayedTaskList移调到xReadyTasksLists唤醒需要发送的任务
 step4.开中断

注,二值信号量存在优先级翻转问题,就是高优先级任务因为低优先级任务占用了资源且低优先级任务被高于他优先级任务抢占导致不能运行,这样高优先级就一直阻塞住了,为了解决此问题(减小影响)设计了互斥量

互斥量(锁)

互斥量结构

互斥量就是二值信号量+优先级继承,xMutexHolder保存拿到此资源的TCB,TCB中还有一个uxBasePriority用于保存此任务创建时的优先级
在这里插入图片描述

获取互斥量

 step1.关中断 
 step2.如果uxMessagesWaiting>0,xMutexHolder记录TCB,goto step3
       如果uxMessagesWaiting=0,
          如果xTicksToWait=0,开中断,返回ERR
          如果xTicksToWait!=0,
              用当前任务优先级改写xMutexHolder任务优先级
              把当前TCB记录到xTasksWaitingToReceive
              把当前TCB从xReadyTasksLists移调到xDelayedTaskList让当前任务休眠
 step3.uxMessagesWaiting--
       把xTasksWaitingToSend列表上的第一个TCB移除
       把xTasksWaitingToSend列表上的第一个TCB从xDelayedTaskList移调到xReadyTasksLists唤醒需要发送的任务
 step4.开中断

释放互斥量

 step1.关中断 
 step2.如果uxMessagesWaiting已经是最大值,开中断,返回ERR
 step3.uxMessagesWaiting++
       用uxBasePriority来恢复自身优先级
       把xTasksWaitingToReceive列表上的第一个TCB移除
       把xTasksWaitingToReceive列表上的第一个TCB从xDelayedTaskList移调到xReadyTasksLists唤醒需要发送的任务
 step4.开中断

注,FreeRTOS没有实现谁take谁give的限制,所以一个task take,另一个task give在代码上是能跑通的,要注意这点
还有死锁问题,一个任务先take后再次take,此任务就被阻塞了,无法唤醒,自我死锁,此时需要用递归互斥量

递归互斥量(递归锁)

递归互斥量和临界区嵌套设计方式一样,uxRecursiveCallCount来记录递归次数,且递归互斥量实现了谁take谁give的限制。

获取递归互斥量

如果xMutexHolder == 当前TCB,uxRecursiveCallCount++,返回
如果xMutexHolder != 当前TCB,调用互斥量take,返回

释放递归互斥量

如果xMutexHolder == 当前TCB,uxRecursiveCallCount--,
      如果uxRecursiveCallCount==0,调用互斥量give
如果xMutexHolder != 当前TCB,返回
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS消息队列、信号量、互斥量、递归互斥量实现步骤 的相关文章

  • freeRTOS使用uxTaskGetStackHighWaterMark函数查看任务堆栈空间的使用情况

    摘要 每个任务都有自己的堆栈 堆栈的总大小在创建任务的时候就确定了 此函数用于检查任务从创建好到现在的历史剩余最小值 这个值越小说明任务堆栈溢出的可能性就越大 FreeRTOS 把这个历史剩余最小值叫做 高水位线 此函数相对来说会多耗费一点
  • FreeRTOS_中断

    传送门 博客汇总帖 传送门 Cortex M3 中断 异常 传送门 Cortex M3笔记 基础 笔记内容参考 正点原子的FreeRTOS开发手册 cortex m3权威指南 Cortex M3和Cortex M4权威指南等 文中stm32
  • 【FreeRTOS】任务通知的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • 【RabbitMQ】Consumer之消费模式、消息确认与拒绝 - 基于AMQP 0-9-1

    这篇文章主要和大家分享RabbitMQ Consumer端的知识点 主要包括Consumer的消费模式 消息是如何确认以及如何拒绝的 当消息拒绝之后 如何让消息重新进入队列 推模式 RabbitMQ支持推和拉两种消费模式 推模式就是由Bro
  • Rabbitmq入门到进阶看这篇就够了!

    安装前提 安装 erlang windows用户名非中文 可以关注我的公众号 知识追寻者 回复 rabbitmq 获取已经下载好的安装包和配套源码地址 本套教程对应知识追寻者网址 windows安装rabbitmq zszxz com Ra
  • stm32f103zet6移植标准库的sdio驱动

    sdio移植 st官网给的标准库有给一个用于st出的评估板的sdio外设实现 但一是文件结构有点复杂 二是相比于国内正点原子和野火的板子也有点不同 因此还是需要移植下才能使用 当然也可以直接使用正点原子或野火提供的实例 但为了熟悉下sdio
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • 基于STM32的FreeRTOS学习之中断测试实验(五)

    记录一下 方便以后翻阅 本章内容是接着上一章节进行的实际演练 1 实验目的 FreeRTOS可以屏蔽优先级低于configMAX SYSCALL INTERRUPT PRIORITY的中断 不会屏蔽高于其的中断 本次实验就是验证这个说法 本
  • 代码技巧——如何关闭订单?延迟任务的实现方案【建议收藏】

    先思考个问题 为什么要关闭订单 业务上 1 提供待付款时间 而不是简单的 一次付款机会 提高业务指标之一的成单率 成单率 成功下单的人数 发起支付的人数 2 下单成功意味着这个商品被当前订单占用 库存已经预扣减 如果迟迟不支付则需要回收库存
  • RT-Thread记录(五、RT-Thread 临界区保护与FreeRTOS的比较)

    本文聊聊临界区 以及RT Thread对临界区的处理 通过源码分析一下 RT Thread 对临界区保护的实现以及与 FreeRTOS 处理的不同 目录 前言 一 临界区 1 1 什么是临界区 1 2 RTOS中的临界区 二 RT Thre
  • 消息队列:Ubuntu16.04安装和Web页面管理RabbitMQ(楼主亲测、真实有效)

    RabbitMQ 总来来说 RabbitMQ的安装还是有一些难度的 不同的方式 安装的方法也是完全不一样 还要解决蛮多依赖 加上现在有些网站 极其不负责 很多博文都没有经过测试检验就直接发出来的 楼主来亲测一下 希望能对大家有好的帮助 一
  • 1 RocketMQ简介

    简介 RocketMQ是由阿里捐赠给Apache的一款低延迟 高并发 高可用 高可靠的分布式消息中间件 经历了淘宝双十一的洗礼 RocketMQ既可为分布式应用系统提供异步解耦和削峰填谷的能力 同时也具备互联网应用所需的海量消息堆积 高吞吐
  • 关于rocketmq 中日志文件路径的配置

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 rocketmq 中的数据和日志文件默认都是存储在user home路径下面的 往往我们都需要修改这些路径到指定文件夹以便管理 服务端日志 网
  • 单片机通信数据延迟问题排查

    1 问题说明 笔者在最近的项目中 发现系统的响应延迟较高 经过排查 排除了单片机运行卡死的问题 2 原因分析 具体排查过程这里就不细致说明了 直接给出排查后原因 任务执行周期规划不合理 导致freertos队列发送接收到的命令有延迟 为了便
  • FreeRTOS实时操作系统(三)任务挂起与恢复

    系列文章 FreeRTOS实时操作系统 一 RTOS的基本概念 FreeRTOS实时操作系统 二 任务创建与任务删除 HAL库 FreeRTOS实时操作系统 三 任务挂起与恢复 FreeRTOS实时操作系统 四 中断任务管理 FreeRTO
  • Springboot中配置activeMQ持久化

    一 activeMQ数据库持久化配置 ActiveMQ持久化的三种方式 我们采用数据库的方式来进行持久化 1 Memory 消息存储 基于内存的消息存储 2 基于日志消息存储方式 KahaDB是ActiveMQ的默认日志存储方式 它提供了容
  • FreeRTOS之系统配置

    1 FreeRTOS的系统配置文件为FreeRTOSConfig h 在此配置文件中可以完成FreeRTOS的裁剪和配置 在官方的demo中 每个工程都有一个该文件 2 先说一下 INCLUDE 开始的宏 使用 INCLUDE 开头的宏用来
  • GNU Arm Cortex m4 上的 C++ 异常处理程序与 freertos

    2016 年 12 月更新现在还有一个关于此行为的最小示例 https community nxp com message 862676 https community nxp com message 862676 我正在使用带有 free
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https

随机推荐

  • 论文笔记:NAFNet: Simple Baselines for Image Restoration

    向孙老师致敬 xff01 相关工作 图像恢复模型体系结构比较 方法 块内 Intra block 结构比较 xff1a 其中Channel Attention CA xff0c Simplified Channel Attention SC
  • 在Ubuntu 22.04 Jammy Jellyfish Linux上流畅安装VMware tools

    安装 VMware Tools 软件可以更好提升我们的虚拟机使用体验 xff0c 但是在使用VMware自带的linux iso安装VMware Tools后 xff0c 无端会报各种错误 本文将会提供一个使用官方源的途径进行安装的简单指引
  • 研究生投稿被拒经历

    2021 7 25 投稿IEEE JSTARS 2021 7 27 被拒 xff08 查重率不过 xff09 2021 9 7 投稿Remote Sensing赠刊1 2021 9 10 被拒 xff08 创新度不够 xff09 2021
  • 垃圾+虚假会议大全https://waset.org/conferences,千万别投

    这个垃圾网站上面的会议全是假的 xff01 xff01 xff01 千万别投 xff01 xff01 xff01 https waset org conferences 投稿前 我研究领域是 xff1a 不确定性量化和灵敏度分析 学院的毕业
  • CVPR 2022 图像恢复论文

    地址 xff1a https openaccess thecvf com CVPR2022 https openaccess thecvf com CVPR2022 workshops NTIRE Blind2Unblind Self Su
  • 项目代码训练教程

    配置好matconvnet后 xff0c deep model下有三个文件夹 xff0c 分别是我们的方法 xff1a FOC SDeCNN try和SDeCNN方法 xff1a HSI SDeCNN train1 2 3 HSI SDeC
  • 每日一篇论文推荐

    每日一篇论文推荐 7 5 Unsupervised Hyperspectral Denoising Based on Deep Image Prior and Least Favorable Distribution7 6 WINNet W
  • ISP图像信号处理 | GAMES204-计算成像

    图像信号处理 GAMES204 计算成像 Dead Pixel CorrectionBlack Level CompensationAnti aliasingLens Shading CorrectionNoise Reduction3AS
  • np.max()、np.argmax()、np.maximum()、np.min()、np.argmin()、np.minimum()、np.sum()

    numpy专题 最值 求和 最大值np max np argmax np maximum 求和np sum 网上已经有很多对于这几个函数的讲解资料 xff0c 但总感觉讲得有些乱 xff0c 特别是对于高维数组 xff0c 如果指定了某个轴
  • Cortex-M3 (NXP LPC1788)之EEPROM存储器

    EEPROM是一种非易失性存储器 xff0c 主要用于存储相对少量的数据 xff0c 如存储一些系统的配置信息 通过系统的EEPROM控制模块可以轻松的进行EERPOM的存储控制 要正确使用EEPROM需要配置掉电寄存器EEPWRDWN确定
  • sqlalchemy.exc.ArgumentError: Could not parse rfc1738 URL from string

    错误信息 sqlalchemy exc ArgumentError Could not parse rfc1738 URL from string 原 flask sqlacodegen mysql root 64 127 0 0 1 fo
  • 面试题汇总:网络编程

    1 tcp和udp的区别 xff1f xff08 1 xff09 TCP面向连接 xff08 如打电话要先拨号建立连接 xff09 UDP是无连接的 xff0c 即发送数据之前不需要建立连接 xff1b xff08 2 xff09 TCP提
  • CentOS7 安装学之思开源考试系统Mysql版

    环境介绍 序号项目版本1操作系统CentOS Linux release 7 9 2009 Core 2redis7 0 03Mysqlmysql Ver 8 0 29 for Linux on x86 64 MySQL Community
  • Cisco catalyst 交换机升级步骤

    交换机升级步骤 1 准备一个FAT32的U盘 2 到cisco官网上下载交换机镜像 3 将U盘插到交换机上 xff0c 登入交换机concole输入dir usbflash0 xff1a 找到该镜像 xff0c 注意镜像不要放在中文目录下
  • 【性能】【内存】zram解读

    1 背景 nbsp 通过压缩长时间不在前台的进程来节省内存占用 不会像swap一样频繁操作闪存 也可以减少IO操作节省资源 延长闪存寿命 不过内存压缩是一种用时间换空间 的方式 cpu解压缩过程也是需要消耗少量cpu资源 尽管当前andro
  • wifi连接过程抓包

    下面是一次wifi连接过程发送数据的抓包 xff0c 有些包没抓到 xff0c 但还是比较全的 1 4包 xff0c 探测请求 响应过程 STA发出探测请求包Probe ReqAP做出回应 xff0c 发出探测响应包Probe Rsp 5
  • mbedtls学习(6)RSA算法

    RSA算法 RSA算法是一种非对称加密算法 xff0c 特点时加密解密算法不同且加密解密密钥不同 xff0c 即一般公钥加密 xff0c 私钥解密 下面时RSA算法关键参数 n 模数 xff0c 位长度为1024比特或者2048比特e 公开
  • LVGL lv_label标签控件(5)

    lv label 相关API在lv label h中 文本模式 span class token keyword enum span span class token punctuation span span class token co
  • LVGL lv_page页面控件(23)

    lv page 页面控件 xff0c 是由2个lv cont容器控件构成 xff0c 其中一个容器作为lv page页面控件的背景层 xff0c 另一个容器作为lv page页面控件的载体 xff0c 此载体存放其他任何子对象 xff0c
  • FreeRTOS消息队列、信号量、互斥量、递归互斥量实现步骤

    文章目录 消息队列消息队列结构读队列步骤写队列步骤 作用 信号量信号量结构 获取信号量释放信号量 互斥量 xff08 锁 xff09 互斥量结构 获取互斥量释放互斥量 递归互斥量 xff08 递归锁 xff09 获取递归互斥量释放递归互斥量