Forum: Mikrocontroller und Digitale Elektronik ESP32S2 blockiert alle 2s für 5ms ?


von Hadmut F. (hadmut)


Lesenswert?

Problem:
https://github.com/espressif/esp-idf/issues/10055

Hat jemand eine vermutung woran das liegt?
Das ist für RT app nicht gerade brauchbar.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Hadmut F. schrieb:
> Hat jemand eine vermutung woran das liegt?
Am OS.

> Das ist für RT app nicht gerade brauchbar.
Für manche ist Echtzeit, wenn innerhalb von 100ms reagiert wird.

Kleiner Tipp: stecke mal noch einen USB-Stick oder eine USB-Tastatur 
ein. So mancher wundert sich, warum sich sein Programm dann seltsam 
verhält.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Ist WiFi aktiviert? Das würde es erklären. Vielleicht der DRAM-Refresh? 
Der PSRAM enthält ja DRAM. Den Code mal ins interne SRAM pflanzen?

Vielleicht auf den ESP32S3 wechseln, der hat 2 Kerne...

Lothar M. schrieb:
> Am OS.

FreeRTOS blockiert nicht für 5ms "einfach so", außer da läuft noch was 
anderes wie eben WiFi.

: Bearbeitet durch User
von Hadmut F. (hadmut)


Angehängte Dateien:

Lesenswert?

Leider nicht das PSRAM.
Der macht das auch ohne.

Bild loopzeiten in us.

WiFi hat einfluss, aber unter 1ms. Die 5ms ist was anderes.

: Bearbeitet durch User
von Hadmut F. (hadmut)


Lesenswert?

Vielleicht das integrierte USB.
Zum testen muss ich den debug out irgendwie auf wifi umleiten.

von Hadmut F. (hadmut)


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.

von Hadmut F. (hadmut)


Angehängte Dateien:

Lesenswert?

Habe code in anderen task verlegt, ohne yieldIfNecessary().
Jetzt ist das timing sauber. Nie über 2ms.
WiFi ist nur 650us

: Bearbeitet durch User
von Klaus R. (klara)


Lesenswert?

Hadmut F. schrieb:
> Habe code in anderen task verlegt, ohne yieldIfNecessary().

Ich weiss nicht was Du da gemacht hast. Erst in der loop - Funktion wird 
das Programm doch ausgeführt. Demnach könnte man yieldIfNecessary() 
nicht umgehen. Stoppt in den 5 ms der ganze Prozessor oder werden ISR - 
Funktionen dann doch noch ausgeführt?
mfg Klaus

von Hadmut F. (hadmut)


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

: Bearbeitet durch User
von Klaus R. (klara)


Lesenswert?

Hallo Hadmut,
danke, da habe ich wieder etwas Neues gelernt. Bislang genügen mir noch 
ISR - Funktionen oder Timer. Eigene Tasks sind interessant. Ich werde 
mir mal RTOS angesehen.
mfg Klaus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.