Я пытаюсь использовать 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);
}