Vxworks信号量分析

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

关于互斥的实现:
    使用二进制信号量可以很方便的实现互斥,互斥是指多任务在访问临界资源时具有排他性。为使多个任务互斥访问临界资源,只需要为该资源设置一个信号量,相当于一个令牌,哪个任务拿到这个令牌即有权使用该资源。把信号量设为可用,然后将需要资源的任务的临界代码置于semTake()和SemGive()之间即可。
注明:

1.       互斥中的信号量与任务优先级的关系:任务的调度还是按照任务优先级进行,但是在使用临界资源的时候只有一个任务获得信号量,也就是说还是按照任务优先级来获得信号量从而访问资源。只有当前使用资源的任务释放信号量SemGive(),其他任务按照优先级获得信号量。

2.       信号量属性中的参数为:SEM_Q_PRIORITY。而且在创建信号量的时候必须把信号量置为满的SEM_FULL。即信号量可用。

基本实现互斥模型:
SEM_ID  semMutex;
semMutex = semBCreate(SEM_Q_PRIORITY, SEM_FULL);
task(void)
       {
semTake(semMutex,WAIT_FOREVER);//得到信号量,即相当于得到使用资源的令牌
//临界区,某一个时刻只能由一个任务访问;
semGive(semMutex);
}

关于任务同步的实现:
    同步即任务按照一定顺序先后执行,为了实现任务A和B的同步,只需要让任务A和B共享一个信号量,并设初始值为空,即不可用,将semGive()置于任务A之后,而在任务B之前插入semTake()即可.
说明:

1.       还是讨论和优先级的关系。由于信号量初始化为空,不可用,所以可能使得优先级反转,即高优先级任务B在等待低优先级任务A释放信号量。只有执行了信号量释放语句semGive()后任务B得到信号量才能执行。

2.       属性参数的设置为SEM_Q_FIFO,SEM_EMPTY;

实现模式参考:
SEM_ID semSync;
semSync = semBCreate(SEM_Q_FIFO,SEM_EMPTY);
taskA(void)
{
……….
semGive(semSync);   //信号量释放,有效。
}

taskB(void)
{
semTake(semSync,WAIT_FOREVER);  //等待信号量。
……..
}

使用信号量注意事项:

1.       用途不同,信号量属性和初始值不同;

2.       互斥访问资源使,semTake()和semGive()必须成对出现,且先后顺序不能颠倒;

3.       避免删除那些其他任务正在请求的信号量。

应用

1、  确保任务优先级不反转:

SEM_ID  semFs;
SEM_ID  semFss;
SEM_ID  semFex;
semFs = semBCreate (SEM_Q_FIFO , SEM_EMPTY);
semFss = semBCreate (SEM_Q_FIFO , SEM_EMPTY);
semFex = semBCreate (SEM_Q_FIFO , SEM_EMPTY);  //创建三个信号量
void t_imaGet(void)
{
    printf("a   ";
   semGive(semFs);             //释放信号量
}

void t_imaJud(void)
{
   semTake(semFs,WAIT_FOREVER);     //确保优先级不反转。
  printf("jj ";
  semGive(semFss);
}

void t_imaPro(void)
{
    semTake(semFss,WAIT_FOREVER);
    printf("rr"; 
   semGive(semFex);   
}

void t_imaExc(void)
{
     semTake(semFex,WAIT_FOREVER);
     printf("Y"; 
}

void start(void)
{
  int tGetId,tJudId,tProId,tExcId;
  tGetId = taskSpawn("tPget",200,0,1000,(FUNCPTR)t_imaGet,1,0,0,0,0,0,0,0,0,0);    
  tJudId = taskSpawn("tPjud",201,0,1000,(FUNCPTR)t_imaJud,3,0,0,0,0,0,0,0,0,0);
  tProId = taskSpawn("tPpro",202,0,1000,(FUNCPTR)t_imaPro,3,0,0,0,0,0,0,0,0,0);
  tExcId = taskSpawn("tPexc",203,0,1000,(FUNCPTR)t_imaExc,3,0,0,0,0,0,0,0,0,0);
}
以上例子虽然定了各个任务的优先级,但加上信号量可以实现同步,而且防止优先级反转出现。

Vxworks信号量分析相关推荐

  1. vxworks固件分析

    前言 vxworks 的固件分析流程 1.用binwalk查看固件基本信息并解压固件 2.获取固件相关信息, cpu架构,大小端 3.确定固件的加载地址 4.用IDA加载固件,并修复符号表 5. 分析 ...

  2. PowerPC VxWorks BSP分析7——image压缩

    1 映像压缩 在嵌入式系统中,我们通常会要求VxWorks文件尽量小,比如通过串口.软盘或tffs加载VxWorks的时候,如果文件太大,可能无法存储,或加载失败.下面介绍一种利用Tornado和Vx ...

  3. PowerPC VxWorks BSP分析(4.2)——BSP定制

    如图2,第一阶段的执行流程使用的是上图的左边的源文件中的那些函数(romInit->romStart->usrInit->sysHwinit->usrKernelinit-&g ...

  4. PowerPC VxWorks BSP分析(4.3)——BSP定制

    ? 1.1 源码剖析 处理器首先跳到ROM的入口地址,设置状态字并创建一个哑堆栈(dummy stack) .下面是PPC860的romInit示例: /* internals */ FUNC_EXP ...

  5. PowerPC VxWorks BSP分析(2)--PowerPC汇编

    PowerPC汇编 这里总结PPC指令集中几种常用的指令. 首先为运算和逻辑指令,它与通用寄存器有关,源数据来自GPR或16位立即数,目的是GPR寄存器,操作为32位,GPR中存放32位更新数据,大多 ...

  6. PowerPC VxWorks BSP分析(1)--PowerPC体系结构

    POWER 是 Power Optimization With Enhanced RISC 的缩写,是 IBM 的很多服务器.工作站和超级计算机的主要处理器.POWER 芯片起源于 801 CPU,是 ...

  7. VxWorks中信号量实现任务间通信与同步机制分析

    引 言 多任务内核.任务调度机制.任务间通信和中断处理机制,这些都是VxWorks运行环境的核心.多任务处理和任务间通信是实时操作系统的基石.一个多任务环境允许将一个实时应用构造成一套独立任务的集合, ...

  8. 二进制信号量,互斥信号和计数信号量的区别

    VxWorks的信号量机制分析 VxWorks信号量是提供任务间通信.同步和互斥的最优选择,提供任务间最快速的通信.也是提供任务间同步和互斥的主要手段.VxWorks提供3种信号量来解决不同的问题. ...

  9. VxWorks操作系统基础(适合初学者阅读)

    转载学习于supreme42的博客 注:本文档主要是对VxWorks内核的一个简单介绍:由于word经常把一句话的第一个字母变成大写,所以文中函数名的第一个字母的大小写可能不对. 1 实时操作系统概述 ...

最新文章

  1. 崇阳计算机技校,湖北省崇阳县龙翔技工学校
  2. 【Scratch】青少年蓝桥杯_每日一题_1.1_美国队长盾牌
  3. Tensorflow运行程序报错 FailedPreconditionError
  4. 周江华:网易云信IM推送保障及网络优化实践
  5. 真不知写什么了,也就是很久没有做什么了
  6. 《算法竞赛入门经典》第一章1.5
  7. cloud foundry_实际的Reactor操作–检索Cloud Foundry应用程序的详细信息
  8. 使用Apache Storm和Kite SDK Morphlines的可配置ETL处理
  9. 经典面试题(26):以下代码将输出的结果是什么?
  10. 基于SpringBoot实现二手交易商城
  11. 利用全能电子地图下载器+GeoWebCache发布Arcgis Server缓存瓦片过程全记录
  12. 家庭收支记账软件Java
  13. php降序怎写,PHP数组如何按键名实现降序排列
  14. c语言用十年算入门,初识C语言_十年饮冰 难凉热血的技术博客_51CTO博客
  15. 【docker lnmp】 2、容器mysql 连接问题 getaddrinfo failed
  16. java中常用的加密工具
  17. Ubuntu20.04 安装谷歌拼音(googlepinyin)输入法
  18. 线性表练习扑克牌游戏(炸金花)
  19. 昆仑通态复制的程序可以用吗_昆仑通态mcgs触摸屏的六大种类及其特点(1)
  20. matlab hilbert 包络,hilbert取包络matlab

热门文章

  1. [编写高质量代码:改善java程序的151个建议]建议57 推荐在复杂字符串操作中使用正则表达式...
  2. 关键字static在C和C++中的区别
  3. 关于单CPU,多CPU上的原子操作
  4. 【转贴】C#中事件处理的个人体会
  5. ifstream eof()函数
  6. UA OPTI570 量子力学8 每一个左矢都有与之对应的右矢吗?
  7. 进一步学习WDK驱动程序的SOURCES文件、WMI驱动程序的mof文件和wmidata.h头文件
  8. 80x86汇编按二进制输出数字的程序图解和代码解释
  9. Windows下使用MinGw和gcc构建第一个C程序、g++构建第一个C++程序
  10. 图解观察托管程序线程