Forum: Mikrocontroller und Digitale Elektronik ESP32 aussetzer im 5Hz Takt


von John P. (brushlesspower)


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

von OMG (Gast)


Lesenswert?

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.

von John P. (brushlesspower)


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.

mit flush() sollte aber sofort geschrieben werden?

Buffer enthält die Sensorwerte
Data ist mein File

Data.write(Buffer,20);
Data.flush();

von OMG (Gast)


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.

von Wolfgang (Gast)


Lesenswert?

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.

von John P. (brushlesspower)


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?

von John P. (brushlesspower)


Lesenswert?

habt ihr noch andere Ideen 20Byte im 1khz Takt zu Speichern?

insgesamt etwa 60sek -> ca. 1,2 MByte

von Olaf (Gast)


Lesenswert?

Externes FRAM.

Olaf

von Sven B. (sb2048)


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.

von John P. (brushlesspower)


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

von Klaus (Gast)


Lesenswert?

Groß genuger Fifo. Schreiben in größeren Blöcken.

Klaus

von Christian B. (casandro)


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.

von Lona (Gast)


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.

von John P. (brushlesspower)


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

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.