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.
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.
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
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
Vielleicht das integrierte USB. Zum testen muss ich den debug out irgendwie auf wifi umleiten.
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.
Habe code in anderen task verlegt, ohne yieldIfNecessary(). Jetzt ist das timing sauber. Nie über 2ms. WiFi ist nur 650us
:
Bearbeitet durch User
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.