1. 二进制信号量
semBCreate (SEM_Q_FIFO/SEM_Q_PRIORITY , SEM_EMPTY/SEM_FULL)
有两个作用:
(1)任务间的互斥 -- 同一个任务获取和释放信号量,防止两个任务同时存取一个资源
(2)任务间的同步 -- 一个任务获取信号量,另一个任务(或者中断)释放信号量
2. 互斥信号量
semMCreate(SEM_Q_PRIORITY/SEM_Q_FIFO/SEM_DELETE_SAFE/SEM_INVERSION_SAFE)
是二进制信号量的一种特殊形式,在不需要用到删除安全/优先级反转/递归调用属性时,与二进制信号量的互斥功能相同。
特点:
(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);
}
但是释放和获取信号量必须成对,也就同一个任务获取几次,也必须释放几次,不然会造成别的任务无法获取到,虽然这个任务本身还是可以获取到。
(5)关于几个参数:
SEM_Q_PRIORITY (0x1)
阻塞在这个信号量上的任务凭任务优先级高低来决定谁先获取到信号量
SEM_Q_FIFO (0x0)
阻塞在这个信号量上的任务按先入先出顺序获取到信号量
SEM_DELETE_SAFE (0x4)
获取到这个信号量的任务在信号量未释放之前,删除这个任务时会被阻塞直到信号量释放为止。
SEM_INVERSION_SAFE (0x8)
获取到这个信号量的任务将以阻塞在这个信号量的所有任务中的最高优先级来运行,防止优先级反转情况发生(优先级反转是指中间优先级任务抢占获取到互斥信号量的低优先级任务,导致阻塞在同一个信号量上的高优先级任务要等中间优先级任务运行完成之后才能运行。必须与SEM_Q_PRIORITY一起使用。
3.信号量的一些调试命令
semShow(semId, 0/1),查看信号量属性及阻塞在这个信号量上的任务
ShowSemPend, 查看系统中所有阻塞在某个信号量上的任务信息及这个信号量的当前占用者(OSS命令)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)