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.
|
Anzeige
|
ESP32S2 blockiert alle 2s für 5ms ?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.
Am OS.
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...
FreeRTOS blockiert nicht für 5ms "einfach so", außer da läuft noch was anderes wie eben WiFi. Leider nicht das PSRAM. Der macht das auch ohne. Bild loopzeiten in us. WiFi hat einfluss, aber unter 1ms. Die 5ms ist was anderes. 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
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:
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:
CONFIG_FREERTOS_UNICORE -> einkernvariante 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 Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|