Multitasking / freeRTOS / Verständnis des Ablaufs und der Prioritäten

Hallo,

ich habe ein Problem bei beim Multitasking mit freeRTOS bei dem Arduino die Taskverwaltung nachzuvollziehen, bzw weshalb niedrigere Prio´s vorgezogen werden,,,, :astonished:

Mir ist schon bewusst, das bei gleicher Prio der Scheduler Zeitscheibensteuerung anwendet, wie es zu dem "Busy- waiting"-Effekt kommen kann, wenn kein vTaskDelay vorhanden ist und wie der Ablauf bei verschiedenen Prioritäten sein müsste.

void vTask1( void *pvParameters ){
while(1) {
print("Hier ist Task 1");
vTaskDelay(2);
}
}

void vTask2(… analog dazu, Meldung "Hier ist Task 2"…

int main( void ){
xTaskCreate( vTask1,"Task1",130,NULL,1,NULL );
xTaskCreate( vTask2,"Task2",130,NULL,2,NULL );
vTaskStartScheduler();
}

Das obige erscheint mir noch logisch, also Task2 hat die höhere Prio, somit beginnt er mit Task2 und schreibt den Text, in der Delay-Zeit wendet er sich dann Task1 mit der nierigeren Prio zu, schreibt den Text und befindet sich wieder in einem Delay. Währen die Delayzeiten beider Tasksablaufen befindet er sich im Idle und wenn die Delayzeit von Task2 abgelaufen ist fängt er wieder von vorne an.

Ich habe nun 2 Bilder mit angefügt.
Ich verstehe nicht, warum in der Beschreibung unten mit der niedrigsten Prio angefangen wird. Warum das Semaphore dann blockiert ist mir bewusst, allerdings hätte ich anhand des sketches darauf getippt, dass mit der höchsten Prio begonnen wird und diese dann währen der Delayzeit durch das Semaphore eben die niedrigere Task behindert....
Oder habe ich etwas übersehen, bzw ist mir etwas nicht aufgefallen?

Vielen Dank schonmal, falls ihr mir weiterhelfen konntet ! :wink:

Das ist unerwünschtes Verhalten.

Bei dem Beispiel mit 2 Tasks tritt es auf, weil sich Tasks nicht gegenseitig unterbrechen können und die nieder-priore Task Zeit bekommt fertig zu laufen. Die hoch-priore Task muss am Anfang nicht existieren! Die kann erst dazu kommen während die andere Task schon läuft.

Bei dem mit 3 Tasks kommt eine Task mit mittlerer Priorität zeitlich davor und verdrängt so die Task mit der niedrigsten Priorität und die Task mit höchster Priorität muss noch länger warten. Das kann man z.B. verhindern in dem man der nieder-prioren Task temporär die höchste Priorität zuweist.

Vielen Dank für die Antwort!

Dass, wenn die nieder-prio-Task zB über semaphore eine Ressource blockiert, die höhere Prio-Task warten muss leuchtet mir ein.
Allerdings ist doch in den Bildern auf der unteren Hälfte der zeitliche Ablauf dargestellt:
Zuerst befindet man sich im "Idle" und DANN würde ich eigentlich zuerst mit der höheren Prio anfangen, dann die niedrigere Prio, und wenn diese dann die Ressource via Semaphore sperrt und nicht freigibt, wenn die höhre Prio startet ist mir klar, dass diese dann warten muss.

Aber wieso ist in beiden Bildern nach der "Idle"-Phase (also Leerlaufphase) der Beginn mit der niederwertigen Prio und nicht mit der höchsten?