0

我正在尝试spinlockIsr_t在 vxWorks 6.7 中使用,但如果我尝试将它用于多个任务,系统会冻结。您是否允许使用多个尝试获取相同自旋锁的任务?如果不是,那么首先它的意义是什么?以下代码适用于 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);       
}
4

3 回答 3

4

我怀疑你有一个更高优先级的任务在自旋锁上旋转,而一个低优先级的任务已经持有锁。较低优先级的任务将永远无法运行,因此锁永远不会解锁,并且会发生死锁。自旋锁基本上不应该在实时系统中使用。如果使用它们,您必须确保所有可以在锁上自旋的线程具有相同的优先级。

于 2012-08-15T02:32:40.557 回答
1

这确实是自旋锁的误用。在大多数情况下,您应该简单地使用互斥信号量而不是自旋锁。

自旋锁旨在具有非常短的临界区。执行字符串和 I/O(即 printf)操作并不短。与执行 taskSpawn 相同。

事实上,在持有自旋锁的同时进行任何系统调用都是一个巨大的危险信号。

于 2012-08-15T14:44:02.270 回答
0

您在该系统中有多少个内核?有什么东西可以抢占旋转任务吗?由于您的所有任务都在锁上旋转,一旦您锁定了所有核心 - 游戏就结束了。

于 2012-08-15T02:37:15.127 回答