任何人都可以帮我解决这个问题。 是否有可能为2个不同的任务创建2个不同的信号量,以便在VxWorks中获取相同的关键资源?
答案 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(您可以检查返回码和系统错误)