我正尝试在vxWorks 6.7中使用spinlockIsr_t,但是如果我尝试在多个任务中使用它,系统就会冻结。您是否允许使用多个任务来尝试获取相同的自旋锁?如果不是,那么首先它的意义是什么?下面的代码可以处理1或2个任务,但是一旦任务数增加到3个,系统就会死机,然后才能在控制台上完成第一行打印。
spinlockIsr_t mySpinLock;
int sharedResource;
void vx_test_mtx_spin_lock(void)
{
const int kNumTask = 3;
const int kTaskPriority = 50;
const int kTaskStackSize = 10000;
int i = 0;
sharedResource = 0;
char procName[40];
printf("Number of tasks : %d\n", kNumTask);
printf("SPIN_LOCK_ISR_INIT() [main task]\n");
SPIN_LOCK_ISR_INIT (&mySpinLock, 0); printf("SPIN_LOCK_ISR_TAKE() [main task] \n");
SPIN_LOCK_ISR_TAKE (&mySpinLock);
for (i = 0; i < kNumTask; i++){
sprintf(procName, "%s%d", "myTask", i); printf("taskSpawn() [main task]\n");
taskSpawn((char*)procName,
kTaskPriority,
0,
kTaskStackSize,
(FUNCPTR)vx_spin_lock_unlock,
0,0,0,0,0,0,0,0,0,0
);
} printf("SPIN_LOCK_ISR_GIVE() [main task]");
SPIN_LOCK_ISR_GIVE (&mySpinLock);
}
void vx_spin_lock_unlock(void)
{
printf("SPIN_LOCK_ISR_TAKE() [spawned task] \n");
SPIN_LOCK_ISR_TAKE (&mySpinLock);
/* ... Access the share resource here */ printf("SPIN_LOCK_ISR_GIVE() [spawned task] \n");
SPIN_LOCK_ISR_GIVE (&mySpinLock);
}发布于 2012-08-15 10:32:41
我怀疑你有一个高优先级的任务在自旋锁上旋转,而低优先级的任务已经持有锁。优先级较低的任务将永远不能运行,因此锁永远不会解锁,并发生死锁。基本上不应该在实时系统中使用自旋锁。如果使用它们,则必须确保所有可能在锁上旋转的线程都具有相同的优先级。
发布于 2012-08-15 22:44:02
这实际上是对spinLocks的错误应用。在大多数情况下,您应该简单地使用互斥信号量而不是spinLock。
SpinLocks的设计意图是有一个非常短的关键部分。执行字符串和I/O (例如,打印)操作是短的,而不是短的()。和做taskSpawn一样。
事实上,在持有自旋锁的同时执行任何系统调用都是一个巨大的危险信号。
发布于 2012-08-15 10:37:15
因为你所有的任务都在一个锁上旋转,一旦你锁定了所有的核心,游戏就结束了。
https://stackoverflow.com/questions/11963103
复制相似问题