是否可以创建2个不同的信号量来保护VxWorks中的相同资源?

时间:2013-05-10 11:41:36

标签: vxworks

任何人都可以帮我解决这个问题。 是否有可能为2个不同的任务创建2个不同的信号量,以便在VxWorks中获取相同的关键资源?

2 个答案:

答案 0 :(得分:1)

这应该在vxWorks文档中介绍。

通常,您应该将信号量的创建与信号量的使用分离。

/**Initialization Code**/
SEM_ID semM;
semM = semMCreate (...);
...
taskSpawn(task1...);
taskSpawn(task2...);
...

/* Task 1 code */
void task1() {
    ...
    semTake (semM, WAIT_FOREVER);
    ...<Task 1 critical section>
    semGive (semM);
    ...
}

/* Task 2 code */
void task2() {
    ...
    semTake (semM, WAIT_FOREVER);
    ...< Task 2 critical section>
    semGive (semM);
    ...
}

在这种情况下,semM是两个任务都可用的全局变量。 如果这冒犯了你,使用VxWorks 6.x你也可以使用semOpen()API来提供信号量名称。 在每个任务中执行semOpen以创建/检索信号量及其ID。

当创建互斥锁时,它可用于执行semTake的第一个任务(无论是任务1还是任务2)。

如果您需要以特定顺序执行某些操作,则需要组合使用互斥(用于互斥)和同步(例如,通过二进制信号量)。

将上面的示例修改一下以确保task2仅在task1完成某些操作时运行。

/**Initialization Code**/
SEM_ID semM;
SEM_ID semSync;
semM = semMCreate (...);
semSync = semBCreate (...);
...

void task1() {
    ...
    /* Access Shared Structure */
    semTake (semM, WAIT_FOREVER);
    ...<Task 1 critical section>
    semGive (semM);
    /* Notify Task 2 that something is available */
    semGive (semSync);
    ...
}
void task2() {
    ...
    /* Wait for Task 1 to let me know there is something to do */
    semTake (semSync, WAIT_FOREVER);

    /* Access Shared Structure */
    semTake (semM, WAIT_FOREVER);
    ...< Task 2 critical section>
    semGive (semM);
    ...
}

答案 1 :(得分:1)

我觉得你错过了什么,

在vxWorks中,所有任务共享相同的内存空间,因此,您必须使用Mutex保护任务之间的全局数据。

这个想法是只使用一个Mutex(它的sem_id对于所有想要使用它的任务都是众所周知的。)

您可以使用一个Mutex保护数据(使用相同Mutex的任务数量没有限制。)


如果您确实希望在vxWorks中的两个任务之间访问相同的内存空间,最好的方法是: 创建访问功能

int access_func(void)

{

    static SEM_ID sem_id=0;

    if(sem_id == 0)

    {

        /* create mutex semaphore \u2013 semMCreate(\u2026) */

    }

    return_code=semTake(sem_id, time_out);

    if(return_code != 0) return errno;

    /* read or write to or from global memory */

    semGive(sem_id); 

}

注意:

semMCreate有几个选项,semTake有几个选项

您可以在系统init(推荐)创建互斥锁。

如果没有读取互斥锁,并且sem_id仍为零,则semTake返回ERROR(您可以检查返回码和系统错误)