Arbeite mich gerade ins multi-threading des ESP32 etwas ein.
Ich habe dafür den Beispiel-Code hier
TaskHandle_t Core0TaskHnd ;
TaskHandle_t Core1TaskHnd ;
void setup()
{
Serial.begin(9600);
xTaskCreatePinnedToCore(CoreTask0,"CPU_0",1000,NULL,1,&Core0TaskHnd,0);
xTaskCreatePinnedToCore(CoreTask1,"CPU_1",1000,NULL,1,&Core1TaskHnd,1);
}
void loop()
{
Serial.print ("Application CPU is on core:");
Serial.println (xPortGetCoreID());
delay (500);
}
void CoreTask0( void * parameter )
{
for (;;)
{
Serial.print("CoreTask0 runs on Core: ");
Serial.println(xPortGetCoreID());
yield();
delay (600);
}
}
void CoreTask1( void * parameter )
{
for (;;)
{
Serial.print("CoreTask1 runs on Core: ");
Serial.println(xPortGetCoreID());
delay (700);
}
}
abgeändert in
TaskHandle_t Core0TaskHnd ;
TaskHandle_t Core1TaskHnd ;
void setup()
{
Serial.begin(9600);
xTaskCreatePinnedToCore(CoreTask0,"CPU_0",1000,NULL,1,&Core0TaskHnd,0);
xTaskCreatePinnedToCore(CoreTask1,"CPU_1",1000,NULL,1,&Core1TaskHnd,1);
}
void loop()
{
Serial.print ("Application CPU is on core:");
Serial.println (xPortGetCoreID());
delay (500);
}
void CoreTask0( void * parameter )
{
Serial.print("CoreTask0 runs on Core: ");
Serial.println(xPortGetCoreID());
delay (600);
}
void CoreTask1( void * parameter )
{
Serial.print("CoreTask1 runs on Core: ");
Serial.println(xPortGetCoreID());
delay (700);
}
Wie man sehen kann, habe ich die "For"-Schleifen rausgenommen.
Der Beispiel-Code läuft einwandfrei, der abgeänderte nicht.
Warum ich das getan habe?
Nun, ich will Code nicht einfach nur abkupfern sondern die Hintergründe verstehen.
Ich habe erwartet, dass void loop ständig aufgerufen wird, die funktionen "void CoreTask0" und "void CoreTask1" jeweils einmal aufgerufen werden.
Ohne die "For"-Schleifen werden die task-Funktionen verlassen und der ESP stürzt ab. Er macht ständig einen reboot.
Es gibt aber Beispielcode, da wird die "For"-Schleife mit "return" und damit auch der task verlassen
void Task2code( void * pvParameters ){
Serial.print("Task2 running on core ");
Serial.println(xPortGetCoreID());
for(;;){
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C \n ");
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
delay(2000);
}
}
Ich bräucht Info, wie die task-Functions vom Betriebssytem gehandelt werden. Wann ggf wie oft werden die task-functions aufgerufen?
Warum stürzt der ESP ab, wenn im abgeänderten Beispiel ohne die For-Schleifen eine task-funktion verlassen wird?
Warum müssen die endlos "For"-Schleifen sein?