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

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

3天内不再提示

简单介绍信号与信号量

PE5Z_PCBTech 来源:未知 作者:胡薇 2018-05-25 10:14 次阅读

信号量实际上是一种约定机制,在多任务内核中普遍使用。信号量用于:控制共享资源的使用权(满足互斥条件)标志某事件的发生使两个任务的行为同步。

信号与信号量在英文中都叫做Semaphore,并不加以区分,而说它有两种类型,二进制型(binary)和计数器型(counting)。本书中的二进制型信号量实际上是只取两个值0和1的信号量。实际上这个信号量只有一位,这种信号量翻译为信号更为贴切。而二进制信号量通常指若干位的组合。

信号像是一把钥匙,任务要运行下去,得先拿到这把钥匙。如果信号已被别的任务占用,该任务只得被挂起,直到信号被当前使用者释放。换句话说,申请信号的任务是在说:“把钥匙给我,如果谁正在用着,我只好等!”信号是只有两个值的变量,信号量是计数式的。只取两个值的信号是只有两个值0和1的量,因此也称之为信号量。计数式信号量的值可以是0到255或0到65535,或0到4294967295,取决于信号量规约机制使用的是8位、16位还是32位。到底是几位,实际上是取决于用的哪种内核。根据信号量的值,内核跟踪那些等待信号量的任务。

一般地说,对信号量只能实施三种操作:初始化(INITIALIZE),也可称作建立(CREATE);等信号(WAIT)也可称作挂起(PEND);给信号(SIGNAL)或发信号(POST)。信号量初始化时要给信号量赋初值,等待信号量的任务表(Waitinglist)应清为空。

想要得到信号量的任务执行等待(WAIT)操作。如果该信号量有效(即信号量值大于0),则信号量值减1,任务得以继续运行。如果信号量的值为0,等待信号量的任务就被列入等待信号量任务表。多数内核允许用户定义等待超时,如果等待时间超过了某一设定值时,该信号量还是无效,则等待信号量的任务进入就绪态准备运行,并返回出错代码(指出发生了等待超时错误)。

任务以发信号操作(SIGNAL)释放信号量。如果没有任务在等待信号量,信号量的值仅仅是简单地加1。如果有任务在等待该信号量,那么就会有一个任务进入就绪态,信号量的值也就不加1。于是钥匙给了等待信号量的诸任务中的一个任务。至于给了那个任务,要看内核是如何调度的。收到信号量的任务可能是以下两者之一。

等待信号量任务中优先级最高的,或者是

l最早开始等待信号量的那个任务,即按先进先出的原则(First In First Out ,FIFO)

有的内核有选择项,允许用户在信号量初始化时选定上述两种方法中的一种。但μC/OS-Ⅱ只支持优先级法。如果进入就绪态的任务比当前运行的任务优先级高(假设,是当前任务释放的信号量激活了比自己优先级高的任务)。则内核做任务切换(假设,使用的是可剥夺型内核),高优先级的任务开始运行。当前任务被挂起。直到又变成就绪态中优先级最高任务。

同步:

可以利用信号量使某任务与中断服务同步(或者是与另一个任务同步,这两个任务间没有数据交换)。如图2.13所示。注意,图中用一面旗帜,或称作一个标志表示信号量。这个标志表示某一事件的发生(不再是一把用来保证互斥条件的钥匙)。用来实现同步机制的信号量初始化成0,信号量用于这种类型同步的称作单向同步(unilateralrendezvous)。一个任务做I/O操作,然后等信号回应。当I/O操作完成,中断服务程序(或另外一个任务)发出信号,该任务得到信号后继续往下执行。

如果内核支持计数式信号量,信号量的值表示尚未得到处理的事件数。请注意,可能会有一个以上的任务在等待同一事件的发生,则这种情况下内核会根据以下原则之一发信号给相应的任务。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 信号
    +关注

    关注

    11

    文章

    2632

    浏览量

    75362
  • 信号量
    +关注

    关注

    0

    文章

    53

    浏览量

    8257

原文标题:【小知识】信号与信号量介绍

文章出处:【微信号:PCBTech,微信公众号:EDA设计智汇馆】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    信号量用法

    本帖最后由 chenshuihong 于 2016-4-22 11:28 编辑 信号量的分配,信号量的分配,信号量的分配,信号量的分配
    发表于 04-22 11:27

    RT-Thread信号量删除后释放信号量跟获取信号量还是成功

    RT-Thread中创建了一个动态的信号量,运行10次这个线程后删除这个动态信号量,但是问题是10次后他再次释放信号量跟获取信号量还是成功的,请问是什么问题。
    发表于 01-15 05:04

    信号量删除问题

    请问最近我在学习UCOSii在使用到删除信号量时遇到问题;程序如下OSTimeDly(50);//OS_ENTER_CRITICAL();//进入临界区(无法被中断打断)UART_Send_Str
    发表于 06-10 04:36

    信号量和互斥信号量该怎么选择?

    既然说信号量可能会导致优先级反转,那全都在工程里使用互斥信号不就行了?还要信号量干啥?大家一起用互斥信号量
    发表于 08-26 03:14

    请求信号量是什么意思?

    各位大神求教,视屏学习里说信号量相当于变量,下面有几点疑问1.下图是OSSemCreate();函数创建信号量,创建一个二进制信号量将初始值置1,那么运行OSSemPost();信号量
    发表于 09-27 04:35

    关于UCOSIII的信号量和互斥信号量的理解?

    在UCOSIII中延时一定会引起任务切换,如果所有任务都进入等待态,则切换到空闲任务运行?请求信号量,如果信号量值非零,不进行任务切换;为零,(等待超时后?或者一般都是设置死等)进行任务切换?释放
    发表于 03-13 00:11

    信号量的作用与分类

    目录信号量的作用信号量的分类信号量创建获取释放信号量头文件semphr.h1创建信号量2获取信号量
    发表于 08-24 06:13

    信号量是什么?信号量怎么运作

    信号量信号量简介二值信号量计数信号量应用场景二值信号量怎么运作计数信号量怎么运作
    发表于 01-05 08:09

    二值信号量简介

    (任务与任务或任务与中断的同步),而互斥信号量适合用于简单的互斥访问。和队列一样,信号量API函数允许设置一个阻塞时间,阻塞时间是当任务获取信号量的时候由于
    发表于 01-19 07:15

    FreeRTOS信号量介绍

    还是有一些细微的差别,互斥信号量拥有优先级继承机制,二值信号量没有优先级继承。因此二值信号另更适合用于同步(任务与任务或任务与中断的同步),而互斥信号量适合用于
    发表于 01-27 07:28

    信号量和互斥信号量的相关资料分享

    信号量简介信号量就是一个上锁的机制,代码必须获得钥匙才能执行,一旦获得了信号量,就相当于该代码具有了进入被锁代码的权限。说白了,就和java多线程中常用的锁非常相似。信号量类型在个人的
    发表于 03-02 07:11

    LabVIEW信号量

    LabVIEW信号量信号量是一种用来限制可以同时取用共享(受保护)资源的任务数量方法。受保护的资源或关键代码部分可能包括写入全局变量或与外部仪器进行通信。您可以使用信号量使您的代码线程安全
    发表于 04-09 21:52

    怎么使用ucos的信号量

    应该怎么使用ucos的信号量,在什么情况下使用二进制信号量和数值型信号量
    发表于 10-07 07:41

    关于RTOS中的信号量问题

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

    Linux信号量(2):POSIX 信号量

    上一章,讲述了 SYSTEM V 信号量,主要运行于进程之间,本章主要介绍 POSIX 信号量:有名信号量、无名信号量。 POSIX
    的头像 发表于 10-29 17:34 440次阅读