【转】VxWorks信号量分析

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

关于互斥的实现:

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

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

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

基本实现互斥模型:

1 SEM_ID semMutex;
 2 
 3 semMutex = semBCreate(SEM_Q_PRIORITY, SEM_FULL);
 4 
 5 task(void)
 6 {
 7 
 8       semTake(semMutex, WAIT_FOREVER);//得到信号量,即相当于得到使用资源的令牌
 9 
10        //临界区,某一个时刻只能由一个任务 访问
11 
12        semGive(semMutex);
13 
14 }

关于任务同步的实现

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

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

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

实现模型参考

1 SEM_ID semSync;
 2 
 3 semSync = semBCreate(SEM_Q_FIFO, SEM_EMPTY);
 4 
 5 taskA(void)
 6 {
 7     
 8 
 9     semGive(semSync);      //信号量释放,有效
10 }
11 taskB(void)
12 {
13 
14     semTake(semSync, WAIT_FOREVER);   //等待信号量
15 
16      .
17 }

使用信号量注意事项:

1、用途不同,信号量属性和初始值不同。

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

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

应用:

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

1 SEM_ID semFs;
 2 SEM_ID semFss;
 3 SEM_ID semFex;
 4 
 5 semFs = semBCreate(SEM_Q_FIFO,  SEM_EMPTY);
 6 semFss = semBCreate(SEM_Q_FIFO, SEM_EMPTY);
 7 semFex = semBCreate(SEM_Q_FIFO, SEM_EMPTY);
 8 
 9 void t_imaGet(void)
10 {
11     printf("a   ");
12     semGive(semFs);   //释放信号量
13 }
14 
15 void t_imaJud(void)
16 {
17     semTake(semFs, WAIT_FOREVER);//确保优先级不反转
18 
19     printf("jj ");
20     semGive(semFss);
21 }
22 
23 void t_imaPro(void)
24 {
25     semTake(semFss, WAIT_FOREVER);
26     printf("rr");
27     semGive(semFex);
28 }
29 
30 void t_imaExc(void)
31 {
32     semTake(semFex, WAIT_FOREVER);
33     printf("Y");
34 }
35 
36 void start(void)
37 {
38     int tGetId, tJudId, tProId, tExcId;
39     tGetId = taskSpawn("tPget", 200, 0, 1000,(FUNCPTR)t_imaGet, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0);
40     tJudId = taskSpawn("tPjud",201,0,1000,(FUNCPTR)t_imaJud,3,0,0,0,0,0,0,0,0,0); 
41     tProId = taskSpawn("tPpro",202,0,1000,(FUNCPTR)t_imaPro,3,0,0,0,0,0,0,0,0,0); 
42     tExcId = taskSpawn("tPexc",203,0,1000,(FUNCPTR)t_imaExc,3,0,0,0,0,0,0,0,0,0);
43 
44 }

时间: 2024-08-28 14:54:36

【转】VxWorks信号量分析的相关文章

FreeRTOS高级篇6---FreeRTOS信号量分析

FreeRTOS的信号量包括二进制信号量.计数信号量.互斥信号量(以后简称互斥量)和递归互斥信号量(以后简称递归互斥量).关于它们的区别可以参考< FreeRTOS系列第19篇---FreeRTOS信号量>一文. 信号量API函数实际上都是宏,它使用现有的队列机制.这些宏定义在semphr.h文件中.如果使用信号量或者互斥量,需要包含semphr.h头文件. 二进制信号量.计数信号量和互斥量信号量的创建API函数是独立的,但是获取和释放API函数都是相同的:递归互斥信号量的创建.获取和释放AP

同步原语之信号量

一.semaphore信号量分析 首先,说明信号量的作用,信号量的作用类似于自旋锁(其实,同步原语均有相似之处),相似之处在于,都有临界区,各进程需互斥访问,linux中提供了两种信号量的实现,有内核态的和用户态的,这里只介绍内核态的 相关数据结构 1 struct semaphore { 2 spinlock_t lock; 3 unsigned int count; 4 struct list_head wait_list; 5 }; 1 struct mutex { 2 /* 1: unl

FreeRTOS高级篇8---FreeRTOS任务通知分析

在FreeRTOS版本V8.2.0中推出了全新的功能:任务通知.在大多数情况下,任务通知可以替代二进制信号量.计数信号量.事件组,可以替代数长度为1的队列(可以保存一个32位整数或指针值),并且任务通知速度更快.使用的RAM更少!我在< FreeRTOS系列第14篇---FreeRTOS任务通知>一文中介绍了任务通知如何使用以及局限性,今天我们将分析任务通知的实现源码,看一下任务通知是如何做到效率与RAM消耗双赢的.        在<FreeRTOS高级篇6---FreeRTOS信号量

[FreeRTOS]FreeRTOS使用

转自:https://blog.csdn.net/zhzht19861011/article/details/49819109 FreeRTOS系列第1篇---为什么选择FreeRTOS? FreeRTOS系列第2篇---FreeRTOS入门指南 FreeRTOS系列第3篇---FreeRTOS移植指南 FreeRTOS系列第4篇---FreeRTOS编码标准及风格指南 FreeRTOS系列第5篇---FreeRTOS在Cortex-M3上的移植 FreeRTOS系列第6篇---FreeRTOS

ucos信号量集源码分析

在实际的应用之中,一个任务经常需要等待多个信号量的同时生效,或者说任务需要根据多个信号量的组合作用的结果来决定任务的运行方式,为了实现这种多信号量组合的功能,ucos实现了信号量集的特殊结构. 信号量集的基础仍然是信号量,它如同一个多个信号量组成的与非门来构成逻辑结果控制任务的执行. 信号量在ucos的实现分为两个部分,第一部分叫做标志组,其中存放了信号量集中的所有信号,第二个叫做等待任务链表,链表中的每个节点对应一个正在等待信号量集的等待任务,信号量集根据这个链表来管理等待任务 不同于消息队列

VxWorks进程间通信2 -- 信号量

VxWorks进程间通信2 -- 信号量一.信号量的概念 是实现任务互斥.同步操作的主要机制.VxWorks提供的信号量经过了高度优化,在所有任务间通信机制中,速度最快. 二.信号量的分类 Binary Semaphores(二进制):完成互斥.同步操作的最佳方式:速度最快,最常用. Mutual Exclusion Semaphores(互斥):一种特殊的二进制信号量,专门针对互斥操作进行了优化. Counting Semaphores(计数):类似于二进制信号量,可记录信号量释放的次数,可监

(转)很有借鉴意义!读者写者问题--使用信号量的读者优先与写者优先程序分析

转自http://www.linuxso.com/linuxbiancheng/13098.html 千万要注意:readcount,writecount要设成共享变量(因为是进程),要不然可能会导致死锁 所谓谁谁优先的问题,我认为主要体现在以下两点中: 1.当低优先级进程(线程)获得临界区时,高优先级进程能很快从低优先级的进程中抢得访问权. 2.当高优先级的进程获得临界区访问权时,低优先级得等到高优先级全部访问完的空闲时间才能抢得访问权. 这两点中, 第一点一定得要,不然无法体现出优先的意思

Semaphore(信号量)源码分析

1. Semaphore Semaphore和ReentrantReadWriteLock.ReadLock(读锁)都采用AbstractOwnableSynchronizer中共享排队的方式实现 关于AbstractQueuedSynchronizer中的独占锁和共享锁,请参考ReentrantLock(http://www.cnblogs.com/bjorney/p/8040085.html)和ReentrantReadWriteLock(http://www.cnblogs.com/bjo

VxWorks操作系统shell命令与调试方法总结

VxWorks下的调试手段 主要介绍在Tornado集成开发环境下的调试方法,和利用支撑定位问题的步骤.思路. 1         Tornado的调试工具 嵌入式实时操作系统VxWorks和集成开发环境Tornado的组成结构如下图1.分为主机和目标机系统. 图1 集成开发环境结构图 在Tornado下,调试相关操作在Debug菜单下,包括: 图2 Debug菜单 简单解释各菜单项的功能 1.1        WindShell 1.1.1         简介 Vxworks的Shell分为