ich baue gerade einen ESP8266 Datenlogger auf Basis des SPIFFS.
Eine Messung meines Sensors
1 | struct Measurement {
|
2 | time_t timestamp;
|
3 | float temperature_celsius;
|
4 | float humidity_percent;
|
5 | };
|
benötigt 16 Bytes.
512 dieser structs werden in einem array im RAM akkumuliert.
1 | Measurement measurements_in_ram[NUM_MEASUREMENTS_IN_RAM];
|
Sobald das array voll ist, wird es in einer von 250 verschiedenen files
im SPIFFS auf dem internen flash ROM abgelegt - das geschieht ca. alle
100-200min einmal. Anschließend können die nächsten Messungen im RAM
aufgezeichnet werden können.
Gerade beschäftige ich mich aber mit dem Löschen dieser Dateien:
Irgendwann möchte ich die Daten abholen und die ROM log komplett
löschen.
Mein Ansatz ist, das "lazy" zu erledigen: ein Measurement gilt als leer,
wenn die timestamp
1 | #define TIME_EMPTY (reinterpret_cast<time_t>(0LL))
|
abgelegt ist. Wenn also das erste Measurement einer SPIFFS-Datei diese
timestamp enthält, ist der ganze Bereich frei und kann später komplett
mit 512 neuen Messungen überschrieben werden.
Hier ist mein code für lazy delete:
1 | void clear_rom() {
|
2 | Measurement data = Measurement{ TIME_EMPTY, 0.0, 0.0 };
|
3 | for (int file_idx = 0; file_idx < NUM_FILES_IN_SPIFFS; ++file_idx) {
|
4 | File f = SPIFFS.open(fnames[file_idx], "w");
|
5 | if (!f) {
|
6 | continue;
|
7 | }
|
8 | f.write(reinterpret_cast<uint8_t*>(&data), sizeof(Measurement));
|
9 | f.close();
|
10 | }
|
11 | }
|
obwohl jede Datei NUM_MEASUREMENTS_IN_RAM * sizeof(Measurement) bytes
groß ist schreibe ich also nur die ersten 16 Bytes - das geht deutlich
schneller als eine Komplettformatierung.
Interessanterweise klappt das genau bei der ersten der 250 Dateien. Alle
weiteren bleiben komplett unverändert - auch im ersten Measurement. Es
ist als würde er irgendwo aus dem loop fliegen.
**TLDR**
Nun also meine Frage:
ich habe 250 SPIFFS Dateien mit je einer Größe von 8kB. Wenn ich nun
einige dieser Dateien öffne und jeweils 16 Bytes hineinschreibe und
wieder schließe, hat das Auswirkungen auf die Struktur des Dateisystems?
Verschieben sich beispielsweise die Addressen der nachfolgenden Dateien
unerwartet oder habe ich in irgendeiner anderen Weise UB?