0

spinlockIsr_tvxWorks 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

これは実際には、spinLocks の誤った適用です。ほとんどの場合、spinLock の代わりに単純にミューテックス セマフォを使用する必要があります。

SpinLocks は、非常に短いクリティカル セクションを持つことを目的としています。文字列と I/O (つまり printf) 操作を実行するのは簡単ではありません。taskSpawn を実行する場合と同じです。

実際、スピンロックを保持している間にシステムコールを実行することは、非常に危険です。

于 2012-08-15T14:44:02.270 に答える
0

そのシステムにはいくつのコアがありますか? 回転するタスクを先取りするものはありますか? すべてのタスクはロックで回転するため、すべてのコアを固定するとゲームオーバーです。

于 2012-08-15T02:37:15.127 に答える