ESP32 und Task Probleme

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 ?

//Task2code: 
void Task2code( void * pvParameters ){ 
  for(;;)
  {
    //delay(100);
  }

mfg Schuby

es hält die Durchführung dieses Tasks für 100 Millisekunden an.
Damit haben die anderen Tasks die Möglichkeit durchgeführt zu werden.

Wolle hat eine nette Einführung:

Ich dachte der ESP32 hat 2 Kerne, was hat der Kern 1 mit Kern 0 zu tun. ?

mfg Schuby

Weil die gemeinsame Ressourcen nutzen.

Gruß Tommy

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.

alles klar danke für Antworten.

mfg Schuby

Brauchst du Ihn wirklich? Wenn ich sehe, das du mit delay arbeitest, vermute ich, das es nicht wirklich notwendig ist.

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.

Ja, hat er. Soweit ich weiß, läuft "loop()" in Core 1.

Und wenn man dann die eigene Task mit

auch in den Core 1 legt (und das auch noch falsch kommentiert), dann ist der Nutzen von 2 Cores eher nicht gegeben .... :-).

zum Anfangen könnte man die Taskzuordnung dem RTOS überlassen:

   ,  tskNO_AFFINITY); // If the value is tskNO_AFFINITY, the created task is not pinned to any CPU, and the scheduler can run it on any core available.

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.

@michael_x das verstehe ich jetzt nicht, ist das nicht gut for(;;) ?

In diesen Task möchte ich eh ein while (Start = true) {}
einbauen, wäre das besser ?

mfg schuby

Eine leere Schleife ist nicht gut.
Wenn dein FreeRTOS auf kooperativ gestellt ist kommt er da nie raus.
Auch bei falsch gewählten Prioritäten.

Es gehört irgendeine Form des delay() oder yield in den Schleifenkörper