对于普通的二进制信号量,a 任务尝试同步到 外部事件创建一个空的 信号量....第二个任务 控制同步事件 当它不是时给出信号量 需要更长时间。
#include "vxWorks.h"
#include "semLib.h"
#define T_PRIORITY 50
SEM_ID syncExampleSem; // named semaphore object
void initialize (void)
{
// set up FIFO queue with emtpy binary semaphore
syncSem = semBCreate (SEM_Q_FIFO, SEM_EMPTY);
// create task1
taskSpawn ("task1", T_PRIORITY, 0, 10000, task1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
// create task2
taskSpawn ("task2", T_PRIORITY, 0, 10000, task2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}
void task1 (void)
{
// stay here until semaphore becomes available
semTake (syncExampleSem, WAIT_FOREVER);
// do something
}
void task2 (void)
{
// do something
// now let task1 execute
semGive (synExampleSem);
}
我的问题是为什么我没有看到创建空信号量的第一个任务,如上所述? (看起来它只是在主函数中“一般”完成?)“尝试同步到外部事件的任务会创建一个空信号量。”
另外,我真的没看到第二个任务是如何“控制”同步?
谢谢。
请参阅:通过二进制信号量同步的示例
http://www.cross-comp.com/instr/pages/embedded/VxWorksTutorial.aspx#VxWorks%20Programming
答案 0 :(得分:3)
示例中有一个错误。 initialize
中的第一行应分配给syncExampleSem
。
第二个任务“控制”同步,因为任务1无法继续,直到任务2“给出”信号量。信号量的创建位置并不重要,只要保证在任务尝试给出或接受它之前创建它。
由于这些特定任务是并行运行的,因此它是在initialize
中创建的,因为如果它是由任务2创建的,则存在任务1等待信号量存在之前的风险,反之亦然由任务1创建,你冒着任务2给出信号量之前的风险。
答案 1 :(得分:1)
SemTake和SemGive返回错误(因为信号量不存在)。 检查系统调用的返回码是很有价值的。