6

STM32F4DISCOVERY ボードで FreeRTOS を実行しており、次のコードがあります。

xTaskCreate( vTask1, "Task 1", 200, NULL, 1, NULL );
xTaskCreate( vTask2, "Task 2", 200, NULL, 1, NULL );
vTaskStartScheduler();

ここで、vTask1 は次の関数です。

void vTask1( void *pvParameters )
{
volatile unsigned long ul;

    for( ;; )
    {
        LED_On(0);

        for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ )
        {
        }
        LED_On(2);
        LED_Off(0);
    }
}

vTask2 のコードはほぼ同じです。

void vTask2( void *pvParameters )
{
const char *pcTaskName = "Task 2 is running\n";
volatile unsigned long ul;

    for( ;; )
    {
        LED_On(3);
        LED_Off(2);
        for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ )
        {
        }

        LED_Off(3);
    }
}

プログラムを実行すると、LED0 と LED3 が常にオンになっていることがわかり (それらの切り替えは私の目には速すぎますが、これは問題ありません)、「共有リソース」である LED2 が非常に速く点滅しています。問題は次のとおりです。呼び出しの順序を逆にするとxTaskCreate、同じ状況になり、LED2 の点滅動作が大幅に遅くなります。タスクは同じ優先度を持つ必要があり、したがってラウンド ロビン スケジュールに従う必要があるため、なぜこのようなことが起こるのでしょうか? 彼らは同じ時間を得るべきではありませんか?異なる順序で作成しただけで動作が変わるのはなぜですか?

前もって感謝します。

4

1 に答える 1