ESP32S2 blockiert alle 2s für 5ms ?

OP #7634379
Lesenswert?

Ist geklärt.

In the main Arduino loop, above loop() function, in the file cores/esp32/main.cpp we see yieldIfNecessary() function. It works on ESP32-S2 for example as it only has one core. Function adds a 5ms delay every two seconds. Under some specific circumstances, this causes problem with loop() execution time.

OP #7634820
Lesenswert?

ESP32 läuft mit RTOS Da kannst du neue tasks kreieren:

1
TaskHandle_t TaskHandle_1;
2

3
xTaskCreate(MyTask1, "Task1", 2000, NULL, 1, &TaskHandle_1);
4

5
static void MyTask1(void* pvParameters)
6
{ 
7
  while(1) 
8
  { 
9
    doyourstuffhere(); 
10
  } 
11
}

Das yieldIfNecessary() ist ein delay(5000); und ist nur drin dass das RTOS zeugs weiterläuft falls jemand einen busy-loop kreiert. Wenn du in deinem loop() ein anderes delay drin hast brauchts das nicht. Oder zweikern brauchen das nicht weil dann der andere kern RTOS macht.

delay() heisst nicht "prozessor stoppen", das heisst "der prozessor kann jezt für anderes verwendet werden" wie z.b. den wifi stack. delay() verursacht einen task-switch. ISR laufen übrigens immer. Die unterbrechen deinen loop wann immer die lust haben :)

Das sieht so aus:

1
void yieldIfNecessary(void){
2
    static uint64_t lastYield = 0;
3
    uint64_t now = millis();
4
    if((now - lastYield) > 2000) {
5
        lastYield = now;
6
        vTaskDelay(5); //delay 1 RTOS tick
7
    }
8
}
9

10
void loopTask(void *pvParameters)
11
{
12
    setup();
13
    for(;;) {
14
#if CONFIG_FREERTOS_UNICORE
15
        yieldIfNecessary();
16
#endif
17
        if(loopTaskWDTEnabled){
18
            esp_task_wdt_reset();
19
        }
20
        loop();
21
        if (serialEventRun) serialEventRun();
22
    }
23
}

CONFIG_FREERTOS_UNICORE -> einkernvariante

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren