Vxworks中不同信号量的作用
扫描二维码
随时随地手机看文章
1.semCCreate创建并初始化一个计数信号量
函数原型:
SEM_ID semCCreate
( int options, /* semaphore option modes */ int initialCount /* initial count */ )
options选项:
SEM_Q_PRIORITY 基于优先级的,即优先级高的优先执行;
SEM_Q_FIFO 基于队列形式的,先进先执行;
initialCount 初始化一般设置为SEM_EMPTY(0)或者SEM_FULL(1);如果设置为0则代表在不SemGive()的情况下不可用,设置为1表示在不SemGive()的情况可以使用一次。
该信号量适用于任务间通信或者通知使用,俩个任务处于依赖关系执行的情况。比如网络接受任务和我数据处理任务,每接收一包数据通知处理该数据的任务去处理数据。如果处理任务比较慢,那么该信号量会记住接收到的数据包,直到处理完成才会清空计数。一次可以连续SemGive出多个信号。
2.semMCreate创建并初始化一个互斥锁信号量
函数原型:
SEM_ID semMCreate ( int options /* mutex semaphore options */ )
options选项:
SEM_Q_PRIORITY (0x1)基于优先级的,即优先级高的优先执行
SEM_Q_FIFO 基于队列形式的,先进先执行;
SEM_DELETE_SAFE (0x4)
SEM_INVERSION_SAFE (0x8)
SEM_EVENTSEND_ERR_NOTIFY (0x10)
SEM_INTERRUPTIBLE (0x20)
该信号量适用于同一个函数被多个任务调用,但是如果同时调用的过程中可能发生冲突,使用该互斥信号量进行保护,例如出啊口或者网络发送数据函数等。
3.semBCreate创建并初始化一个二进制信号量
函数原型:
SEM_ID semBCreate ( int options, /* semaphore options */ SEM_B_STATE initialState /* initial semaphore state */ )
options选项:
SEM_Q_PRIORITY 基于优先级的,即优先级高的优先执行;
SEM_Q_FIFO 基于队列形式的,先进先执行;
initialCount 初始化一般设置为SEM_EMPTY(0)或者SEM_FULL(1);如果设置为0则代表在不SemGive()的情况下不可用,设置为1表示在不SemGive()的情况可以使用一次。
适用于实时性同步的俩个任务之间通信,A任务做某个动作,此时B任务也需要做某个动作,但在B没有及时做该动作不要求之后再继续做的情况下,使用该信号量。一次只能SemGive一个信号。