VxWorks中信号量常见应用

VxWorks中信号量常见应用

1. 互斥进程

互斥信号量有效的内锁对共享资源的进入。

semMutex = semBCreate (SEM_Q_PRIORITY, SEM_FULL);

SEM_FULL 指明用于任务间互斥. 当一个任务要进入资源,首先要得到一个信号量,只要有任务在使用这个信号量,其它的要进入资源的任务要停止执行,当这个任务完成了对资源的使用,它会释放信号量,允许另一个任务来使用资源。

semTake (semMutex, WAIT_FOREVER);

. . 执行互斥任务

semGive (semMutex);
2. 任务同步
比如系统中的常见通信过程是,A进程发一个请求给B进程,等待B进程处理完之后,才能进行后续处理,如果B进程的处理超时,执行错误处理。

init ()

{

SEM_ID syncSem = semBCreate (SEM_Q_FIFO, SEM_EMPTY);
/*SEM_EMPTY 指明信号量用于任务间同步. */
taskSpawn ("task1", 100, 0, 20000, task1, 0,0,0,0,0,0,0,0,0,0);
taskSpawn ("task2", 100, 0, 20000, task2, 0,0,0,0,0,0,0,0,0,0);
}

task1 (void)

{ ...
/*空读信号量,保证信号量状态为EMPTY,NO_WAIT表示不管是否获得信号量都继续执行*/
semTake(syncSem, NO_WAIT);
/*发送请求*/
………
/*等待task2执行完才执行后续处理*/
int ret=semTake (syncSem, WAIT_TIME_OUT);

if (ret==ERROR)
{
/*超时处理*/
}
       else
{
/*正常处理*/
}

}

task2 (void)

{ ...

/*执行任务2*/
…………..
/*通知task1执行*/
semGive (syncSem);

...

}

上面做法的原理是信号量只有两种状态,FULL或者EMPTY,当一个进程使用SemTake调用获取信号量的时候
(1) 如果信号量处于FULL状态,信号量状态改变为EMPTY, 进程继续执行.
(2) 如果信号量处于EMPTY状态,进程会被堵塞,直到另外的进程调用SemGive
将信号量状态设置为FULL,如果指定了超时时间,调用结果为返回ERROR,但仍然可以继续执行。