Hallo allerseits, da ich in meinen ESP32 einen Task brauche fange ich an ihn zu verstehen.
Aber ich bekomme Probleme, hier mal mein Code.
TaskHandle_t Task2;
Setup
Serial.begin(115200);
//create a task that will be executed in the Task2code() function, with priority 2 and executed on core 1
xTaskCreatePinnedToCore(
Task2code, /* Task function. */
"Task2", /* name of task. */
20000, /* Stack size of task */
NULL, /* parameter of the task */
2, /* priority of the task */
&Task2, /* Task handle to keep track of created task */
1); /* pin task to core 0 */
delay(500);
Und jetzt mein Task2code, wenn ich //delay(100); klammer geht mein Code nicht mehr.
Kein TFT kein microSD nichts geht mehr.
Wenn ich delay(100); wieder rein bringe geht auf einmal wieder alle, mein tft und meine microSd gehen wieder.
Warum das ? was macht delay(100) in diesen Task ?
Ja jetzt verstehe ich es,
ich komme ja aus der pascal ecke und habe jahrelang meine AtMega und AtXmega
mit avrco von elab programmiert. und da brauchte ich kein delay reinschreiben.
Und jetzt fällt mir auf das unter avrco ein Systick(10) war, tja das war die Zeit
zwischen den task.
Einerseits eine Glaubenssache, andererseits eine Notwendigkeit.
Erstmal, beim ESP32 ist selbst loop schon eine Task. Eine zweite handelt den WLAN Quatsch ab. Beide Cores werden genutzt.
Und dazu ist delay() (oder einer seiner Brüder) beim ESP32 schon quasi notwendig.
Bei kleineren µC kann man streiten, ob man ein TaskSystem (oder delay()) benötigt.
Beim ESP32 hat man fast keine andere Wahl.
Generell macht man was falsch, wenn das nicht reicht.
Multitasking sollte eigentlich auf beliebig wenigen Kernen möglich sein.
Ob Multitasking eine Performance - Steigerung oder - Bremse ist, ist offen.
Natürlich kann man ein multithreading System austricksen. Wenn dein for(;;) {} alles blockiert, hast du was falsch gemacht, z.B. bei der Priorisierung.