0

对于普通的二进制信号量,尝试与外部事件同步的任务会创建一个空信号量……控制同步事件的第二个任务在不再需要信号量时提供该信号量。

#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

4

2 回答 2

3

示例中有一个错误。中的第一行initialize应该分配给syncExampleSem.

第二个任务“控制”同步,因为任务 1 在任务 2“提供”信号量之前无法继续。在哪里创建信号量并不重要,只要保证在任一任务尝试给予或接受它之前创建它。

由于这些特定任务是并行运行的,因此创建它是initialize因为如果它是由任务 2 创建的,则存在任务 1 在信号量存在之前等待信号量的风险,反之亦然,如果它是由任务 1 创建的,则存在风险任务 2 在信号量存在之前给出信号量。

于 2011-01-06T23:02:28.737 回答
1

SemTake 和 SemGive 正在返回错误(因为信号量不存在)。检查系统调用的返回码是很有价值的。

于 2011-04-01T15:49:02.540 回答