0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Semaphore信号量概念及其介绍

冬至子 来源:ITRelief 作者:Sachefgh Xu 2023-07-25 15:40 次阅读

信号量即Semaphore。信号量主要用于控制和保护任务对特定资源的访问。FreeRTOS的信号量分为二值信号量、计数型信号量和互斥信号量。其中互斥信号量即Mutex在CMSIS API中被独立;本文主要讲解二值信号量和计数型信号量。

在FreeRTOS中,二值信号量和计数信号量在创建方式和功能上没有差异,两者区别仅为二值信号量token数为1;而计数信号量token>1。

图示为CMSIS-RTOS的信号量抽象原理图。系统创建信号量,一并指定信号量内token(object)数量。线程(任务)可进行拿取/放入token的操作。

①放入token:线程可以向信号量中放入token。调用一次相应函数即放入一个。若当前信号量已满则报错。

②拿取token:   线程向信号量中拿取token。和消息队列一样,取操作可以设置阻塞超时时间。当消息量中无token时,线程进入**BLOCK**状态等待消息量被放入token。**在此期间当任务检测到消息量放入token时,将自动由****BLOCK**态转移为**READY**态。当等待的时间超过了指定的阻塞时间,即使队列中尚无数据,任务也会自动从阻塞态转移为**READY**态。此时程序会返回**osErrorTimeout**错误。若没有设置**阻塞超时**参数正确,返回**osErrorResource**错误**。**
  • Semaphore APIs

①创建信号量

可以通过函数 **osSemaphoreNew() **创建信号量。在创建时,可以选择信号量可容纳token的数量、初始token数; 并且可以传入配置结构体。当创建失败时返回NULL。

当max_count为1时,将创建二值信号量。

osSemaphoreId_t osSemaphoreNew (uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr);/*
@param:   max_count        -信号量可容纳token的数量
          initial_count    -信号量初始时刻含有的token数量;initial_count<=max_count
          *attr            -配置结构体
@retval    -信号量ID(句柄);若创建失败返回NULL
*/

②获取信号量中token 【可在中断中使用】

※当在中断中使用该函数时,阻塞延时时间timeout应设置为0U,否则报Parameter错误。

线程调用该函数时,当消息量中无token时,线程进入BLOCK状态等待消息量被放入token。在此期间当任务检测到消息量放入token时,将自动由****BLOCK态转移为READY态。当等待的时间超过了指定的阻塞时间,即使队列中尚无数据,任务也会自动从阻塞态转移为READY态。此时程序会返回osErrorTimeout错误。若没有设置阻塞超时且参数正确,返回osErrorResource错误**。**

osStatus_t osSemaphoreAcquire (osSemaphoreId_t semaphore_id, uint32_t timeout);/*  获取一个token
@param:     semaphore_id    -传入信号量ID(句柄)
            timeout         -阻塞延时时间
@retval:
         osOK: 操作成功
         osErrorTimeout: the token could not be obtained in the given time.
         osErrorResource: the token could not be obtained when no timeout was specified.
         osErrorParameter: the parameter semaphore_id is NULL or invalid.*/

timeout参数:

==  0U     //不设置阻塞超时时间
 ==  osWaitForever  //任务将一直阻塞直到空队列被写入/满队列被取出数据
 ==  Ticks   //设置具体等待时间,单位为RTOS心跳数(Ticks)

③ 向信号量放入一个token 【可在中断中使用】

当信号量溢出时,函数返回**osErrorResource **。

osStatus_t osSemaphoreRelease (osSemaphoreId_t semaphore_id);/*放入一个token
@param:     semaphore_id    -传入信号量ID(句柄)
@retval:
    osOK: the token has been released and the count incremented.
    osErrorResource: the token could not be released (maximum token count has been reached).
    osErrorParameter: the parameter semaphore_id is NULL or invalid.
*/

④获取状态

uint32_t osSemaphoreGetCount (osSemaphoreId_t semaphore_id);/*获取信号量中token数
*/

⑤清理(删除)信号量

osStatus_t osSemaphoreDelete (osSemaphoreId_t semaphore_id);/*
@retval:  
    osOK: the semaphore object has been deleted.
    osErrorParameter: the parameter semaphore_id is NULL or invalid.
    osErrorResource: the semaphore is in an invalid state.
    osErrorISR: osSemaphoreDelete cannot be called from interrupt service routines.
*/
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • CMSIS
    +关注

    关注

    0

    文章

    37

    浏览量

    11767
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61349
  • 延时器
    +关注

    关注

    1

    文章

    36

    浏览量

    14731
  • 串口中断
    +关注

    关注

    0

    文章

    63

    浏览量

    13609
收藏 人收藏

    评论

    相关推荐

    【MiCOKit试用体验】庆科MiCO系统篇(2)MiCO RTOS信号量

    :其中,常用的有:(1)OSStatus mico_rtos_init_semaphore(mico_semaphore_t* semaphore, int count );该函数为初始化一个
    发表于 10-24 17:01

    【安富莱】【RTX操作系统教程】第15章 互斥信号量

    总结 15.1互斥信号量15.1.1互斥信号量概念及其作用 互斥信号量就是信号量的一种特殊形式,也就是
    发表于 01-30 17:40

    转:freeRTOS信号量学习

    kv46上移植的demo有官方提供的信号量的例程,推荐大家下载最新版的v9.0.0源码学习,新更新的特性和内容在源码包里都有提及,研究例程是最好的学习方法。这里只是给大家简单介绍使用方法,更加详细的内容还需自己仔细阅读源码和官方参考资料。
    发表于 08-12 18:29

    转:第23章 FreeRTOS互斥信号量

    互斥信号量API函数23.3 实验例程说明23.4总结23.1 互斥信号量23.1.1互斥信号量概念及其作用互斥信号量的主要作用是对资源
    发表于 09-06 14:58

    第14章 信号量

    。14.1 信号量14.2 信号量API函数14.3 实验例程说明(任务间通信)14.4 实验例程说明(中断方式通信)14.5总结14.1 信号量14.1.1信号量
    发表于 10-05 09:26

    第15章 互斥信号量

    15.1 互斥信号量15.1.1互斥信号量概念及其作用 互斥信号量就是信号量的一种特殊形式,也就是信号
    发表于 10-06 16:40

    FPGA与CPLD的概念及其区别PDF

    FPGA与CPLD的概念及其区别
    发表于 08-15 15:46

    BearPi-HM_Nano开发板鸿蒙OS内核编程开发——信号量

    osSemaphoreRelease(osSemaphoreId_t semaphore_id)描述: 函数osSemaphoreRelease释放由参数semaphore_id指定的信号量对象的标记注意 :该函数可以在
    发表于 04-09 10:21

    信号量–使用许可的概念

    永磁同步电机 除了基于每个Java对象具有的锁定位的通用同步外,您还可以使用Java中更复杂的同步器,例如: 信号量–使用许可的概念表示一个位置中允许的最大线程数。 当使用值1时,其行为类似于同步
    发表于 08-27 06:04

    FreeRTOS信号量介绍

    FreeRTOS信号量 & ESP32实战阅读建议:有一定操作系统基础知识。FreeRTOS信号量1. 二值信号量  二值信号量通常用于互斥访问或同步,二值
    发表于 01-27 07:28

    信号量semphere概述

    APItx_semaphore_createtx_semaphore_deletetx_semaphore_gettx_semaphore_puttx_semaphore_put_notifysemaphore_demo概述ThreadX提供32位计数信号量,范围在0到4
    发表于 02-22 07:29

    新手请教信号量概念问题

    请教信号量概念问题. 我准备用信号量来编写一个ARM程序,但我没有完全理解信号量概念.例如:现在有 4 个任务:TASK1,TASK2,
    发表于 02-27 11:15

    关于RTOS中的信号量问题

    信号量是操作系统里的一个基本概念 我现在了解信号量是做什么的,怎么做的。 限于工作经验,只能用到二值信号量。计数型信号量用在什么场合呢? 请
    发表于 10-31 06:25

    详解互斥信号量概念和运行

    1 、互 斥 信 号 量 1.1 互斥信号量概念及其作用 互斥信号量的主要作用是对资源实现互斥访问,使用二值信号量也可以实现互斥访问的功能,不过互斥
    的头像 发表于 10-22 11:57 1w次阅读
    详解互斥<b class='flag-5'>信号量</b>的<b class='flag-5'>概念</b>和运行

    ThreadX(六)------信号量semaphore

    APItx_semaphore_createtx_semaphore_deletetx_semaphore_gettx_semaphore_puttx_semaphore_put_notifysemaphore_demo概述ThreadX提供32位计数信号量,范围在0到4
    发表于 12-28 19:26 7次下载
    ThreadX(六)------<b class='flag-5'>信号量</b><b class='flag-5'>semaphore</b>