ESP32 aussetzer im 5Hz Takt

OP #5963759
Lesenswert?

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
Gast #5963815
Lesenswert?

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.
OP #5963843
Lesenswert?

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?
#5972651
Lesenswert?

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.
OP #5973875
Lesenswert?

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
#5973890
Lesenswert?

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.
Gast #5973917
Lesenswert?

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.
OP #6029463
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren