SD Karte, Problem mit Wear Leveling

Gast #3429937
Lesenswert?

Hi Zusammen

Ich will sequentiell in eine 2GB SD- Karte schreiben, jeweils drei 
Blöcke a 512Bytes, alle 85ms. In der Karte werden nur Rohdaten von 
Sensoren gespeichert, ohne ein Filesystem, und um das Wear Leveling 
möglichst gut zu unterbinden werden die Blöcke gleichmässig auf die 
Adressen verteilt. Soweit funktioniert auch alles wie es sollte.

Das Problem liegt bei einer Verzögerung, welche jeweils nach ca. 40'000 
geschriebenen Blöcken auftritt. Die Verzögerung dauert dann meist über 
100ms, weshalb es unmöglich ist, die nächsten Daten zu schreiben. 
Während dieser Zeit ist die SD Karte im Busy Modus.

Ist es möglich, dass die Verzögerung auftritt aufgrund des Wear 
Levelings? Und gäbe es Möglichkeiten, dieses zu unterbinden oder zu 
verhindern? Ist es überhaupt realistisch, über längere Zeit mit dieser 
Frequenz die SD Karte zu beschreiben, ohne unterbrochen zu werden?

Vielen Dank für Eure Hilfe
Grüsse
#3429964
Lesenswert?

Moin,

du könntest eine andere SD-Karte probieren. Allerdings ist es wohl 
trotzdem normal, ab und an solche Zeiten akzeptieren zu müssen.

Du brauchst auf einer SD-Karte kein eigenes Wear-Levelling durchführen, 
der Controller tut dies selbst. Eventuell hast du zusätzlich in den 
ersten 2M-8M ein anderes Verhalten der Karte, da dort üblicherweise bei 
FAT-Systemen der FAT liegt (und hier u.U. optimierte Wear-Levelling 
Strategien angewendet werden).

Kannst du irgendwie mehr Daten puffern? Die Wahrscheinlichkeit ist hoch, 
dass der dem verzögerten folgende Datenzugriff wieder schneller geht - 
also wenn du irgendwie einmal 512 Bytes zusätzlich puffern kannst, 
kommst du wohl zurecht.

Grüße,

Matthias
#3429998
Lesenswert?

Andere Karten habe ich bereits probiert, war auch mit einem Hersteller 
in Kontakt, jedoch half dies wenig. Momentan verwende ich die S-300u von 
SwissBit.

Das Wear Leveling führe ich nicht selbst durch und das Verhalten ist 
leider auf der ganzen Karte genau gleich.

Was meinst Du genau mit den zusätzlichen Daten puffern? Die Blöcke 
vergrössern? Oder mehr Blöcke auf einmal schreiben?
Die Daten werden im uC zwischengespeichert, mit einem Ringbuffer. Diesen 
kann ich wegen dem relativ kleinen RAM nicht vergrössern.
Gast #3430004
Lesenswert?

Von 0.5 s Verzögerung im schlimmsten Fall ausgehend, wird man wohl einen 
FIFO von knapp 10 kByte benötigen.

> Die Daten werden im uC zwischengespeichert, mit einem Ringbuffer. Diesen
> kann ich wegen dem relativ kleinen RAM nicht vergrössern.

Tja, schlechte Karten.
#3430012
Lesenswert?

Ansonsten eventuell etwas wie AT 45DB321D SO (32 Mbit SPI Data Flash, 
2,50€ bei Reichelt)? Dort hast du garantierte Write-Zeiten und kannst 
auch eine ganze Menge an 512 Byte Blöcken unterbringen (8192 um genau zu 
sein). Zudem braucht es weniger Strom. Wenn du wirklich mehr Speicher 
brauchst (wie lange soll geloggt werden?): Es gibt auch serielles SRAM:

Microchip 23A640. Das als Ramerweiterung für nen größeren 
Zwischenspeicher/Ringpuffer nehmen. Alternativ eben nen größeren µC 
einsetzen :)
#3430065
Lesenswert?

@ Kendrick (Gast)

>Blöcke a 512Bytes, alle 85ms. In der Karte werden nur Rohdaten von
>Sensoren gespeichert, ohne ein Filesystem,

Würde ich heute nicht mehr machen.

> und um das Wear Leveling
>möglichst gut zu unterbinden werden die Blöcke gleichmässig auf die
>Adressen verteilt.

Das kannst du so leicht nicht austricksen ;-)

>Das Problem liegt bei einer Verzögerung, welche jeweils nach ca. 40'000
>geschriebenen Blöcken auftritt. Die Verzögerung dauert dann meist über
>100ms, weshalb es unmöglich ist, die nächsten Daten zu schreiben.

Doch, nur halt später ;-)

>Während dieser Zeit ist die SD Karte im Busy Modus.

Sieht so aus.

>Ist es möglich, dass die Verzögerung auftritt aufgrund des Wear
>Levelings?

Ja.

> Und gäbe es Möglichkeiten, dieses zu unterbinden oder zu
>verhindern?

Glaub ich eher nicht, bzw. der Aufwand lohnt sich nicht.

> Ist es überhaupt realistisch, über längere Zeit mit dieser
>Frequenz die SD Karte zu beschreiben, ohne unterbrochen zu werden?

Nur mit ausreichend großem FIFO.

512 Byte/85ms = 5,9 kB/s. Wenn man schlimmstenfalls mal 500ms als 
Pufferzeit ansetzt, brauchst du halt ~ 3kB.
#3430289
Lesenswert?

Hast Du mal probiert, 16KB Blöcke auf einmal zu schreiben (Multi Block 
Write)? Und nein, die muss man nicht auf einmal im RAM halten, wenn man 
die Schreibfunktion etwas modifiziert.

Hintergrund ist, das die Sandisk SD 2GB hier dann scheinbar in einen 
"schnelleren" Modus schalten. Die Blöcke müssen aber IIRC an den 
physichen 16KB ausgerichtet sein.

Allerdings brauchen sie dann auch ~10 mA dauerhaft, was bei Versorgung 
aus einer Batterie stören könnte.

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