Forum: Mikrocontroller und Digitale Elektronik SD-Karte mit atmega128: Ringspeicher-Datei


von FAT-Mann (Gast)


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

von Daniel R. (zerrome)


Lesenswert?

Hallo,
da muss der Logger in die Zukunft sehen können :)

> ...jetzt sollen alle Daten ab dem
> Zeitpunkt 15 min vor Triggersignal..

Wieviele Daten fallen denn an?

von MagIO (Gast)


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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Der ATMega128 ist in der Lage, externes RAM bis 60k anzusprechen. Papp 
einfach eins dran.

von Daniel R. (zerrome)


Lesenswert?

Die Idee von MagIO ist gut :)

von Tom E. (tkon)


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

von MagIO (Gast)


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.

von Daniel R. (zerrome)


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)...

von MagIO (Gast)


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.

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.