我正在尝试在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);
}
答案 0 :(得分:3)
我怀疑你有一个优先级较高的任务在自旋锁上旋转,而优先级较低的任务已经锁定了。优先级较低的任务永远无法运行,因此锁永远不会解锁,并且会发生死锁。 Spinlocks基本上不应该在实时系统中使用。如果使用它们,则必须确保可以在锁上旋转的所有线程具有相同的优先级。
答案 1 :(得分:1)
这实际上是对spinLocks的错误应用。 在大多数情况下,您应该只使用互斥信号量而不是spinLock。
SpinLocks旨在拥有非常短的关键部分。 执行字符串和I / O(即printf)操作不短。 与执行taskSpawn相同。
事实上,在进行旋转锁定时进行任何系统调用都是一个巨大的危险信号。
答案 2 :(得分:0)
您在该系统中拥有多少个核心?有没有什么可以抢占纺纱任务? 因为所有的任务都会锁定,所以你固定了所有核心 - 游戏结束了。