Hallo, ich habe mal eine Frage an die ESP32 Experten. Ist eine sehr spezielle Frage, aber vielleicht hab ich Glück. Ich lese Sensordaten per I2C und schreibe die Daten in den Flash des ESP32 Das ganze Funktioniert mit 1000Hz (begrenzt durch die I2C Zeit) Aber etwa alle 200ms setzt diese Schleife für 50ms aus. Ich vermute mal das irgendwo ein Interrupt für WLAN,RTOS o.ä. diese Aussetzer verursacht. Habt Ihr eventuell einen genaueren Verdacht? Ich nutze ein ESP32 Wroom mit 16MB Flash Arduino/Platform IO mit der aktuellen Espressif Arduino Lib Auf dem Flaschspeicher des ESP habe ich ein FAT Filesystem initialisiert. WLAN ist dauerhaft verbunden
John P. schrieb: > Habt Ihr eventuell einen genaueren Verdacht? Das Flash wird blockweise geschrieben (in grösseren Blöcken als das was du aktuell schreibst), und bis es fertig ist vergeht eine gewisse Zeit.
OMG schrieb: > Das Flash wird blockweise geschrieben (in grösseren Blöcken > als das was du aktuell schreibst), und bis es fertig ist vergeht > eine gewisse Zeit. mit flush() sollte aber sofort geschrieben werden? Buffer enthält die Sensorwerte Data ist mein File Data.write(Buffer,20); Data.flush();
Wenn du jedesmal für 20 Bytes einen ganzen Flash-Block schreibst (und das mit dieser Datenrate) dann dürfte dein Flash bald hinüber sein. Ich vermute jedoch dass du mit Flush gar keinen Einfluss darauf hast wann der Flash-Block wirklich geschrieben wird. Eher wird die darunter liegende Lib vermutlich erst zum Schreiben gezwungen wenn die Datei geschlossen wird.
John P. schrieb: > mit flush() sollte aber sofort geschrieben werden? Ja, dann hast du vermutlich bei jedem Schreibvorgang einen Aussetzer und nicht nur alle 200ms.
OMG schrieb: > Das Flash wird blockweise geschrieben (in grösseren Blöcken > als das was du aktuell schreibst), und bis es fertig ist vergeht > eine gewisse Zeit. die Sector Erase Time liegt bei 50ms Ein Sektor sind 4096 Byte -> passt also mit alle 200ms 20Byte könnte man den Sektor bzw alle Sektoren löschen bevor man beginnt irgendwas zu schreiben?
habt ihr noch andere Ideen 20Byte im 1khz Takt zu Speichern? insgesamt etwa 60sek -> ca. 1,2 MByte
Mir ist dein Anwendungsfall noch nicht ganz klar. Möglicherweise(!) könnte es was bringen, wenn du deine Schreibbefehle auf den zweiten Core auslagert. Also Hauptcore speichert Daten zwischen, zweiter Core schreibt die Daten ins Flash. Da der zweite Core beim ESP32 jedoch Einschränkungen hat, weiß ich nicht, ob dieser Ansatz von Erfolg gekrönt ist.
Sven B. schrieb: > Mir ist dein Anwendungsfall noch nicht ganz klar. > Möglicherweise(!) könnte es was bringen, wenn du deine Schreibbefehle > auf den zweiten Core auslagert. Also Hauptcore speichert Daten zwischen, > zweiter Core schreibt die Daten ins Flash. Das hatte ich auch im Sinn gehabt. Werde es mal ausprobieren wenn wieder etwas zeit übrig ist. Eventuell kann man das auch umdrehen: 2. Core übernimmt nur messen und zwischenspeichern 1. Core die Speicherverwaltung
Du hast da ein Betriebssystem im Hintergrund laufen. Das braucht ggf. regelmäßig Zeit für sich selbst, zum Beispiel für Taskswitches. Zusätzlich hast Du beim ESP32 auch noch einen WLAN Stack im Hintergrund laufen, der braucht auch regelmäßig Rechenleistung. Probier mal aus WLAN abzuschalten und schau dann noch mal.
John P. schrieb: > Ich lese Sensordaten per I2C und schreibe die Daten in den Flash des > ESP32 > > Das ganze Funktioniert mit 1000Hz (begrenzt durch die I2C Zeit) > > Aber etwa alle 200ms setzt diese Schleife für 50ms aus. > Ich vermute mal das irgendwo ein Interrupt für WLAN,RTOS o.ä. diese > Aussetzer verursacht. > > Habt Ihr eventuell einen genaueren Verdacht? Echte Männer würden als Unterstützung noch den Quellcode beifügen damit wir reinsehen können.
Sven B. schrieb: > Möglicherweise(!) könnte es was bringen, wenn du deine Schreibbefehle > auf den zweiten Core auslagert. Also Hauptcore speichert Daten zwischen, > zweiter Core schreibt die Daten ins Flash. Zur Vollständigkeit: Ich habe die I2C Sensorerfassung auf den 2. Core ausgelagert. Der 1. Core Schreibt ins Flash Funktioniert wunderbar, außer dass die 50ms blockade weiterhin bestehen bleibt. Also beide Kerne sind betroffen. Nächster Lösungsansatz: ESP32 Wrover mit PSRAM
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.