Forum: Mikrocontroller und Digitale Elektronik Suche Erklärung für SD-Card Schreib-Delays


von Peterchen (Gast)


Lesenswert?

Hallo, mir ist aufgefallen, daß SD-Karten irgendwann mal eine Pause 
einlegen.

Ich schreibe, ohne Unterbrechung, 2048 Bytes durch ein FAT-Dateisystem 
(dieses hier: http://elm-chan.org/fsw/ff/00index_e.html) auf eine 
SD-Karte. Die Karte wird im SPI-Modus betrieben (SPI-Takt = 18 Mhz).

Im Normalfall dauert ein Schreibzugriff für 2048 Bytes 3 bis 4 ms. Hin 
und wieder dauert ein Schreibzugriff aber 150...200 ms. In dieser Zeit 
ist die Karte scheinbar etwas länger beschäftigt.

Ist dieses Verhalten normal (weil die Karte den physikalischen Speicher 
beschreiben muß) oder deutet es auf einen Fehler bei mir hin?

Danke im Voraus,
 Peterchen

von Mike (Gast)


Lesenswert?

Ja, das ist normal, insbesondere bei einer recht neuen Karte. Hin und 
wieder werden beim Schreiben defekte Speicherzellen entdeckt. Dann wird 
ein Reserve-Speicherblock gesucht und der defekte Block umgelagert. Dies 
kann mit einer grösseren Umorganisation des Kartenspeichers verbunden 
sein, die dann eben etwas länger dauert.

Gruss
Mike

von Mike (Gast)


Lesenswert?

Ich habe übersehen, dass Du über ein FAT-System schreibst. Da kann es 
auch vorkommen, dass durch Löschen von Dateien Lücken in der 
kontinuierlichen Speicherbelgung vorhanden sind. Kommt das System beim 
Schreiben ans Ende einer solchen Lücke, muss ein neuer freier 
Speicherbereich in der FAT-Tabelle gesucht werden, was je nach 
Implementierung des Filesystems (freier Pufferspeicher) ebenfalls etwas 
dauern kann. Dieser Effekt kommt zum obengenannten noch hinzu. Hast Du 
mal versucht, eine grosse Datei auf eine vollständig leere (frisch 
formatierte) Karte zu schreiben? Dann sollte die FAT-Speichersuche kein 
Thema sein.

Gruss
Mike

von Peterchen (Gast)


Lesenswert?

Hallo,
Ich habe bei einer frisch formatierten 2GB SD-Card (Agfa-Photo) direkt 
In der Low-Level Schreibfunktion gemessen. So siehts aus:

DiskWrite: (35) 169
DiskWrite: (218) 164
DiskWrite: (4) 159
DiskWrite: (4) 161
DiskWrite: (288) 166
DiskWrite: (10) 160
DiskWrite: (252) 165
DiskWrite: (10) 164
DiskWrite: (252) 165
DiskWrite: (10) 163
DiskWrite: (252) 162
DiskWrite: (10) 162
DiskWrite: (252) 163
DiskWrite: (10) 160
DiskWrite: (252) 165
DiskWrite: (10) 163
DiskWrite: (252) 163
DiskWrite: (10) 165
DiskWrite: (252) 161
DiskWrite: (10) 164
...
...
...

Die Zahl in Klammern ist die Anzahl vorheriger Schreibzugriffe, die 
unter 10ms lagen. Die Zahl danach ist die Zeit für diesen langen 
Schreibzugriff. Auffällig sind die anfänglichen Startschwierigkeiten und 
dann, daß sich dies Delays alle 10 und 252 Zugriffe wiederholen.

von Frank G. (embedded-os)


Lesenswert?

Das liegt an nachfolgenden Punkten:
* NAND ist 8/16bit seriell (kein Addressbus) und wird "quasi" wie eine
  serielle Schnittstelle angesprochen
* es wird immer 1..4 Sektoren (a 512byte) gelesen und ECC-geprüft
* es kann immer nur eine Page (typ 2kB) geschrieben werden (mit ECC)
* es kann immer nur ein Block (typ 128kB) gelöscht werden

Nun multipliziere das mit "wear-leveling" und verwende als Basis mal
typische Zeiten eines Samsung NAND-Flash's.

siehe:
http://de.wikipedia.org/wiki/Flash-Speicher
http://en.wikipedia.org/wiki/Wear_levelling

oder du googlst mal nach diesen KeyWords .

Da nun das Wear-Leveling bemüht ist, die write-Last auf alle Sektoren 
mglst. gleichmäßig zu verteilen, werden bei jedem Schreiben andere phys. 
Sektoren verwendet. Wenn diese bisher andere (ungültige Daten) 
beinhalten, muß erst der Block gelöscht werden. Wenn die frei-Bereiche 
knapp werden oder große "used-cnt" Unterschiede auftreten werden auch 
verwendete Sektoren reorganisiert. Diese müssen aber jederzeit unter der 
entsprechenden logischen Sektoren-Nummer (vom user) ansprechbar sein.

Also, WearLeveling (Mathematik & patentierte Algo's) + phys. 
Eigenschaften + log. Verwaltung ergibt etwa alle "128kB - 2kB" ein 
table-work with erase/update cycle...

von Peterchen (Gast)


Lesenswert?

Viel Dank, Frank!
Du hast mir sehr geholfen. :-)

von Claus (Gast)


Lesenswert?

Hallo Zusammen,

beschäftige mich auch gerade mit diesem Phänomen,
eine kurze Frage, kann man die 200ms irgendwie
umgehen? Ändert vielleicht ein MMC Modus etwas?

Vielen Dank & Viele Grüße
Claus

von holger (Gast)


Lesenswert?

>beschäftige mich auch gerade mit diesem Phänomen,
>eine kurze Frage, kann man die 200ms irgendwie
>umgehen?

Mit viel RAM als Zwischenpuffer: JA.
Ohne: NEIN.

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.