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 の点滅動作が大幅に遅くなります。タスクは同じ優先度を持つ必要があり、したがってラウンド ロビン スケジュールに従う必要があるため、なぜこのようなことが起こるのでしょうか? 彼らは同じ時間を得るべきではありませんか?異なる順序で作成しただけで動作が変わるのはなぜですか?
前もって感謝します。