SD-Karte mit atmega128: Ringspeicher-Datei

Gast #1565691
Lesenswert?

Auf mit einem atmega128 will ich Daten loggen und auf eine SD-Karte 
speichern. Das FAT32-Projekt, welches hier auf der Homepage zum Download 
bereit steht, habe ich bereits erfolgreich getestet. Nun zu meinem 
Problem. Der Logger empfängt permanent Daten, soll jedoch nicht alle 
Daten mittlogen. Es wird ein Triggersignal ausgelöst und jetzt sollen 
alle Daten ab dem Zeitpunkt 15 min vor Triggersignal bis Triggersignal 
auf die Karte geloggt werden. Die lässt sich recht einfach mit einem 
Ringspeicher lösen, das Problem ist jedoch, dass der interes Speicher 
des Atmegas nicht ausreichend groß ist. Meine Idee ist daher, die 
Log-Datei als Ringspeicher zu missbrauchen. Das soll stell ich mir 
ungefähr so vor:
Der Logger wird gestartet, die Daten werden auf der SD-Karte Zeile für 
Zeile gespeichert. Nach 15Min wird nun die erste Zeile gelöscht und in 
der letzten Zeile die neuen Daten angehängt. So habe ich immer die 
letzten 15Min in meinem Log-File und beim Triggerevent wird einfach die 
Datei geschlossen. Ich habe mir zwar schon einige Funktionen aus dem 
Projekt angeschaut und einiges ausprobiert, bin bis jetzt aber noch 
nicht weiter gekommen. Gibt es irgendwo die Möglichkeit den Dateianfang 
festzulegen
Gast #1565710
Lesenswert?

Ich würde nicht auf FAT-Level runter gehen!

Einfach eine Datei erzeugen, die groß genug ist für die 15Min. SD 
formatieren und diese Datei als erstes drauf kopieren. Dann ist sie 100% 
in aufeinander folgenden Sektoren. Dann braucht man nur noch auf die 
Sektoren zugreifen.

Ein Sektor wird immer im RAM aufgefüllt mit den Messwerten. Ist er voll, 
dann wird er gespeichert. Die Sektoradresse geht dann also immer rundum. 
Man muss weder File öffnen, noch schließen.
Lediglich den aktuellen Startsektor muss man sich noch merken. 
Vielleicht im 1. Sektor, der dann nicht mehr mit Messwerten 
überschrieben wird.
#1565764
Lesenswert?

Sofern möglich würde ich mit 3 Dateien arbeiten:

Datei 1 und 2 werden nacheinander mit jeweils 15 Min befüllt. Wenn 2 
voll ist, wird 1 gelöscht und neu begonnen. Das wird bis zum 
Triggerimpuls wiederholt. Die Daten sind dann in der kleineren Datei + 
das Ende der Größeren.

In Datei 3 werden die 15 Min nach dem Triggerimuls gespeichert.

Vorteil: Das funktioniert auch mit großen Datenmengen und fragmentierter 
Speicherkarte

Nachteil: Eine gewisse "Nachbearbeitung" ist notwendig, die Daten 
sollten syncron aufgezeichnet werden um exakt 15 min erkennen zu können
Gast #1566368
Lesenswert?

Ich weiß, dass die Idee gut ist ;o)

Ich hab mir so ein paar Funktionen erstellt, mit denen ein swap-File 
nicht mehr per FAT benutzt wird. Es funktioniert einfach über Adressen. 
Aus der Adresse wird der Sektor errechnet (Adresse >> 9) und der Sektor 
wird geladen. Der Zugriff ist auf diese Weise erheblich schneller, als 
über die normalen Funktionen mit FAT Unterstützung, die ja immer auch in 
Directory und Cluster-Tabellen rumwerkeln müssen.

Das umkopieren in eine andere Datei (diesmal mit FAT funktionen) geht ja 
auch bei dem Ansatz.
#1566437
Lesenswert?

Klingt gut.
Zu beachten ist aber immer, dass es sich um Flash Speicher handelt, 
dieser ist nicht unendlich oft beschreibbar.
Wenn man immer auf den gleichen Sektoren rumschreibt, ist man darauf 
angewiesen, dass der Hersteller der Karte ordentliche Trennung von 
physikalischen und logischen Sektoren macht (weare-leveling)...
Gast #1568784
Lesenswert?

Auch das ist einfach zu umgehen. Man macht einfach die swap-datei so 
groß wie möglich und begrenzt sie nicht auf die hier eigentlich nur 
benötigten 15min (wie groß/klein das auch immer sein mag).

Damit läuft der Ringbuffer erst mal durch z.B. 1GB bevor er wieder mit 
dem ersten Sektor anfängt.

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