Ich möchte gerne von einem µC aus Daten fortlaufend in eine Datei auf einer SD-Karte schreiben. Die Datei soll am PC lesbar sein (FAT16). Damit kein FAT16 mit Schreibmöglichkeit unterstützt werden muss (wegen begrenzter Resourcen von Codeflash und RAM auf µC), soll per PC (Kartenleser) auf der SD-Karte eine große "leere" Datei angelegt werden, sodass der µC einfach in die Sektoren dieser bestehenden Datei reinschreiben kann. Jetzt gibt es das Problem, dass man einen Pointer auf die zuletzt geschriebene Stelle nichtflüchtig speichern muss, damit nach dem Aus- und wieder Einschalten an der richtigen Stelle weitergeschrieben wird. Man könnte sich das z.B. in 4 Bytes im ersten Sektor der Datei speichern. Wenn man allerdings z.B. jede Sekunde diese Info dort abspeichert, dann wird wohl sehr schnell die zulässige Schreibzyklenanzahl überschritten und der Sektor defekt sein. Wie sieht das mit der Abnutzung der Flashzellen in einem Sektor genau aus? Der Sektor wird ja vermutlich intern erst gelöscht (z.B. Bits auf 0) und dann mit dem neuen Bitmuster beschrieben. Wenn ein Bit vor dem Löschen schon 0 war und beim neu Beschreiben auch wieder eine 0 bekommt, dann müsste es doch dann keine Abnutzung geben? Die Idee wäre, die 4 Bytes für die Positionsinfo nicht immer an die gleiche Position im Sektor zu schreiben, sondern über mehrere Bytes zu verteilen. Könnte man so das Problem mit der begrenzten Schreibzyklenanzahl lösen?
>(wegen begrenzter Resourcen von Codeflash und RAM auf µC),
Fehler Nummer eins.
Du wirst mit dieser Lösung nie glücklich werden.
Auf atmel.com gibt es bei den AVRs die Application Note AVR101: High Endurance EEPROM Storage. Dort wird ein speicherschonender Ringpuffer, also das, was du vor hast, genau beschrieben. Grüße, Peter
Ähem. Setzen SD-Karten das "wear levelling" nicht schon intern um? Sonst würde mit einem FAT (!) Dateisystem niemand auf Dauer glücklich werden.
Ich hab so etwas in der Art letztes Jahr mal entwickelt - mit einem PIC. Wie oft hast Du Sachen, die gespeichert werden ? Wie lange soll das Gerät laufen ?
Jetzt gibt es das Problem, dass man einen Pointer auf die zuletzt geschriebene Stelle nichtflüchtig speichern muss, damit nach dem Aus- und wieder Einschalten an der richtigen Stelle weitergeschrieben wird. --- Die Lösung heisst NVRAM, das ist nichtflüchtig und kann beliebig oft wiederbeschrieben werden. Ausserdem kannst Du einen Sektor einer SD so oft beschreiben wie Du willst, er wird nie logisch kaputt gehen, die Karte ersetzt ihn fortlaufend durch Reservesektoren, die eingeblendet werden. Den Firlefanz mit der SD Karte würde ich mir erst gar nicht antun, zudem Du nicht weisst ob der PC die Datei fortlaufend erzeugt hat oder nicht doch Sektorsprünge darin sind. Dann müssstest Du die Fat auslesen usw. Leider gibt es für PIC keine gescheite Fat Verwaltung, ausser Bezahllösungen, die zudem den teuren High Tech oder IAR Compiler erfordern, bekanntlich gibt es keinen GCC für PIC und der beliebte CCS ist durch die HAL zu keinem anderen kompatibel.
Vorschlag, welcher sich bei mir bewährt hat: 512 Bytes sammeln im RAM des µC (512 Bytes = 1 Sektor) und dann Sektor für Sektor beschreiben. Den 1. Sektor für den Dateianfang muss man z. B. mit WINHEX vorher suchen. Man kann damit wochenlang Messwerte auf der SD-Karte sammeln. >Du nicht weisst ob der PC die Datei fortlaufend erzeugt hat oder nicht >doch Sektorsprünge darin sind. Karte formatieren und nur eine Datei anlegen. Bisher keine Probleme
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.