当前位置:首页 >> 信息与通信 >>

VxWorks中信号量实现任务间通信同步与互斥,代码


VxWorks 信号量是提供任务间通信、同步和互斥的最优选择,提供任务间最快速的通信。 也是提供任务间同步和互斥的主要手段。VxWorks 提供 3 种信号量来解决不同的问题。 二进制信号量是最快的最常用的信号量,可用于同步或互斥。 互斥为了解决内在的互斥问题、 优先级继承、 删除安全和递归等情况而最优化的特殊的二进 制信号量。 计数器类似于二进制信号量,但是随信号量释放的次数改

变而改变。 二进制信号量 semBCreate (SEM_Q_FIFO/SEM_Q_PRIORITY , SEM_EMPTY/SEM_FULL)

有两个作用: (1)任务间的互斥 -- 同一个任务获取和释放信号量,防止两个任务同时存取一个资源 (2)任务间的同步 -- 一个任务获取信号量,另一个任务(或者中断)释放信号量

二进制信号量实现互斥 使用二进制信号量可以很方便的实现互斥,互斥是指多任务在访问临界资源时具有排他性。 为了使多个任务互斥访问临界资源,只需要为该资源设置一个信号量,相当于一个令牌,那 个任务拿到令牌即有权使用该资源。把信号量设置为可用,然后把需要的资源 的任务的临 界代码 置于 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、避免删除那些其它任务正在请求的信号量。 互斥信号量 semMCreate(SEM_Q_PRIORITY/SEM_Q_FIFO/SEM_DELETE_SAFE/SEM_INVERSION_S AFE)

是二进制信号量的一种特殊形式,在不需要用到删除安全/优先级反转/递归调用属性时,与 二进制信号量的互斥功能相同。 特点: (1)只能用于任务间的互斥 (2)只能由 take 它的任务 give (3)不能在中断中 take 或 give

(4)可以递归调用,也就是同一个任务可以反复多次获取信号量,这个特性在某些时候非 常有用,如 funcA 需要获取某个互斥信号量,funcA 会调用 funB,而 funcB 因为还有可能被 其他函数调用也需要获取这个信号量,这时候就可以用互斥信号量来实现。 SEM_ID semM; semM = semMCreate (...); funcA () { semTake (semM, WAIT_FOREVER); ... funcB (); ... semGive (semM); } funcB () { semTake (semM, WAIT_FOREVER); ... semGive (semM); }

但是释放和获取信号量必须成对,也就同一个任务获取几次,也必须释放几次,不然会造成 别的任务无法获取到,虽然这个任务本身还是可以获取到。 编程时使用的几个信号量的参数 SEM_Q_PRIORITY (0x1)

阻塞在这个信号量上的任务凭任务优先级高低来决定谁先获取到信号量 SEM_Q_FIFO (0x0) 阻塞在这个信号量上的任务按先入先出顺序获取到信号量 SEM_DELETE_SAFE (0x4) 获取到这个信号量的任务在信号量未释放之前, 删除这个任务时会被阻塞直到信号量释放为 止。 SEM_INVERSION_SAFE (0x8) 获取到这个信号量的任务将以阻塞在这个信号量的所有任务中的最高优先级来运行, 防止优 先级反转情况发生(优先级反转是指中间优先级任务抢占获取到互斥信号量的低优先级任 务,导致阻塞在同一个信号量上的高优先级任务要等中间优先级任务运行完成之后才能运 行。必须与 SEM_Q_PRIORITY 一起使用。

信号量的一些调试命令

semShow(semId, 0/1),查看信号量属性及阻塞在这个信号量上的任务 ShowSemPend, 查看系统中所有阻塞在某个信号量上的任务信息及这个信号量的当前占用 者(OSS 命令) semMGiveForce(semId), 强制释放互斥信号量


相关文章:
VxWorks中信号量实现任务间通信同步与互斥,代码
VxWorks中信号量实现任务间通信同步与互斥,代码_信息与通信_工程科技_专业资料。VxWorks中信号量实现任务间通信同步与互斥,代码 VxWorks 信号量是提供任务间通信、同步...
VxWorks中信号量实现任务间通信与同步机制分析
为避免这种情况,在可能的情况下尽量使用信号量实现互斥。 信号量 VxWorks 信号量是提供任务间通信同步和互斥的最优选择,提供任务间最快速的通信。 也是提供任务间...
Vxworks任务间的通信
[原]Vxworks 任务间通信 2015-4-13 阅读 29 评论 0 vxworks 中任务间的...一:信号量 信号量分二进制信号量互斥信号量、计数信号量。 1:二进制信号量...
vxworks信号量
vxworks信号量_信息与通信_工程科技_专业资料。信号量(Semaphore): 信号量是解决互斥和同步协调进程最好的方法 VxWorks 信号量提供最快速的任务间通信机制,它主要用于...
VxWorks的多任务通信机制
同步和互斥的最快速、开销最小的机制,VxWorks 有三种不同类型的信号量: (1) ...消息队列( ) 消息队列是 VxWorks 提供的单个 CPU 中的任务之间通信的主要机制之...
嵌入式复习整理
任务通信(互斥,同步,信号量等) 2) ARM 寄存器和...内存管理 在应用中可以创建多个分区和堆,以实现对...VxWorks 发送消息处理: 一个消息队列实际上将消息缓冲...
嵌入式实时操作系统VxWorks基础--2
VxWorks 操作系统为多任务间同步提供了信号量支持,...互斥同步;使用 RING 缓冲和链表方式通讯,VxWorks ...但其中内部没有提供互斥同步机制,需要自己实现; ...
实验四 uCOS II多事件同步实验
以及事件组等都是为多任 务间的同步与通信设计的,他们都在事件数据结构中定义...信号量:信号量用于实现任务任务之间、任务与中断处理程序之间的同步与互斥, ...
VxWorks笔记
上的 BIOS 的存储区域 1.2 VxWorks 系统编程中任务级与中断级的通讯如何实现?...任务间的同步和进程间协调信号量作为任务间同步和互斥的机制, 对于进程间通信,...
共享内存+互斥量实现linux进程间通信
时, 需要借助互斥量或 者信号量来完成进程的同步。...); 函数成功返回 0,错误返回非 0 的错误代码。 ...鄙人以实际项目开发过程中实现进程间通信的源码,为...
更多相关标签:
vxworks信号量 | vxworks 信号量 列表 | 信号量和互斥锁的区别 | 互斥信号量 | 互斥锁 信号量 | ucos互斥信号量 | 信号量与互斥锁的区别 | 信号量和互斥量的区别 |