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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.