VxWorks主要提供如下API进行信号量的创建、获取和释放:
 
参数1:SEM_Q_PRIORITY,SEM_Q_FIFO
SEM_Q_PRIORITY(值为0x1):需要获取该信号量的任务基于优先级顺序排列。
SEM_Q_FIFO(值为0x0):需要获取该信号量的任务基于等待任务队列的先进先出顺序排列。

参数2: SEM_FULL,SEM_EMPTY

SEM_FULL: 初始化信号量为满(可用),
SEM_EMPTY: 后者初始化信号量为空(不可用)。
 
(1)semBCreate( ):分配并初始化一个二进制信号量,函数原型为:
SEM_ID      semBCreate
(
    int         options,      /*信号量选项*/
    SEM_B_STATE initialState  /*信号量初始化状态值*/
) ;
(2)semMCreate( ):分配并初始化一个互斥信号量,函数原型为:
SEM_ID         semBCreate 

    int              options,         /*信号量选项*/ 
    SEM_B_STATE      initialState      /*信号量初始化状态值*/ 
);
(3)semCCreate( ):分配并初始化一个计数信号量,函数原型为:
SEM_ID         semCCreate 

    int              options,         /*信号量选项*/ 
    int              initialCount    /*信号量初始计数值*/ 
) ;
当一个信号量被创建时,它的队列(queue)类型需要被确定。等待信号量的任务队列可以以优先级顺序 (SEM_Q_PRIORITY)或者先到先得方式(SEM_Q_FIFO)排列。
(4)semDelete( ):删除一个自由的信号量,函数原型为:
STATUS         semDelete 

    SEM_ID     semId     /*要删除的信号量ID号*/ 
);
(5)semTake( ):占有一个信号量,函数原型为:
STATUS         semTake 

    SEM_ID      semId     /*所要得到的信号量ID号*/ 
    int         timeout /*等待时间*/ 
);
(6)semGive( ):释放一个信号量,函数原型为:
STATUS         semGive 

    SEM_ID     semId     /*所给出的信号量ID号*/ 
);
(7)semFlush( ):解锁所有等待信号量的任务,函数原型为:
STATUS         semFlush

    SEM_ID     semId     /*要解锁的信号量ID号*/ 
);
 
二进制信号量:
  要创建一个发挥互斥作用的二进制信号量一般使用semBCreat(xxx, SEM_FULL)调用,其中的SEM_FULL暗示该信号量用于任务间的互斥(最开始二进制信号量可获得)。对临界区域(critical region)的访问需以semTake和semGive加以保护:
semTake (semMutex, WAIT_FOREVER);
. .  /*critical region, only accessible by a single task at a time*/ 
semGive (semMutex);
 
  要创建一个发挥同步作用的二进制信号量一般使用semBCreat(xxx, SEM_EMPTY) 调用,其中的SEM_EMPTY 暗示该信号量用于任务间的同步(即最开始二进制信号量不可获得)。
  二进制信号量使用最广泛的一种情况是中断与任务间通信。中断服务程序一般以二进制信号量“通知”对应的任务进行中断后的处理工作,例如:
SEM_ID syncSem;/* ID of sync semaphore */
myTask(void)
{
  semTake(syncSem, WAIT_FOREVER); /* wait for event to occur */
  printf("my Task got the semaphore/n");
  ... /* process event */
}
eventInterruptSvcRout(void)
{
  semGive(syncSem); /* let my Task process event */
  ...
}
 
互斥信号量
  互斥信号量可以看作一种特殊的二进制信号量,其支持普通二进制信号量不支持的一些特性,提供优先级继承、安全删除和回归能力。互斥信号量的使用方法和二进制信号量基本类似,但有如下区别:
(1)仅仅被用做互斥,不能提供同步机制;
(2)只能被使用它的任务释放;
(3)中断服务程序(ISR)不能释放它;
(4)不能使用函数semFlush( );
(5)支持使用二进制信号量进行互斥时所不支持的优先级“翻转”。
  任务的优先级翻转是指高优先级任务因等待低优先级任务占用的互斥资源而被较低优先级(高于低优先级但低于高优先级)的任务不断抢占的情况。VxWorks操作系统提供优先级继承机制对优先级翻转进行预防。占用互斥资源但优先级较低的任务被暂时地提高到等待该资源的最高优先级任务的优先级。这样,中等优先级的任务将无法抢占原本低优先级的任务,使得低优先级任务能尽快执行,释放出优先级较高的任务所需要的资源。
  为了使互斥信号量支持优先级继承支持,我们在调用semMCreate时应使用SEM_Q_PRIORITY和SEM_INVERSION_SAFE选项。互斥信号量提供互斥也需要对临界区域进行保护:
semTake (semMutex, WAIT_FOREVER);
    . .  //critical region, only accessible by a single task at a time . 
semGive (semMutex);
 
计数信号量
       计数信号量是任务同步和互斥的另一种实现方式.计数信号量除了保留信号量被释放的次数以外和二进制信号量是一样的。每次信号量被释放(gaven)一次,计数增加;每次信号量被占用(taken)一次,计数减少;当计数减少为0时,要求得到信号量的任务被阻塞(blocked)。二进制信号量是如果一个信号量被释放,有一个任务阻塞等待,则这个任务就被unblock.而计数信号量如果一个信号量被释放,没有任务阻塞等待,则计数增加。这说明一个被释放两次的计数信号量可以被占用(taken)两次,没有阻塞
 

互斥型信号量必须是同一个任务申请,同一个任务释放,其他任务释放无效。同一个任务能递归申请。

二进制信号量,一个任务申请成功后,能由另一个任务释放。可用于任务同步,也可用于互斥

计数信号量可用于队列数据的存储

VxWorks信号量问题的更多相关文章

  1. 【转】VxWorks信号量分析

    Wind内核中有二进制信号量.计数信号量和互斥信号量三种类型,为了是运用程序具有可移植性,还提供了POSIX(可移植操作系统接口)信号量 .在VxWorks中,信号量是实现任务同步的主要手段,也是解决 ...

  2. 【VxWorks系列】任务间同步与通信之信号量

    信号量是VxWorks提供的最常用,最快速的一种任务间通信机制.VxWorks中信号量有三种:二值信号量,互斥信号量,计数信号量.下面一一介绍这三种信号量的作用与区别. 信号量通常的作用就是是控制任务 ...

  3. vxworks 的 socket, thread, 信号量模型

    http://www.vxdev.com/docs/vx55man/vxworks/netguide/c-sockets.html http://www.vxdev.com/docs/vx55man/ ...

  4. vxworks 实时操作系统

    VxWorks 是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统.Tornado 是WRS 公司推出的一套实时操作系统开发环境,类似Mi ...

  5. VxWorks 6.9 内核编程指导之读书笔记 -- ISRs和Watchdog Timer

    中断服务程序 ISR 硬件中断处理是实时系统的关键,因为它是外部时间通知系统的方式. ISR亦称为中断处理函数,是对中断的正确响应.可以使用任何ISR连接到任何没有被VxWorks使用的中断上.当关联 ...

  6. VxWorks 6.9 内核编程指导之读书笔记 -- Singnals

    Signals 信号是操作系统用于异常处理和异步控制流的关键.在很多方面,信号相当于软件方面的硬件中的中断.操作系统产生的信号包括总线错误和浮点处理异常.信号也提供了API来管理和产生信号.在应用程序 ...

  7. VxWorks 6.9 内核编程指导之读书笔记 -- 多任务

    概述 VxWork系统任务 任务调度 任务创建和管理 任务的错误状态 任务异常处理 共享代码和重入 概述 现代实时操作系统是基于多任务和任务间通信的概念的.多任务环境运行一个实时进程RTP可以被作为一 ...

  8. VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks Kernel application (二)

    #1 内核对象的静态实例化 内核对象的静态实例化 任务的静态实例化 VX_TASK宏用来在编译时声明一个任务对象.该宏带有2个参数:任务名和栈大小.不像taskSpawn函数,任务名称可以是NULL. ...

  9. VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks kernel application (一)

    #1 什么是内核应用程序? #2 开发内核应用程序注意事项 什么是内核应用程序? 内核应用程序不同于RTP程序,它允许在内核态,与操作系统使用相同的地址空间.因此,它与操作系统会相互干扰.它可以编译成 ...

随机推荐

  1. function前加运算符实现立即执行函数

    我们知道函数的调用方式通常是FunctionName() 但如果我们尝试为一个"定义函数"末尾加上(),解析器是无法理解的. function msg(){ alert('mess ...

  2. JAVA自学笔记11

    JAVA自学笔记11 1:Eclipse的安装 2:用Eclipse写一个HelloWorld案例,最终在控制台输出你的名字 A:创建项目 B:在src目录下创建包.cn.itcast C:在cn.i ...

  3. js扩展运算符(spread)三个点(...)

    常见用法: 1.该运算符主要用于函数调用. function push(array, ...items) { array.push(...items); } function add(x, y) { ...

  4. pin-a-binary-instrumentation-tool

    https://software.intel.com/en-us/articles/pin-a-binary-instrumentation-tool-downloads Introduction t ...

  5. SharePoint 配置PowerShell任务计划

    前言 最近,有这么个需求,需要定时为SharePoint更新内容,所以,就想到了PowerShell命令和任务计划(Windows自带的功能,英文叫Task Schedule,在开始菜单里就能找到), ...

  6. pycharm 注册码/License server 2017年最新

    两种方法: 1.选License server激活,输入:http://idea.imsxm.com 2.2017年激活码 时效1年BIG3CLIK6F-eyJsaWNlbnNlSWQiOiJCSUc ...

  7. 微信小程序登录逻辑

    wx.getStorage({ key: 'session_id', success: function(res) { //如果本地缓存中有session_id,则说明用户登陆过 console.lo ...

  8. Win10系统的SurfacePro4如何重装系统-2 重装WIN10系统

    把SurfacePro充好电,然后关机,开机按住音量+,然后再按电源键,可以开机并进入BIOS(此前应确保优盘已经装了PE并插入Surface)   然后选择U盘启动为第一个(按住之后把他拖放到第一位 ...

  9. JAVA使用Logback发送日志到控制台、文件、ELK的最简单用法

    一.简述 本文讲JAVA使用Logback发送日志到控制台.文件.ELK的最简单用法. 二.教程 1.新建pom.xml项目引入下列依赖: <dependencies> <!--Be ...

  10. spring mvc 实战化项目之三板斧

    laravel实战化项目之三板斧 spring mvc 实战化项目之三板斧 asp.net mvc 实战化项目之三板斧 接上文希望从一张表(tb_role_info 用户角色表)的CRUD展开spri ...