二进制信号量

15 篇文章 0 订阅
订阅专栏

目录

1.creat

2.delete

3.wait

4.post

5.clear

6.属性


二进制信号量

SylixOS 的二进制信号量实现的互斥性是将一个变量初始化标记为 1,等待信号量(Wait)时将该变量减 1(此时等于 0),如果另一个线程再次等待该信号量将阻塞,直到该信号量被释放(变量加 1),这样就实现了共享资源的互斥访问。

二进制信号量的基本操作函数在线程与线程之间中断与线程之间的操作过程如下图所示。

 SylixOS 二进制信号量

 

 

1.creat

二进制信号量主要应用在以下场合:

  • 有允许线程访问的一个资源,使用二进制信号量作为互斥手段,初始值为 TRUE
  • 线程或中断通知另一个线程某件事件发生,初始值为 FALSE
SylixOS 提供函数 Lw_SemaphoreB_Create 创建一个二进制信号量
#include <SylixOS.h>
LW_HANDLE Lw_SemaphoreB_Create(CPCHAR pcName, 
    BOOL bInitValue, 
    ULONG ulOption, 
    LW_OBJECT_ID *pulId);
函数 Lw_SemaphoreB_Create 原型分析:
  • 此函数返回二进制信号量的句柄,失败时为 NULL 并设置错误号;
  • 参数 pcName 是二进制信号量的名字;
  • 参数 bInitValue 是二进制信号量的初始值FALSE TRUE);
  • 参数 ulOption 是二进制信号量的创建选项如图 3 所示;
  • 输出参数 pulId 用于返回二进制信号量的句柄(同返回值),可以为 NULL

参数 bInitValue 的不同决定了二进制信号量的用途不同,当 bInitValue 的值为 TRUE 时可以用于共享资源的互斥访问,如图1 所示。当 bInitValue 的值为 FALSE 时可以用于多线程间的同步,如图 2  所示。

图 1 共享资源的互斥访问
图 2 线程同步

信号量的创建选项参数见图 3 所示。SylixOS 提供了两种信号量等待队列:优先级(LW_OPTION_WAIT_PRIORITY)和 FIFO(LW_OPTION_WAIT_FIFO)。优先级方式则根据线程的优先级从队列中取出符合条件的线 程运行;FIFO 方式则根据先入先出的原则从队列中取出符合条件的线程运行。

需要注意的是,LW_OPTION_WAIT_PRIORITY LW_OPTION_WAIT_FIFO 只能二选一,同样LW_OPTION_OBJECT_GLOBAL LW_OPTION_OBJECT_LOCAL也只能二选一。其中LW_OPTION_OBJECT_GLOBAL 代表一种全局对象,LW_OPTION_OBJECT_LOCAL 代表一种局部对象,当进程退出时不会释放全局对象资源(除非特殊,一般不使用 GLOBAL 对象)。

图 3  二进制信号量的创建选项

 

2.delete

不再需要的二进制信号量可以调用Lw_SemaphoreB_Delete函数将其删除SylixOS 将回收其占用的内核资源(试图使用被删除的二进制信号量将出现未知的错误)。

#include <SylixOS.h>
ULONG Lw_SemaphoreB_Delete(LW_HANDLE *pulId)
函数 Lw_SemaphoreB_Delete 原型分析:
  • 此函数成功返回 0,失败返回错误号;
  • 参数 pulId 是二进制信号量的句柄。 

 

3.wait

一个线程如果需要 等待一个二进制信号量 ,可以调用 Lw_SemaphoreB_Wait 函数。
#include <SylixOS.h>
ULONG Lw_SemaphoreB_Wait(LW_HANDLE ulId, ULONG ulTimeout);
ULONG Lw_SemaphoreB_TryWait(LW_HANDLE ulId);
以上函数原型分析:

 

  • 函数成功返回 0,失败返回错误号;
  • 参数 ulId 是二进制信号量的句柄;
  • 参数 ulTimeout 是等待的超时时间,单位为时钟节拍 Tick

参数 ulTimeout除了可以使用数字外还可以使用如图 4 所示的宏。SylixOS 为二进制信号量等待提供了一种超时机制,当等待的时间超时时立即返回并设置 errno 为 ERROR_THREAD_WAIT_TIMEOUT。
 

图 4 参数 ulTimeout 可用宏
 

 

中断服务程序不能调用 Lw_SemaphoreB_Wait 函数来等待一个二进制信号量,因为该函数在二进制信号量值为 FALSE 时会阻塞当前执行的任务,而中断服务程序用来处理最紧急的事情,因此是不允许被阻塞的,否则其他线程将得不到调度的机会。

 

中断服务程序可以使用 Lw_SemaphoreB_TryWait 函数尝试等待二进制信号量,因为Lw_SemaphoreB_TryWait 函数在二进制信号量的值为 FALSE 时会立即返回,不会阻塞当前线程。

 

4.post

释放一个二进制信号量可以调用 Lw_SemaphoreB_PostLw_SemaphoreB_Post2 或者Lw_SemaphoreB_Release 函数。 Lw_SemaphoreB_Post2 函数返回时可以通过参数 pulId 返回被激活的线程句柄,如果参数 pulId 被置为 NULL 时行为与Lw_SemaphoreB_Post 相同。

#include <SylixOS.h>
ULONG Lw_SemaphoreB_Post(LW_HANDLE ulId);
函数 Lw_SemaphoreB_Post 原型分析:
  • 此函数成功返回 0,失败返回错误号;
  • 参数 ulId 是二进制信号量的句柄。
#include <SylixOS.h>
ULONG Lw_SemaphoreB_Post2(LW_HANDLE ulId, LW_HANDLE *pulId);
函数 Lw_SemaphoreB_Post 原型分析:
  • 此函数成功返回 0,失败返回错误号;
  • 参数 ulId 是二进制信号量的句柄;
  • 参数 pulId 返回被激活的线程 ID
#include <SylixOS.h>
ULONG Lw_SemaphoreB_Release(LW_HANDLE ulId, ULONG ulReleaseCounter, BOOL *pbPreviousValue);
函数 Lw_SemaphoreB_Release 原型分析:
  • 此函数成功返回 0,失败返回错误号;
  • 参数 ulId 是二进制信号量的句柄;
  • 参数 ulReleaseCounter 是释放二进制信号量的次数;
  • 输出参数 pbPreviousValue 用于接收原来的二进制信号量状态,可以为 NULL

 

 

 

5.clear

调用 Lw_ SemaphoreB_Clear 函数将清除二进制信号量,这将使二进制信号量的初始值置为 FALSE

#include <SylixOS.h>
ULONG Lw_SemaphoreB_Clear(LW_HANDLE ulId);
函数 Lw_SemaphoreB_Clear 原型分析:
  • 此函数返回错误号;
  • 参数 ulId 是二进制信号量的句柄。

调用 Lw_ SemaphoreB_Flush 函数将释放在指定信号量等待的所有线程

#include <SylixOS.h>
ULONG Lw_SemaphoreB_Flush(LW_HANDLE ulId, ULONG *pulThreadUnblockNum);
函数 Lw_SemaphoreB_Flush 原型分析:
  • 此函数返回错误号;
  • 参数 ulId 是二进制信号量的句柄;
  • 输出参数 pulThreadUnblockNum 用于接收被解除阻塞的线程数,可以为 NULL

 

6.属性

Lw_SemaphoreB_Status 函数返回一个有效 信号量的状态信息
 
#include <SylixOS.h>
ULONG Lw_SemaphoreB_Status(LW_HANDLE ulId, BOOL *pbValue, ULONG *pulOption, ULONG *pulThreadBlockNum);
函数 Lw_SemaphoreB_Status 原型分析:
  • 此函数返回错误号;
  • 参数 ulId 是二进制信号量的句柄;
    • 输出参数 pbValue 用于接收二进制信号量当前的值(FALSE TRUE);
  • 输出参数 pulOption 用于接收二进制信号量的创建选项;
  • 输出参数 pulThreadBlockNum 用于接收当前阻塞在该二进制信号量的线程数。
调用 Lw_SemaphoreB_GetName 函数可以获得指定 信号量的名字
 
#include <SylixOS.h>
ULONG Lw_SemaphoreB_GetName(LW_HANDLE ulId, PCHAR pcName)
函数 Lw_SemaphoreB_GetName 原型分析:
  • 此函数返回错误号;
  • 参数 ulId 是二进制信号量的句柄;
  • 输出参数 pcName 是二进制信号量的名字,pcName 应该指向一个大小为LW_CFG_OBJECT_NAME_SIZE 的字符数组。
 
关于二进制信号量
luyejishu的专栏
01-16 1768
今天刚看到二进制信号量的问题,有些疑问请教大家:1,用共享资源时需要用二进制信号量互斥,我的问题是,程序不是顺序执行的嘛,那在一个时间段只有一个程序可以访问共享资源,这个程序完了 ,下个程序才能访问。何必要互斥,难道程序都是并行发生的?2,一个例子:#include "vxworks.h"#include "tasklib.h"#include "semlib.h"#include "
SylixOS信号量二进制信号量、 计数型信号量互斥信号量(简称互斥量)、 读写信号量
动感超人_Crush
09-09 947
目录 SylixOS 信号量 二进制信号量 互斥信号量 计数器信号量 SylixOS 信号量 多个线程在读写某个共享数据(全局变量等)时必须通过某种方法实现共享数据的互斥访问或者同步访问(例如线程 B 等待线程 A 的结果以继续运行)。其中,信号量是一种最常见的方法。 SylixOS 信号量包括四种类型: 二进制信号量、 计数型信号量互斥信号量(简称互斥量)、 读写信号量信号量是一种约定机制:在共享资源的互斥访问中,它约定当一个线程获得信号量(Wait)后,其他线程不可以
互斥二进制信号量使用
greston的专栏
10-31 6824
1. 二进制信号量 semBCreate (SEM_Q_FIFO/SEM_Q_PRIORITY , SEM_EMPTY/SEM_FULL) 有两个作用: (1)任务间的互斥 -- 同一个任务获取和释放信号量,防止两个任务同时存取一个资源 (2)任务间的同步 -- 一个任务获取信号量,另一个任务(或者中断)释放信号量 2. 互斥信号量 semMCreate(SEM_Q_PRIOR
VxWorks学习篇-二进制信号量
热门推荐
无知的我
10-30 1万+
目前国内雷达信号处理平台上所用的操作系统大多为VxWorks,在VxWorks中,信号量是一种在不同任务间有效传递消息的机制,其中包括二进制信号量、计数型信号量互斥信号量。在这些信号量中,二进制信号量使用最为普遍,下面是对该类型信号量原理的分析。 1、基本函数 在二进制信号量中,主要涉及到下面三个函数 semBCreate该函数作用是创建二进制信号量 SEM_IDsemTes
二进制信号量 linux,二进制信号量在多线程间实现同步模型
weixin_28994357的博客
05-15 248
在多线程同步开发中,为了实现执行线程在条件未到达时等待条件到达,进而用忙等待实现等待,这样大大浪费了CPU资源且CPU占用很大,导致服务器系统整体性能下降。为了解决CPU占用大的问题,用信号量替代忙等待条件,实现执行线程在条件未到达时用阻塞等待条件到达。下面是用二进制信号量实现多线程间同步简单设计模型。#include#include#include#include#define NUM8 /...
跟着野火学FreeRTOS:第二段(二进制信号量,计数信号量互斥量,递归互斥量)
最新发布
02-02
本篇文章将深入探讨FreeRTOS中的四种关键同步机制:二进制信号量、计数信号量互斥量以及递归互斥量。这些概念是理解FreeRTOS内核工作原理的基础,对于编写高效、可靠的嵌入式程序至关重要。 首先,我们来看二进制...
freertos中的二进制信号量
08-18
在 FreeRTOS 中,二进制信号量是一种用于线程同步的对象。它可以用于线程间的互斥和同步操作。二进制信号量只有两个状态:0 和 1。当二进制信号量为 0 时,表示资源被占用,其他线程需要等待;当二进制信号量为 1 时...
Linux进程间通信:二进制信号量实战解析
在Linux中,信号量分为二进制信号量(只能取0或1)和通用信号量(可取多个正整数)。二进制信号量通常用于简单的互斥控制,而通用信号量则提供了更复杂的资源计数功能。 当一个进程执行P操作(wait或decrement)时...
互斥锁和二进制信号量的关系
07-14
互斥锁(Mutex)和二进制信号量(Binary Semaphore)都是用于实现线程或进程之间的同步和互斥的机制,但它们有一些不同之处。 互斥锁是一种同步机制,用于确保在任何时刻只有一个线程或进程可以访问共享资源。它...
举一个例子,关于二进制信号量的用法,要有代码说明
06-07
好的,以下是一个使用二进制信号量的例子,假设有两个任务Task1和Task2,Task1需要等待Task2发送信号才能继续执行。代码如下: ```c #include "FreeRTOS.h" #include "task.h" #include "semphr.h" // 创建二进制...
java如何实现信号量_使用二进制信号量实现通用信号量
weixin_31192609的博客
02-23 231
看到你的问题图像后,输入信号量的目的是只允许单个进程/线程等待锁定,如果你不使用它,其他进程将进入等待队列 .why we need the entry semaphore条目信号量使用任何值初始化,如果它是全局声明的,则它将初始化为0.因此,如果条目信号量为0,则wait(条目)将仅允许单个进程进入,因为wait()功能检查条目值是否小于零,然后进程将进入等待队列 .How can multi...
linux二进制信号量的概念
shenhuxi_yu的专栏
12-28 2118
互斥信号量必须是同一个任务申请,同一个任务释放,其他任务释放无效。同一个任务可以递归申请。 二进制信号量,一个任务申请成功后,可以由另一个任务释放。二进制信号量实现任务互斥: 打印机资源只有一个,abc三个任务共享,当a取得使用权后,为了防止其他任务错误地释放了信号量(),必须将打印机房的门关起来(进入临界段),用完后,释放信号量,再把门打开(出临界段),其他任务再进去打印。(而互斥信号量由于
!操作系统 —— 7 信号量和管程实现同步和互斥
qq_42713936的博客
04-11 1656
信号量和管程1 背景2 信号量3 信号量使用3.1 用二进制信号量3.1.1 实现互斥3.1.2 实现同步互斥3.2 更复杂的同步互斥不能用简单的二进制信号量来解决(条件同步)4 信号量实现5 管程6 经典同步问题 1 背景 研究信号量和管程如何解决同步和互斥的问题 锁机制解决互斥 需要更高级的同步互斥语义,还可以借助硬件原子操作来实现更高层的同步互斥 进入临界区的进程或线程若只是做读操作,则.........
信号量机制实现进程互斥
刘甜的博客
07-13 3099
目录 1.总览 2.信号量机制实现进程互斥 3.信号量机制实现进程同步 4.信号量机制实现前驱关系 5.小结 1.总览 2.信号量机制实现进程互斥 3.信号量机制实现进程同步 4.信号量机制实现前驱关系 5.小结 ...
第4章第7节 二进制信号量(一)
ifreecoding的博客
06-29 1494
目前更新到5.3节,请在http://dl.dbank.com/c02ackpwp6下载5.3节的全部文档 本节源代码请在http://dl.dbank.com/c0fp2g5z9s下载   第7节 二进制信号量 某些资源在同一时刻只可以被一个任务操作,实时操作系统的任务抢占特性会导致这些资源可能被多个任务同时操作,从而产生错误。本节将讲述二进制信号量的原理,可以利用二进制信号量保护这些资源
韦东山freeRTOS系列教程之【第六章】信号量(semaphore)
韦东山嵌入式专栏
11-23 8325
文章目录系列教程总目录概述6.1 信号量的特性6.1.1 信号量的常规操作6.1.2 信号量跟队列的对比6.1.3 两种信号量的对比6.2 信号量函数6.2.1 创建6.2.2 删除6.2.3 give/take6.3 示例12: 使用二进制信号量来同步6.4 示例13: 防止数据丢失6.5 示例14: 使用计数型信号量 需要获取更好阅读体验的同学,请访问我专门设立的站点查看,地址:http://rtos.100ask.net/ 系列教程总目录 本教程连载中,篇章会比较多,为方便同学们阅读,点击这里可以
计数型信号量
动感超人_Crush
09-15 1176
计数型信号量 计数型信号量通常用于多个线程共享使用某资源。 下图显示了SylixOS计数型信号量的基本操作函数在线程与线程之间、中断与线程之间的操作过程。 SylixOS 计数型信号量 1.Create 一个 SylixOS 计数型信号量可以调用 Lw_SemaphoreC_Create 函数进行创建。 #include <SylixOS.h> LW_HANDLE Lw_SemaphoreC_Create(CPCHAR pcName, ULONG ulInitCou
SylixOS 不同容器(ECS)间使用信号量同步方案
stone8761的专栏
07-24 377
1、概述 在 SylixOS 容器版本中由于容器间存在命名空间隔离的问题因此无法直接使用信号量进行同步操作,这在某些场合下可能无法完成实际需求,如共享内存通信时。本文介绍一种在容器间实现信号量同步功能的解决方案。 2、解决方案 此解决方案思路是在 SylixOS 标准信号量的基础上封装一层字符设备,在内核层创建信号量并提供相关接口使容器内的 APP 可以通过字符设备接口获取内核信号量句柄,再通过标准信号量 API 进行操作。实现不同容器间的 APP 同步操作。基本框架如下图...
写文章

热门文章

  • 键盘win和alt互换了怎么改回 244448
  • 串口流控(CTS/RTS)使用详解 55973
  • 理解——“进程是资源分配的最小单位,线程是CPU调度的最小单位” 19865
  • 什么是优先级反转及解决方法 16027
  • TCP服务器连接多客户端(C语言实现) 10051

分类专栏

  • POSIX 10篇
  • 计算机网络 20篇
  • 操作系统 19篇
  • 硬件基础 12篇
  • SylixOS 14篇
  • SylixOS 系统安装 8篇
  • SylixOS IO系统 9篇
  • SylixOS线程 15篇
  • SylixOS进程 5篇
  • SylixOS驱动 5篇
  • C语言基础 9篇
  • 算法设计与分析 17篇
  • C++面向对象 25篇
  • 简单java运用 14篇
  • 数据结构
  • 顺序表和链表 14篇
  • 栈和队列 9篇
  • 查找和排序 14篇
  • 树和图 19篇
  • 其他 3篇

最新评论

  • 键盘win和alt互换了怎么改回

    dog153scut: 有些键盘是有按钮直接切换WIN/IOS的

  • 键盘win和alt互换了怎么改回

    xzb666n: 爽了,有效了

  • 键盘win和alt互换了怎么改回

    廖xl同学: Fn+A有效,如果是笔记本用的外接键盘,哪个键盘有问题,就在哪个键盘用fn+A

  • 键盘win和alt互换了怎么改回

    onyruin: 我的键盘居然拿是【FN+W】切换到WIN键盘,【FN+E】切换到MAC键盘表情包希望对大家有用

  • 键盘win和alt互换了怎么改回

    m0_67808221: Fn+A有效

最新文章

  • SylixOS网络之DMA(Direct Memory Access)
  • SylixOS网络协议栈之--struct netif 数据结构浅析(更新中)
  • WindTerm软件的本地模式和远程模式
2024年6篇
2023年6篇
2022年7篇
2021年51篇
2020年45篇
2019年18篇
2018年14篇
2017年82篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家河北商业商场美陈许昌玻璃钢雕塑小品厂家江苏室内商场美陈哪里有潮州玻璃钢伟人像雕塑佛山玻璃钢雕塑 骏域玻璃钢三官大帝雕塑厂广州市玻璃钢雕塑定制商场卫生间美陈玻璃钢公园雕塑垃圾桶定制景观小品玻璃钢老虎雕塑周年商场美陈销售公司泡沫雕塑怎么变成玻璃钢沈阳商场美陈布置方案深圳玫红色玻璃钢花盆红色玻璃钢雕塑制作四川抽象玻璃钢雕塑订做价格河北常用商场美陈报价山东玻璃钢雕塑摆件市场报价江苏动物玻璃钢雕塑乐昌玻璃钢花盆花器玻璃钢雕塑产品报价惠州雕塑玻璃钢盐城玻璃钢鹿雕塑价格丽水玻璃钢名人雕塑玻璃钢元旦雕塑摆设香洲玻璃钢雕塑浙江商场创意商业美陈步骤山东大型商场美陈研发公司济南武汉市政工程绿化玻璃钢花盆沅江玻璃钢牌匾雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化