FreeRTOS学习(四)

2023-05-16

4 FreeRTOS信号量

  • 4.1 信号量简介
    信号量主要是用于对共享资源的访问和任务同步。具体的使用例子就不进行展开。

  • 4.2 二值信号量

  • 4.2.1 二值信号量简介
    二值信号量通常用于互斥访问或同步,二值信号量与互斥信号量非常相似,两者的主要区别是:互斥信号量拥有优先级继承机制,二值信号量没有优先级继承(何为优先级继承,后面将讲述)。因此二值信号量适用于同步(任务与任务或任务与中断间的同步),而互斥信号量适用于简单的互斥访问。
    与队列一样,二值信号量的API函数允许设置一个阻塞的时间,如果有多个任务同时阻塞在同一个信号量时那么优先级高的任务先获得信号量。通俗的来讲,二值信号量其实就是一个只有一个队列项的队列,这个特殊的队列要么是满的要么是空的。任务与中断无需知道该队列存储的数据,只需知道该队列是否为空即可。

  • 4.2.2 创建二值信号量

函数	描述vSemaphoreCreateBinary( )	动态创建二值信号量(旧版本使用)xSemaphoreCreateBinary( )	动态创建二值信号量(新版本使用)xSemaphoreCreateBinaryStatic( )	静态创建二值信号量

函数xSemaphoreCreateBinary( )——新版本
SemaphoreHandle_t xSemaphoreCreateBinary( void );
返回值:
NULL:二值信号量创建失败;
其他值:创建成功的二值信号量的句柄。

函数 xSemaphoreCreateStatic( )
SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer);
pxSemaphoreBuffer:此参数为指向一个StaticSemaphore_t类型的变量,用于保存信号量结构体;
返回值:
NULL:二值信号量创建失败;
其他值:创建成功的二值信号量的句柄。
  • 4.2.3 释放信号量
    函数	描述xSemaphoreGive( )	任务级信号量释放函数xSemaphoreFromISR( )	中断级信号量释放函数

      函数xSemaphoreGive( )
      BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore);
      参数:
      xSemaphore:要释放的信号量句柄;
      返回值:
      pdPASS:释放信号量成功;
      errQUEUE_FULL:释放信号量失败。
    
      函数xSemaphoreGiveFromISR( )
      BaseType_t xSemaphoreGiveFromISR( SemaphoreHandle_t Semaphore,  BaseType_t *pxHigherPriorityTaskWoken )
    
  • 4.2.4 获取信号量
    在这里插入图片描述

      函数xSemaphoreTake( )
      BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore,
      TickType_t xBlockTime );
      参数:
      xSemaphore:要获取的信号量句柄;
      xBlockTime:阻塞的时间。
      返回值:
      pdTRUE:获取信号量成功;
      pdPASS:超时,获取信号量失败。
      
      函数xSemaphoreTakeFromISR( )
      BaseType_t xSemaphoreTakeFromISR( SemaphoreHandle_t xSemaphore, 
      BaseType_t *pxHigherPriorityTaskWoken);
      参数:
      xSemaphore:要获取的信号量句柄;
      pxHigherPriorityTaskWoken:标记退出该函数后是否需要进行任务切换。
    

    以上信号量的释放及获取函数将适用于计数型信号量、互斥信号量等等。

  • 4.3 计数型信号量

  • 4.3.1 计数型信号量简介
    计数型信号量亦称为数值信号量,其长度将大于1,用户无需关心其队列中存储的数据,我们需要关心的是其队列是否为空。计数型信号量的应用场合:
    1) 事件计数
    在此场合中,每次事件发生的时候就在事件处理函数中释放信号量(增加信号量的计数值),其他任务获取此信号量(其信号量的计数值将减一)来处理相关的事件。在此类场合中,创建的计数型信号量初始计数值将为0。
    2) 资源管理
    在此类场合中,信号量值就代表当前资源的可用数量,一个任务要想获得资源的使用权,首先必须获取到信号量,信号量获取成功后,信号量值将会减一。也就是说,当信号量值为0时,说明当前没有可用的资源。当一个任务使用完该资源后一定要释放该信号量,于是释放信号量的时候信号量值将会再次加一。因此在创建该信号量的时候,其初始值为该资源的有效数量。

  • 4.3.2 计数型信号量的创建
    在这里插入图片描述

      函数 xSemaphoreCreateCounting( )
      SemaphoreHandle_t xSemaphoreCreate( UBaseType_t uxMaxCount, 
      UBaseType_t uxInitialCount);
      uxMaxCount:计数信号量的最大计数值,当信号量值大于此值时释放信号量将会失败;
      uxInitialCount:计数信号量的初始值。
      
      函数 xSemaphoreCreateCountingStatic( )
      SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount,
      UBaseType_t uxInitialCount,
      StaticSemaphore_t *pxSemaphoreBuffer);
      pxSemaphoreBuffer:指向一个StaticSemaphore_t 类型的变量,用来保存信号量结构体。
      
      返回值:
      NULL:计数信号量创建失败;
      其他值:计数信号量创建成功,返回该计数信号量的句柄。
    
  • 4.4 互斥信号量

  • 4.4.1 互斥信号量简介
    互斥信号量其实是一个拥有优先级继承的二值信号量,适用于那些需要互斥访问的应用中。在互斥访问中互斥信号量就相当于一把钥匙,当任务想要使用共享资源时就必须先获得此钥匙(获取信号量),使用完之后也必须尽快的归还该钥匙(释放信号量),以便他人使用该资源。
    优先级继承:当一个互斥信号量正在被一个低优先级的任务使用,而在此时有一个高优先级任务尝试获取该互斥信号量就会被阻塞等待。此时这个高优先级的任务将会把这个低优先级的任务的任务优先级提升到与自己相同的优先级,此过程就成为优先级继承。其优点是尽可能的降低高优先级任务处于阻塞态的时间,并且将已经出现的“优先级反转”的影响降到最低,但是其未能完全消除优先级反转。
    【注意】互斥信号量不能应用在中断服务函数中,原因如下:
     互斥信号量有优先级继承的机制,所以只能用在任务中,不能用于中断服务函数;
     中断服务函数中不能因为要等待互斥信号量而设置阻塞时间进入阻塞态。

  • 4.4.2 互斥信号量的创建

      函数 xSemaphoreCreateMutex( )——动态创建互斥信号量
      SemaphoreHandle_t xSemaphoreCreateMutex( void );
      
      函数xSemaphoreCreateMutexStatic( )——静态创建互斥信号量
      SemaphoreHandle_t xSemaphoreCreateMetexStatic( StaticSemaphore_t *pxMutexBuffer);
      
      以上两函数的返回值:
      NULL:互斥信号量创建失败;
      其他值:创建成功的互斥信号量的句柄。
    
  • 4.5 递归互斥信号量

  • 4.5.1 递归互斥信号量简介
    递归互斥信号量是一种特殊的互斥信号量,这两者最大的区别是:任务若已获取到互斥信号量就不能再次获取此信号量了,但是递归互斥信号量就不同了,已经获取到递归互斥信号量的任务可以再次获取该递归互斥信号量,并且能获取的次数不受限制,同理成功获取多少次后就需要对其进行多少次的释放。例如:某任务成功获取了10此递归信号量,则该任务需要对该递归互斥信号量释放5次。
    递归互斥信号量也具有优先级继承的机制,并且不能在中断服务函数中使用。

  • 4.5.2 递归互斥信号量的创建
    在这里插入图片描述

      函数 xSemaphoreCreateRecursiveMutex( )
      SemaphoreHandle_t xSemaphoreCreateRecuesiveMutex( void );
      
      函数 xSemaphoreCreateRecursiveMutexStatic( )
      SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic( StaticSemaphore_t *pxMutexBuffer );
      
      返回值:
      NULL:递归互斥信号量创建失败;
      其他值:创建成功的互斥信号量的句柄。
    
  • 4.5.3 递归互斥信号量的释放

      #define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) )
      函数原型:BaseType_t xSemaphoreGiveMutexRecursive( QueueHandle_t xMutex );
      参数说明:
      xMutex:要释放的递归互斥信号量的句柄;
      返回值:
      pdPASS:递归互斥信号量成功释放;
      pdFAIL:递归互斥信号量未成功释放。
    
  • 4.5.4 递归互斥信号量的获取

      #define xSemaphoreTakeRecursive( xMutex, xBlockTime )	\
      xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) )
      BaseType_t xQueueTakeMutexRecursive(QueueHandle_t xMutex, TickType_t xTickToWait);
      参数说明:
      	xMutex:要获取的递归互斥信号量的句柄;
      	xTickToWait:阻塞的时间。
      返回值:
      pdPASS:成功获取到递归互斥信号量;
      pdFAIL:未成功获取到递归互斥信号量。
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS学习(四) 的相关文章

  • FreeRTOS系列

    1 多任务系统 1 1 前后台系统 单片机裸机开发时 一般都是在main函数里面用while 1 做一个大循环来完成所有的处理 循环中调用相应的函数完成所需的处理 有时也需要在中断中完成一些处理 相对于多任务系统而言 这就是单人单任务系统也
  • FreeRTOS快速上手

    FreeRTOS使用 一 源码下载和移植文件提取 1 1 源码下载 在网站https sourceforge net projects freertos 可以找到freertos最新的源码 1 2 移植文件提取 根据第一步 我们会得到一个f
  • FreeRTOS config开始的宏

    FreeRTOSConfig h系统配置文件中可以自定义 FreeRTOS h中定义默认值 configAPPLICATION ALLOCATED HEAP 默认情况下FreeRTOS的堆内存是由编译器来分配的 将宏configAPPLIC
  • freertos---软定时器

    一 软件定时器介绍 freeRTOS软件定时器的时基是基于系统时钟节拍实现的 可以创建很多个 在硬件定时器资源不充足的情况下非常有用 软件定时器一般用作周期性地执行函数 在创建软件定时器时指定软件定时器的回调函数 在回调函数中实现相应的功能
  • STM32移植FreeRTOS的Tips

    转自 http bbs armfly com read php tid 7140 1 在FreeRTOS的demo文件夹中拷贝对应的FreeRTOSConfig h文件后 需要加入一行 define configUSE MUTEXES 1
  • freeRTOS使用uxTaskGetStackHighWaterMark函数查看任务堆栈空间的使用情况

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

    传送门 博客汇总帖 传送门 Cortex M3 中断 异常 传送门 Cortex M3笔记 基础 笔记内容参考 正点原子的FreeRTOS开发手册 cortex m3权威指南 Cortex M3和Cortex M4权威指南等 文中stm32
  • FreeRTOS临界段和开关中断

    http blog sina com cn s blog 98ee3a930102wg5u html 本章教程为大家讲解两个重要的概念 FreeRTOS的临界段和开关中断 本章教程配套的例子含Cortex M3内核的STM32F103和Co
  • freertos————互斥锁

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

    原因 UART的中断优先级设置的太高 高于了configMAX SYSCALL INTERRUPT PRIORITY宏定义的安全中断等级 UART的中断等级小于等于宏定义的优先等级即可
  • FreeRTOS之事件

    FreeRTOS之事件 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 一 事件定义 事件 事件集 与高数上的集合意义差不多 事件啊 其实是实现任务间通信的机制 主要用于实现多任务间的同步 但是事件类型
  • Arduino IDE将FreeRTOS用于STM32

    介绍 适用于STM32F103C8的FreeRTOS STM32F103C是一种能够使用FreeRTOS的ARM Cortex M3处理器 我们直接在Arduino IDE中开始使用STM32F103C8的FreeRTOS 我们也可以使用K
  • FreeRTOS笔记(十)中断

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

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • FreeRTOSConfig.h 配置优化及深入

    本篇目标 基于上一篇的移植freertos stm32f4 freertos 上 修改 FreeRTOSConfig h 文件的相关配置来优化辅助 FreeRtos 的使用 并且建立一些基本功能 信号量 消息地列等 的简单应用位于 stm3
  • FreeRTOS 配置TICK_RATE_HZ

    我使用的是带有 5 4 版 FreeRTOS 的 MSP430f5438 我有一个有趣的问题 我无法弄清楚 基本上 当我将 configTICK RATE HZ 设置为不同的值时 LED 闪烁得更快或更慢 它应该保持相同的速率 我将 con
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • 有可用的 FreeRTOS 解释语言库吗?

    我在一家公司工作 该公司使用 FreeRTOS 为多个设备创建固件 最近 我们对新功能的要求已经超出了我们固件工程师的工作能力 但我们现在也无力雇用任何新人 即使进行微小的更改 也需要固件人员在非常低的级别上进行修改 我一直在为 FreeR
  • C++ freeRTOS任务,非静态成员函数的无效使用

    哪里有问题 void MyClass task void pvParameter while 1 this gt update void MyClass startTask xTaskCreate this gt task Task 204
  • 有关 CMake 错误的问题:没有为目标提供源

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

随机推荐

  • 使用合成数据改善机器学习中的极度不平衡数据集

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • NVIDIA A100 深度解密(一):GPU 峰值计算那些事

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • 算法中七种常见的时间复杂度

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • Python之日志处理(logging模块)

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • 李群、李代数之我的理解

    我目前的研究领域转到了立体匹配方向 但是基础很薄弱 xff0c 很多理论知识都需要补充 希望自己能够满满的累积起足够的基础知识 这篇博客主要是记录自己对李群 李代数的初步理解 xff0c 还请大家一些讨论进步 参考资料 lie group
  • 科研神器软件(关于查词、翻译)

    整理了几个和科研相关的神器软件 网址 xff0c 关于英文写作 翻译 查词的 xff0c 记录如下 xff1a 英文写作的词句库网站 xff0c 包含大量的例句和写作模板 xff1a https www phrasebank manches
  • CT典型数据——shepp_logan体模数据的生成 python版本

    phantominator包介绍 网址 xff1a https github com mckib2 phantominator安装 xff1a pip install phantominator简介 xff1a 用于简便的生成 numeri
  • 解决 dpkg 安装出错后的 Sub-process /usr/bin/dpkg returned an error code (1) 错误

    前言 在使用 dpkg i 安装 deb软件包的过程中 xff0c 会出现安装失败的可能 之后无论用 sudo apt install f or sud apt autoremove 等常见的修复命令都是无效的 网络上很多解决方案都直接给出
  • Ubuntu20.4 休眠之后网络出现问题的解决方案

    问题简介 Ubuntu20 04 在休眠之后 xff0c 如果网络出现了无法连接或者无法共享的各种问题 xff0c 只有重启才能解决 xff0c 那么以下操作可以让你不用重启电脑 解决方案 重启 network kernel modules
  • 京东京造K系列机械键盘在Linux下的使用

    前言 京东京造是一款为Mac iPad iPhone适配出色的蓝牙键盘 xff0c 官方也支持Win系统 这款键盘 xff0c 其实就是Keychron K8 xff0c 国外非常火的Mac键盘 xff0c 深受苹果用户的喜爱 YouTub
  • 事件相机仿真器(ESIM)安装记录

    前言 在 Ubuntu 20 04 下安装 ESIM 事件相机仿真器 特此记录 资料 官网 https github com yunxdai rpg esim 安装指导 https github com uzh rpg rpg esim w
  • [翻译]解决使用 git clone 命令时出现的 ‘gnutls_handshake() failed’ 错误

    错误介绍 使用 git clone 时出现如下错误 xff1a fatal unable to access 39 https github com Syllo nvtop git 39 gnutls handshake failed Th
  • 解决 pycharm 从快捷方式启动与从终端启动环境不同的问题

    前言 博主在安装了 ros 相关的两个python包 rospy 和 roslaunch 之后 xff0c pycharm 无法 import 这两个包 但是在终端中用同样的python解释器又可以import这两个包 同时 xff0c 从
  • Ubuntu 常用命令使用记录

    Linux 查找包含特定关键词的文件 grep r E 39 word1 word2 word3 39 yourpath gt gather log 如果要and关系查找 则要用管道 grep pattern1 files grep pat
  • Linux 通过 SSH 挂载远程文件夹

    前言 在两台Linux电脑之间 xff0c 我们可以通过ssh方便的登录另一台电脑并访问它的文件或者文件夹 但这都是我们用户在进行操作 想要在一台电脑上运行程序 xff0c 处理放在另一台电脑上的文件时 xff0c 我们应该如何设置呢 xf
  • ROS节点的初始化及退出详解(ros::init、SIGINT、ros::ok、ros::NodeHandle)

    希望大家收藏 xff1a 本文更新地址 xff1a https haoqchen site 2018 04 28 ROS node init 左侧专栏还在更新其他ROS实用技巧哦 xff0c 关注一波 xff1f 很多ROS新手编写节点的时
  • Ubuntu 终端前多了个 base

    Ubuntu 终端前多了个 base xff0c 想将base去掉 xff0c 如何操作 xff1f 原文 xff1a https blog csdn net qq 35544714 article details 109270602 装完
  • GNU __attribute__浅析

    GNU attribute 浅析 1 介绍 attribute 是GCC的特性 xff0c 其实是个编译器指令 xff0c 告诉编译器声明的特性 xff0c 或者让编译器进行更多的错误检查和高级优化 attribute 可以设置函数属性 x
  • FreeRTOS学习(一)

    1 FreeRTOS任务基础 1 1 多任务系统 在51单片机 AVR STM32裸机编程时 xff0c 我们通常都是用一个main函数里面加一个while 1 做一个大循环来完成所有的事务处理 xff0c 同时在加上中断处理一些较为紧急的
  • FreeRTOS学习(四)

    4 FreeRTOS信号量 4 1 信号量简介 信号量主要是用于对共享资源的访问和任务同步 具体的使用例子就不进行展开 4 2 二值信号量 4 2 1 二值信号量简介 二值信号量通常用于互斥访问或同步 xff0c 二值信号量与互斥信号量非常