Forum: Compiler & IDEs spi flash lib (als circular buffer)?


von Adib (Gast)


Lesenswert?

Hallo,

ich verwende immer wieder spi flash 25xxx und 45xxx um log Daten zu 
speichern. Diese sollen dann wieder ausgelesen werden. System: AVR Mega.
Zur Zeit fange ich immer bei Sector 0 an und schreibe linear in das 
Flash. Nach dem Auslesen lösche ich das Flash und kann wieder vorne 
reinschreiben.
Meine Datensätze (variabler Länge) sichere ich mit einer CRC.

Ich habe dabei 2 Probleme:
- ich muss mir immer die nächste Schreibaddresse merken. Das mache ich 
im EEpROM bevor der Logger ausgeschaltet wird. Manchmal klappt das aber 
nicht richtig. Beim Auslesen merke ich dann Datenfehler.

- wenn der Speicher voll ist ... geht es halt nicht mehr weiter. Das 
Löschen der Sektoren ist in der Regel sehr Zeitintensiv. Und eigentlich 
interressieren mich nicht mehr die ganz alten Daten.

Ich suche eine einfache lib, die mir:
- ohne das ganze Flash zu durchsuchen den nächsten freien Speicher zur 
Verfügung stellt.
- evtl. circular buffering erlaubt (wenn Speicher voll)
- evtl. das Wear leveling beinhaltet
- evtl. kaputte Sektoren berücksichtigt
- ich brauche aber kein Filesystem mit Dateiindex uns so, da ich ja nur 
mit der Applikation die Log Daten speichere und im Atmel nicht xxkByte 
RAM vorhanden sind.

Welche libs benutzt ihr?

Danke,

Adib.
--

von Stephan (Gast)


Lesenswert?

Hi,

da keiner was zu schreiben will, versuche ich mal meine Gedanken hier zu 
"Papier" zu bringen.

Bei meinem System mit AVR habe ich zwei kleine Ringpuffer (8 - 16 
Endries) die den Start-Adresse bzw. die End-Adresse des Loggers angeben. 
(EEProm)
Wenn dein Logger die Datensätze immer in die Pages legt und ein neuer 
Datensatz an dem Offset 0 einer Page beginnt, kann man damit einfach die 
Start-Adresse durch löschen einer Page weiter nach hinten verschieben.
Die Adresse für den Start des Loggers wird nach dem Löschen einer oder 
mehrerer Pages (oder alle Sektoren) neu geschrieben.
Die Adresse für das Ende des Loggers wird nach x Einträgen oder nach der 
Zeit X neu geschrieben.

Wenn du keinen Speicher verschwenden willst genügt auch ein eindeutiger 
Kenner als Kopf deines Datensatzes, der dann zu Beginn einer neuen Page 
gesucht wird.

>bevor der Logger ausgeschaltet wird. Manchmal klappt das aber
>nicht richtig. Beim Auslesen merke ich dann Datenfehler.
wie sieht dein Schaltplan bzw deine Software dazu aus?

Ich habe mir angewöhnt Strom hungrige Sachen von den wichtigen Sachen 
per Diode zu entkoppeln. Nicht das dir die "100" LED's mit ihren 20mA 
den ganzen Saft klauen! ;-)

>Das Löschen der Sektoren ist in der Regel sehr Zeitintensiv.
Ja, warum dann nicht auf Page-Ebene löschen? s.o.

>ohne das ganze Flash zu durchsuchen den nächsten freien Speicher zur
>Verfügung stellt.
in meinem jugendlichen Leichtsinn sag ich mal: es gibt nur die beiden 
Möglichkeiten, entweder du suchst oder du merkst sie dir!

>circular buffering erlaubt (wenn Speicher voll)
siehe oben ( oder Stichwort: Verkettete Liste)

>das Wear leveling beinhaltet
da sag ich mal, brauchst du nicht, da du ja linear die Daten in den 
Flash bringst, werden alle Pages mit der gleichen Anzahl von 
Schreibzyklen belastet. (oder hast du auch sehr viele kleine 
Datensätze?)

>kaputte Sektoren berücksichtigt
erwischt, das Problem habe ich leider auch noch, mir fällt dazu auch 
keine gute Lösung ein :-[


Wie sieht dein Konzept für den Logger aus?
a) hast du eine Page im RAM des AVR's die du füllst und dann weg 
schreibst
b) du füllst die RAM-Page im Flash-Chip und schreibst die Daten wenn sie 
voll ist in den Flash?

oder noch anders?

von Adib (Gast)


Lesenswert?

Hallo Stephan,

der at45 ist auf Page ebene 1024 Bytes Schreib- und löschbar.
Er auch 2 page RAM buffer. In die schreibe ich rein und wenn die Page 
voll ist oder ich auf eine andere Page schreibend zugreifen will, dann 
wird die Page ins flash geschrieben. KOstet nur xx msec pro page.
Laut Datenblatt ist eine page 100.000mal löschbar.

Ich lasse also jetzt mal meinen Code so. Wenn du willst kann ich ihn ja 
mal posten. (nur wohin?)

Anders ist es bei den 25xx Speichern.
Da kann man nur Sektorweise löschen. Das kostst xsec.
Mein Programm nimmt also an , dass der Flash vor der Benutzung leer ist.

GRüße,

Adib.

von Falk B. (falk)


Lesenswert?

@ Adib (Gast)

>- ich muss mir immer die nächste Schreibaddresse merken. Das mache ich
>im EEpROM bevor der Logger ausgeschaltet wird. Manchmal klappt das aber
>nicht richtig. Beim Auslesen merke ich dann Datenfehler.

http://www.mikrocontroller.net/articles/Speicher#EEPROM_Schreibzugriffe_minimieren

>Ich suche eine einfache lib, die mir:
>- ohne das ganze Flash zu durchsuchen den nächsten freien Speicher zur
>Verfügung stellt.
>- evtl. circular buffering erlaubt (wenn Speicher voll)
>- evtl. das Wear leveling beinhaltet
>- evtl. kaputte Sektoren berücksichtigt
>- ich brauche aber kein Filesystem mit Dateiindex uns so, da ich ja nur
>mit der Applikation die Log Daten speichere und im Atmel nicht xxkByte
>RAM vorhanden sind.

Nimm eine SD-Karte mit FAT16/32, dann bist du all diese Probleme los. 
Ich hab vor einigen Monaten das FATfs von ELM Chang erstmalig benutzt, 
lief auf Anhieb problemlos. Für kleine Controller tut es auch das 
Petitfs.

http://elm-chan.org/fsw/ff/00index_e.html
http://elm-chan.org/fsw/ff/00index_p.html

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.