Forum: Mikrocontroller und Digitale Elektronik SD Karte - RAW Speicherbereich unterteilen


von Adam P. (adamap)


Lesenswert?

Morgen zusammen.

Ich suche eine elegante Art, mein Speicherbereich (aus sicht der 
Firmware) zu unterteilen. Die Daten werden ohne Dateisystem gespeichert 
und das funktioniert bis jetzt ohne Probleme.

Die bisherige Unterteilung war recht simpel per defines realisiert.
Am Anfang ein wenig Platz für FW Daten und Update, danach reiner 
Datenspeicher.
1
// 2 MB / (0 - 4095) / PG Daten und sonstiges
2
#define MEM_PG_STUFF          (0x00000000u)
3
#define MEM_PG_STUFF_SIZE     (0x00200000u)
4
5
// 2 MB / (4096 - 8191) / Firmware Update
6
#define MEM_PG_FW             (MEM_PG_STUFF + MEM_PG_STUFF_SIZE)
7
#define MEM_PG_FW_SIZE        (0x00200000u)
8
9
/* ... */
10
11
// 16 MB / Größe des "System"-Speicherbereiches
12
#define MEM_SYS_MEM_SIZE      (MEM_LOG + MEM_LOG_SIZE)
13
14
// Ab Page 32768 / Datenbereich, für Messungen etc.
15
#define MEM_DATA              (MEM_SYS_MEM_SIZE)
16
17
#define ADDR_TO_PAGE(addr)    (addr / 512)

Das funktioniert zwar, jedoch habe ich mich gefragt ob man das nicht 
irgendwie anders machen kann...
Vielleicht mit const Struktur, die die Definitionen enthält?
Mir fällt gerade nichts elegantes ein.
Wichtige Infos wären:
- Beginn vom Speicherbereich
- Größe vom Speicherbereich
- Belegter / freier Speicherbereich
- ...?

Bin für jede Idee offen, auf Dateisysteme sollte jedoch verzichtet 
werden.

Gruß

von Falk B. (falk)


Lesenswert?

Adam P. schrieb:
> Ich suche eine elegante Art, mein Speicherbereich (aus sicht der
> Firmware) zu unterteilen. Die Daten werden ohne Dateisystem gespeichert

Warum? Das ist in den allermeisten Fällen nicht sinnvoll. Es gibt 
mehrere, überaus stabile und leistungsfähige Dateisysteme, u.a. das 
bekannte FATfs von ELM Chan.

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

Das kann ich überaus empfehlen. Damit ist der Dateizugriff spielend 
leicht und leistungsfähig. Und die Daten sind auf jedem PC oder 
sonstigen Gerät les- und schreibbar. Außerdem muss man sich nicht mit 
dem Low Level Kram quälen.

>Bin für jede Idee offen, auf Dateisysteme sollte jedoch verzichtet
>werden.

Warum? Denkst du, das wird besser, einfacher, schneller?
Wie willst du die Daten auf die SD-Karte bekommen? Mit einem HEX-Editor? 
Spezialsoftware?

von Adam P. (adamap)


Lesenswert?

Falk B. schrieb:
> Es gibt
> mehrere, überaus stabile und leistungsfähige Dateisysteme, u.a. das
> bekannte FATfs von ELM Chan.

Falk B. schrieb:
> Und die Daten sind auf jedem PC oder
> sonstigen Gerät les- und schreibbar. Außerdem muss man sich nicht mit
> dem Low Level Kram quälen.

Falk B. schrieb:
> Wie willst du die Daten auf die SD-Karte bekommen? Mit einem HEX-Editor?

Das schreiben der Messdaten ohne Dateisystem ist historisch bedingt.
Die SD Karte ist fix verbaut und soll gar nicht vom PC direkt 
gelesen/beschrieben werden können.
Die Daten werden per USB ausgelesen und von einer Software 
interpretiert.

Ich weiß leider nicht wie perfomant die FATfs vom ELM Chan ist.
Im moment fallen ca. 176Byte / ms an und werden per DMA weggeschrieben.
Der Umbau des Systems würde wohl nicht ganz so weinfach werden.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Bei SD Karten wurde das FAT Dateisystem zur Pflicht gemacht. 
Dementsprechend garantieren deren Hersteller das Korrekte Funktionieren 
des Wear Leveling nur mit FAT, welches wiederum einen erheblichen 
Enfluss auf Performance und Lebensdauer der Karte hat. Ich habe noch 
keine SD Karte gesehen, wo andere Dateisysteme (oder keins) ausdrücklich 
zugelassen sind.

Achtung: Für SDXC Karten ist das Dateisystem exFat vorgeschrieben.

von Falk B. (falk)


Lesenswert?

Adam P. schrieb:
> Ich weiß leider nicht wie perfomant die FATfs vom ELM Chan ist.
> Im moment fallen ca. 176Byte / ms an und werden per DMA weggeschrieben.

Hmm, das sind immerhin 176kB/s. Das ist für eine SD-Karte zwar absolut 
Peanuts, aber man muss beachten, daß die sich beim Schreiben ab und an 
einige HUNDERT Millisekunden Pause gönnt, ja nach Modell! Diese Zeit 
mußt du mit einem FIFO puffern. Bei meinen Experimenten vor gefühlt 
100 Jahren waren das um die 300ms, teilweise etwas mehr. Hast du 
genügend RAM, um das zu puffern?

> Der Umbau des Systems würde wohl nicht ganz so weinfach werden.

Glaub ich nicht so recht, ist aber egal. Naja, deine Datenmengen sind 
schon recht groß, das kann man zwar auch mit seriellem FLASH machen, der 
hat definierte Scheibzugriffszeiten, aber bei 16MB und mehr wird das 
größer und teurer als ne SD-Karte. Vielleicht kann man die Wartepausen 
beim Schreiben genauer ausmessen und vielleicht sind die bei den eher 
kleinen Datenmengen auf KONSTANTEN Sektoradressen auch kleiner. Wer 
weiß.

von Falk B. (falk)


Lesenswert?


: Bearbeitet durch User
von Adam P. (adamap)


Lesenswert?

Also das Speichern funktioniert super, dass ist ja auch nicht das 
Problem.

Nach langem ausprobieren von 0815 Karten, verwenden wir nun die
Cactus 32GB
https://www.cactus-tech.com/products/commercial-grade/microsd/

Zusätzlich habe ich 3x 2048K Buffer die das Puffern übernehmen.
Dabei bin ich noch nie an einen Punkt gekommen, wo die Karte mal zu 
lange gebraucht hätte (wie du bereits sagtest, einige Karten sind da 
echt schlimm).

Mir ging es eher um eine Möglichkeit den Zugriff und den Code eleganter 
zu strukturieren.

: Bearbeitet durch User
von Hannes (Gast)


Lesenswert?

Adam P. schrieb:
> Ich suche eine elegante Art, mein Speicherbereich (aus sicht der
> Firmware) zu unterteilen. Die Daten werden ohne Dateisystem gespeichert
> und das funktioniert bis jetzt ohne Probleme.
>
> Die bisherige Unterteilung war recht simpel per defines realisiert.
> Am Anfang ein wenig Platz für FW Daten und Update, danach reiner
> Datenspeicher.
> // 2 MB / (0 - 4095) / PG Daten und sonstiges
> #define MEM_PG_STUFF          (0x00000000u)
> #define MEM_PG_STUFF_SIZE     (0x00200000u)
> // 2 MB / (4096 - 8191) / Firmware Update
> #define MEM_PG_FW             (MEM_PG_STUFF + MEM_PG_STUFF_SIZE)
> #define MEM_PG_FW_SIZE        (0x00200000u)
> /* ... */

Was Du dir da bastelst, ist ein rudimentäres Filesystem, halt mit der 
Hand am Arm, irgendwie eine Art "das Rad neu erfinden" ...

Kann man mach, würde ich mir aber sehr gut überlegen.

Was, wenn es die SD-Karte nicht mehr tut, was anderes her muss? Was, 
wenn Scheffe plötzlich die Karte auswerfbar haben will? Was, wenn die 
Kartenhersteller auf ein FS beharren?

Wieso willst du den ganzen Low-Level-Kram über deine ganze Firmware 
gleichmäßig verteilen? Lesbarer und wartungsfreundlicher wird es dadurch 
nicht.

just my 2ct

von Falk B. (falk)


Lesenswert?

Adam P. schrieb:
> Mir ging es eher um eine Möglichkeit den Zugriff und den Code eleganter
> zu strukturieren.

Du willst ein eigenes, einfaches Filesytem erstellen. Hmmm.
FAT arbeitet mit einfach verketteten Listen. Man kann sich auch diverse 
schlanke Implementierungen der Speicherverwaltung in der libc anschauen, 
da wird ja auch sowas ähnliches verwaltet. Und auch dort müssen Blöcke 
gelöscht und fusioniert werden, wenn man seinen Speicher nicht endlos 
fragmentieren will. Da bieten sich Arrays mit passenden structs an.

Kann man alles machen. Ob das sinnvoll ist, bleibt fraglich. Ich hätte 
beim Thema wear leveling die größten Bedenken. Wie das genau läuft und 
ob es schlau genug ist, ohne FAT die logischen Sektoren auf möglichst 
viele physische Sektoren aufzuteilen, bleibt fraglich. Wieviele 
Schreibzugriffe erfolgen denn voraussichtlich auf einen Datenblock 
während der Lebensdauer deines Geräts?

von Frank K. (fchk)


Lesenswert?

Adam P. schrieb:

> Mir ging es eher um eine Möglichkeit den Zugriff und den Code eleganter
> zu strukturieren.

GPT-Partitionen existieren, und Du kannst Dir auch eigene 
Partitionstypen definieren, wenn Du unbedingt musst. Damit würden fremde 
Betriebssysteme wissen, dass die Karte benutzt wird.

fchk

von Adam P. (adamap)


Lesenswert?

Hannes schrieb:
> Was Du dir da bastelst, ist ein rudimentäres Filesystem, halt mit der
> Hand am Arm, irgendwie eine Art "das Rad neu erfinden" ...

Dieser Aufbau (Prinzip) ist schon seit locker >10 Jahren so.
Vorher war es MMC, dann NAND, nun SD.
Wie gesagt, historisch bedingt. Gewisse Logik steckt auch in der PC 
Software.

Ich will es irgendwie anders machen, aber auch nicht alles über den 
Haufen werfen... würde so auch nicht eben mal möglich sein.

Falk B. schrieb:
> Und auch dort müssen Blöcke
> gelöscht und fusioniert werden, wenn man seinen Speicher nicht endlos
> fragmentieren will.

Der Datenbereich wird für jede neue Messung gelöscht.
Eine Fragmentierung findet nicht statt.

Falk B. schrieb:
> Wieviele
> Schreibzugriffe erfolgen denn voraussichtlich auf einen Datenblock
> während der Lebensdauer deines Geräts?

1 Messung je Tag, Datenmenge von ca 80MB - 2GB (je nach Samplingrate).

von Stefan F. (Gast)


Lesenswert?

Adam P. schrieb:
> Der Datenbereich wird für jede neue Messung gelöscht.

Wenn du das ohne Wear Levelling machst, ist die Karte nach 20 Messungen 
verschlissen.

von Adam P. (adamap)


Lesenswert?

Frank K. schrieb:
> GPT-Partitionen existieren, und Du kannst Dir auch eigene
> Partitionstypen definieren, wenn Du unbedingt musst.

Ja sowas in der Art als Definition in der FW.
Also das die Table fix ist und nicht irgendwo auf der SD Karte liegt.

von Adam P. (adamap)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wenn du das ohne Wear Levelling machst, ist die Karte nach 20 Messungen
> verschlissen.

Dann frage ich mich jedoch, warum die Geräte mit SD Karte seit 3 Jahren 
im Feld ohne Probleme funktionieren.

Aber ja, ich weiß was du meinst.

edit:
Meinst nicht das die Karte soviel Logik intern hat, dass sie das selbst 
regelt?

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Adam P. schrieb:
> Meinst nicht das die Karte soviel Logik intern hat,
> dass sie das selbst regelt?

Das ist ja gerade die Frage, die dir hier niemand beantworten kann. 
Frage den oder die Hersteller.

Garantiert ist die ordnungsgemäße Funktion wie gesagt nur mit FAT 
Dateisystem. Das steht sogar bei vielen Karten auf dem Beipackzettel, 
meist in Form von "Do not re-format this card" oder ähnlich.

von Falk B. (falk)


Lesenswert?

Stefan ⛄ F. schrieb:
>> Der Datenbereich wird für jede neue Messung gelöscht.
>
> Wenn du das ohne Wear Levelling machst, ist die Karte nach 20 Messungen
> verschlissen.

Häää? Wieso das denn? Die Flash-Zellen in diesen Speichern haben so um 
die 10.000 Schreib/Lösch Zyklen.

von Falk B. (falk)


Lesenswert?

Adam P. schrieb:
> Der Datenbereich wird für jede neue Messung gelöscht.
> Eine Fragmentierung findet nicht statt.
>
> Falk B. schrieb:
>> Wieviele
>> Schreibzugriffe erfolgen denn voraussichtlich auf einen Datenblock
>> während der Lebensdauer deines Geräts?
>
> 1 Messung je Tag, Datenmenge von ca 80MB - 2GB (je nach Samplingrate).

Wozu brauchst du dann ein Dateisystem? Du hast doch nur 1 Datei. Oder 
wird nur einmal pro Tag eine Messung gemacht und damit 1 Datei erstellt, 
aber das über viele Tage, bevor der Speicher ausgelesen und gelöscht 
wird? Aber auch dann ist es einfach. Anfangsadresse + Länge definieren 
einen Datenblock eindeutig. Das als Array of structs, fertig.

von Adam P. (adamap)


Lesenswert?

Falk B. schrieb:
> Wozu brauchst du dann ein Dateisystem? Du hast doch nur 1 Datei. Oder
> wird nur einmal pro Tag eine Messung gemacht und damit 1 Datei erstellt,
> aber das über viele Tage, bevor der Speicher ausgelesen und gelöscht
> wird? Aber auch dann ist es einfach. Anfangsadresse + Länge definieren
> einen Datenblock eindeutig. Das als Array of structs, fertig.

Genau darum geht es ja.
Im Moment sind es eine oder mehrere Messungen die hintereinander liegen.
Dafür braucht man kein Dateisystem.
Nun soll aber ein Datenbereich für andere Messdaten geschafen werden, 
die gleichzeitig anfallen, aber nicht in den bestehenden "Stream" 
eingeschleust werden können.
Das ist auch kein Hexenwerk, ich überlege lediglich ob es nicht etwas 
besseres gibt als das mit defines aufzuteilen.
Das ist manchmal recht Fehleranfällig, wenn man in dem Bereich etwas 
erweitert oder umschreibt.

von Adam P. (adamap)


Lesenswert?

Stefan ⛄ F. schrieb:
> Garantiert ist die ordnungsgemäße Funktion wie gesagt nur mit FAT
> Dateisystem. Das steht sogar bei vielen Karten auf dem Beipackzettel,
> meist in Form von "Do not re-format this card" oder ähnlich.

Bei unserer stand nichts dergleichen, aber die Anfrage ist rauß.
Bin gespannt was ich an Infos zurückbekomme.

von Stefan F. (Gast)


Lesenswert?

Dann lege halt 2 große Dateien an, die später befüllt werden.

von 123 (Gast)


Lesenswert?

@Stefan Hast du eigentlich ahnung von was du da redest?
ich glaube nicht.

Eine SD Carte ist ein konstrukt aus einem SD-Flash Controller und einen 
NAND Flash baustein.

Warlaveling, ... und den ganzen kruscht macht der SD-Flash Controller.
Schlussfolgerung, egal wie du mit der SD - Karte arbeitest, das 
warleveling läuft immer mit. da das in der karte gemacht wird. ob nun 
mit oder ohne Dateisystem.

Zum Thema FAT. Ja SD Karten sollten mit FAT formatiert werden, (Damit 
sie auch in der digi cam funktionieren) ... nur es hindert dich keiner 
drann das nicht zu tun. Die kanst du sogar partitionieren wenn du 
möchtest, ... Ist halt nur die frage wie weit Windows damit kommt, 
(Windows zeigt nur die erste Partiton an ) ... unter linux funktioniert 
das alles super, sogar mit ext3, ...

Und ein RAW NAND hält je nach technologie zwischen 100.000 und 1.000 
löschzyklen aus, ... ein mal täglich löschen, sind selbst im 
schlechtesten fall 3 Jahre dauerbetrieb drin bevor die zelle den geist 
aufgibt.

von Falk B. (falk)


Lesenswert?

123 schrieb:
> Warlaveling, ... und den ganzen kruscht macht der SD-Flash Controller.
> Schlussfolgerung, egal wie du mit der SD - Karte arbeitest, das
> warleveling läuft immer mit. da das in der karte gemacht wird. ob nun
> mit oder ohne Dateisystem.

Kannst du diese Aussage beweisen?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan ⛄ F. schrieb:
> Garantiert ist die ordnungsgemäße Funktion wie gesagt nur mit FAT
> Dateisystem.

Ich glaube nicht, dass die SD-Karten irgendeine Intelligenz bzgl. 
verwendeter Dateisysteme haben. Letzlich wird auch ein FAT-Filesysterm 
mit Block-Schreibbefehlen gefüttert und auch wieder blockweise gelesen. 
Ich bin mir sicher, dass die Firmware da nichts reininterpretiert - 
warum auch? Das Wear Levelling einer SD-Karte wird auch garantiert nicht 
durch Verwendung eines uralten Dateisystems gefördert. Im Gegenteil: 
Wenn die Hersteller das Wear Leveling optimieren wollten, hätten sie 
schon längst ein Dateisystem gefordert/entwickelt, was der Verwendung 
von SD-Karten entgegenkommt.

SD-Karten funktionieren auch perfekt mit anderen Dateisystemen wie 
ext2,3,4. Ich habe da noch keine Nachteile feststellen können.

Mit der Aussage, dass FAT bzw. exFAT verwendet werden muss, wollen sich 
die Hersteller meiner Meinung nur absichern, dass ihre Karte 
größtmögliche Kompatibilität aufweist. Man steckst sie einfach in zig 
Geräte und überall funktionieren sie. Deshalb verwendet man hier den 
kleinsten gemeinsamen Nenner, welche die Geräte unterstützen. Und das 
ist halt das uralte FATFS. Das ist meiner Meinung nach die einzige 
Motivation für so eine Aussage.

Zum Thema:

Der TO will die SD-Karte lediglich in zwei Teile teilen und fragt, wie 
man das anders als über #defines organisieren kann. Jetzt dafür ein 
Dateisystem einzuführen ist wie mit Kanonen auf Spatzen schießen.

@TO: Schreibe einfach in den ersten Block der Karte einen Header, wo die 
Größenverhältnisse drinstehen. Die kannst Du dann beim Einlegen der 
Karte wieder auslesen und bist dann über die Größenverhältnisse 
informiert.

: Bearbeitet durch Moderator
von Stefan F. (Gast)


Lesenswert?

Frank M. schrieb:
> Ich glaube nicht, dass die SD-Karten irgendeine Intelligenz bzgl.
> verwendeter Dateisysteme haben.

Wie kann sie dann wissen, welcher Block belegt und welcher frei ist?

Ohne das Dateisystem zu kennen kann die Karte keinen einzigen Block 
verschieben oder tauschen. Es sei denn, sie verwendet dazu eine Mapping 
Tabelle. Davon habe ich aber noch nicht gehört.

Dass die Karten nur mit FAT sicher ordnungsgemäß funktionieren, ist aber 
allgemeiner Konsens - leider offenbar ohne jegliche Beweise. Es bleibt 
wohl für immer das Geheimnis der Hersteller.

von Falk B. (falk)


Lesenswert?

Stefan ⛄ F. schrieb:
> Frank M. schrieb:
>> Ich glaube nicht, dass die SD-Karten irgendeine Intelligenz bzgl.
>> verwendeter Dateisysteme haben.
>
> Wie kann sie dann wissen, welcher Block belegt und welcher frei ist?

Da wird ein Verwaltungssystem im Hintergrund mitlaufen, im einfachsten 
Fall ein Bit/Sektor, für gelöscht/beschrieben.

> Ohne das Dateisystem zu kennen kann die Karte keinen einzigen Block
> verschieben oder tauschen. Es sei denn, sie verwendet dazu eine Mapping
> Tabelle.

Eben.

> Davon habe ich aber noch nicht gehört.

Das ist mal sicher kein Argument ;-)

von Stefan F. (Gast)


Lesenswert?

Falk B. schrieb:
> Das ist mal sicher kein Argument

Stimmt, es ist ein sehr schwaches. Ich finde ätzend, dass kein 
Hersteller Infos dazu Preis gibt.

von Falk B. (falk)


Lesenswert?

Stefan ⛄ F. schrieb:
> Stimmt, es ist ein sehr schwaches. Ich finde ätzend, dass kein
> Hersteller Infos dazu Preis gibt.

Ich nicht. Die SD-Karten werden zu 99% mit FAT betrieben und gut. 
Außerdem steckt da ne Menge Betriebsgeheimnis dahinter.

von Klaus W. (mfgkw)


Lesenswert?

Aber es ist tatsächlich so, daß jede SDCard munter auch mit allem 
anderen als FAT funktioniert.
Ich nehme die auch regelmäßig mit ext... und anderen ohne Probleme.
Zumal FAT ja auch nicht gleich FAT ist. Da gibt es schon etliche 
Varianten, und der Controller auf der Karte sieht nur daß Blöcke gelesen 
und geschrieben werden. Daraus auf ein Dateisystem zurückzuschließen 
wäre vollkommen sinnlos.

Das einzige, was der Controller höchstens mit FAT zu tun hat, ist daß 
ein paar Parameter in den Algorithmen zum wear leveling der üblichen 
Nutzung mit FAT entgegenkommen, und ein Hersteller ansonsten einfach 
keine Aussagen zu etwas machen will, was nicht Mainstream ist.

von Falk B. (falk)


Lesenswert?

Klaus W. schrieb:
> Aber es ist tatsächlich so, daß jede SDCard munter auch mit allem
> anderen als FAT funktioniert.
> Ich nehme die auch regelmäßig mit ext... und anderen ohne Probleme.
> Zumal FAT ja auch nicht gleich FAT ist. Da gibt es schon etliche
> Varianten, und der Controller auf der Karte sieht nur daß Blöcke gelesen
> und geschrieben werden. Daraus auf ein Dateisystem zurückzuschließen
> wäre vollkommen sinnlos.

Nicht ganz. Die FAT im FAT ;-) wird deutlich öfter geschrieben als die 
normalen Datenblöcke, das muss der Controller abfangen, damit diese 
Schreibzugriffe nicht zur Schwachstelle werden. Ich würde vermuten, daß 
da schon ne Menge an Intelligenz und "Wahrsagen" in den Controllern 
steckt, um das Filesystem zu "erraten" und entsprechend zu handeln. Z.B. 
kann man mit einen Zugriffsstatistik sowas rausfinden. Oder einfach die 
Daten im MBR lesen ;-)

Beitrag #6910219 wurde von einem Moderator gelöscht.
von Klaus W. (mfgkw)


Lesenswert?

Falk B. schrieb:
> Die FAT im FAT ;-) wird deutlich öfter geschrieben

ja, klar.

Aber dazu schont/ersetzt der Controller nicht die Blöcke, auf denen er 
die FAT vermutet, sondern er zählt intern die Zugriffe (egal in welchem 
Bereich) und arbeitet mit diesen Zahlen.
Wenn man eine FAT hat, dann wird er dort entsprechend tauschen - anhand 
der gezählten Zugriffe.

Jeder Controller für SDCard und eMMC hat (herstellerspezifisch 
natürlich) diverse Funktionen, um sich solche Statistiken ausgeben zu 
lassen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan ⛄ F. schrieb:
> Ohne das Dateisystem zu kennen kann die Karte keinen einzigen Block
> verschieben oder tauschen.

Doch. Die Karte wird zusätzlich zur Mapping-Tabelle eine Statistik 
mitführen, wie oft ein Block beschrieben wurde - fertig. Dafür braucht 
man kein Filesystem.

Ja, die Hersteller rücken dazu nichts raus. Aber Wikipedia erklärt 
Wear-Leveling auch gänzlich ohne FAT:

https://en.wikipedia.org/wiki/Wear_leveling

von c-hater (Gast)


Lesenswert?

Frank M. schrieb:

> Ich glaube nicht, dass die SD-Karten irgendeine Intelligenz bzgl.
> verwendeter Dateisysteme haben.

Naja, Intelligenz kann man das sicher nicht nennen, aber Tatsache ist, 
dass sehr viele SD-Karten produziert werden, die wear leveling nur 
für den Bereich betreiben, in dem sie das RootDir und die FAT vermuten. 
Damit's nicht zu kompliziert wird und sich binär leicht aufdröseln läßt, 
ist es schlicht der Anfang der Karte mit einer auf die nächste 
Zweierpotenz aufgerundeten Größe von (Flash-)Sektoren.

Dass das so ist, läßt sich sehr leicht durch das (Nicht-)Auftreten des 
bekannten "Schluckaufs" nachweisen. So lange man bei solchen Karten nur 
auf den oberen Adressen rumschreibt, tritt der nämlich schlicht NICHT 
auf. Ganz anders, wenn man intensiv im Bereich der FAT schreibt. Dann 
tritt er auf. Sogar relativ häufig.

Damit ist zumindest sicher nachgewiesen, dass nur Schreibvorgänge auf 
den ersten (vergleichsweise sehr kleinen Teil) der Karte das 
wear-leveling triggern. Was das dann allerdings im Detail macht, kann 
man so nicht ermitteln.

Ich würde mal vermuten, dass bei diesen Karten einfach ein Flashblock 
vom Ende der Karte mit einem aus dem "FAT-Bereich" ausgetauscht wird. 
Und dass die Größe dieses Blocks sehr deutlich über einem "nativen" 
Flashsektor liegt.
So würde ich es jedenfalls machen, wenn ich Kosten optimieren und 
deswegen Spare und Verwaltungs-Storage sparen müsste...

von M.M.M (Gast)


Lesenswert?

c-hater schrieb:
> Frank M. schrieb:
>
>> Ich glaube nicht, dass die SD-Karten irgendeine Intelligenz bzgl.
>> verwendeter Dateisysteme haben.
>
> Naja, Intelligenz kann man das sicher nicht nennen, aber Tatsache ist,
> dass sehr viele SD-Karten produziert werden, die wear leveling nur
> für den Bereich betreiben, in dem sie das RootDir und die FAT vermuten.

Was für ein Stuss.

> Dass das so ist, läßt sich sehr leicht durch das (Nicht-)Auftreten des
> bekannten "Schluckaufs" nachweisen. So lange man bei solchen Karten nur
> auf den oberen Adressen rumschreibt, tritt der nämlich schlicht NICHT
> auf. Ganz anders, wenn man intensiv im Bereich der FAT schreibt. Dann
> tritt er auf. Sogar relativ häufig.
>
> Damit ist zumindest sicher nachgewiesen, dass nur Schreibvorgänge auf

Aua.

von Jobst M. (jobstens-de)


Lesenswert?

Stefan ⛄ F. schrieb:
> Bei SD Karten wurde das FAT Dateisystem zur Pflicht gemacht.

Jepp. Und Partitionen sind auch nicht erlaubt.

Benutzen sie die Spraydose ganau nach Anleitung! Sonst werden Sie 
verhaftet!

Beim RaspberryPi wird beides nicht eingehalten.

Für mich ist's ein Blockdevice. Wie eine Festplatte oder ein USB-Stick.

Das die FW in der Karte schon das Dateisystem verfolgt, um heraus zu 
bekommen, welche Speicherbereiche belegt und welche frei sind, ist 
eigentlich zwingend. Dennoch sind die Medien gut genug um mehr als die 
genannten 20 Schreibvorgänge auch mit anderen FS oder gar ohne, 
durchzuhalten. Viel mehr!
Und welche Dateisysteme wirklich von Herstellern unterstützt werden ist 
ja auch nicht bekannt.

Gruß
Jobst

von c-hater (Gast)


Lesenswert?

Jobst M. schrieb:

> Beim RaspberryPi wird beides nicht eingehalten.

Wohl auch deswegen ist er der Liebling der SD-Karten-Hersteller. Nix 
kurbelt den Markt so sehr an, wie die von Pi's kaputtgeschriebenen 
SD-Karten...

von Stefan F. (Gast)


Lesenswert?

Jobst M. schrieb:
> Beim RaspberryPi wird beides nicht eingehalten.

Ja. Und jetzt rate mal, wo die Leute ganz besonders oft über frühzeitig 
verschlissene SD Karten berichten. Oder warum die Raspberry Pi 
Foundation extra ausgewählte Karten für ihre Boards anbietet.

In der normalen Bevölkerung ist so gut wie niemandem klar, dass SD 
Karten nicht ewig halten. Aber die Raspberry Pi Besitzer wissen es fast 
alle. Ist das nicht auffällig?

von Jobst M. (jobstens-de)


Lesenswert?

c-hater schrieb:
> Wohl auch deswegen ist er der Liebling der SD-Karten-Hersteller. Nix
> kurbelt den Markt so sehr an, wie die von Pi's kaputtgeschriebenen
> SD-Karten...

Ja, das war mal so. In letzter Zeit hatte ich aber keine mehr.
Entweder wird der Speicher immer besser oder das Wear Levelling ist 
mittlerweile auch bei ext angekommen.
Oder es liegt einfach an der Größe, da nun mehr Blöcke alternativ zur 
Verfügung stehen.

Die fehlende gewollte Partitionierungsmöglichkeit unterstützt die FAT 
Theorie. Denn so befindet sich die FAT immer in einem Bereich.

Gruß
Jobst

von Jobst M. (jobstens-de)


Lesenswert?

Stefan ⛄ F. schrieb:
> In der normalen Bevölkerung ist so gut wie niemandem klar, dass SD
> Karten nicht ewig halten.

Wer das glaubt, ist naiv. Unabhängig vom Raspi.
Auch Festplatten (Achtung: kein Wear Levelling! ;) gehen kaputt.
Scheinen aber auch viele zu ignorieren, dass das so ist.

Gruß
Jobst

von Stefan F. (Gast)


Lesenswert?

Jobst M. schrieb:
> Wer das glaubt, ist naiv.

Und unerfahren. Nur wenige Menschen hatten kaputte SD Karten in der 
Hand.

Außer halt bei den Raspberry Pi Besitzern, da ist der Anteil ungleich 
höher. Das kann am Dateisystem liegen, oder auch an stärkerer Nutzung. 
Wahrscheinlich ist die Kombination aus beidem relevant.

Immerhin gibt es lange Listen mit SD Karten die im Raspberry Pi gut oder 
schlecht arbeiten. Bei vielen einigen steht sogar der Vermerk, dass sie 
nur mit FAT32 funktionieren.

Dies ist eine dieser Listen: https://elinux.org/RPi_SD_cards

von Jobst M. (jobstens-de)


Lesenswert?

Adam P. schrieb:
> Das funktioniert zwar, jedoch habe ich mich gefragt ob man das nicht
> irgendwie anders machen kann...

Du könntest vorne Deine Daten für FW und Update wie gehabt speichern, 
aber die reinen Daten von hinten beginnend nach vorne schreiben.
Die Grenzen "Anfang" und "Ende" sind Dir sowieso vorgegeben.

Wenn sich beide Bereiche treffen, dann hast Du die nächste Grenze 
erreicht: Kein Platz mehr.

Ich habe Speicherkarten, die mittlerweile einige hundert Male komplett 
neu beschrieben wurden und immernoch laufen. Die ganze Wear 
Leveling-Geschichte ist bei Medien die einmal komplett nur in eine 
Richtung beschrieben werden sowieso hinfällig.

Gruß
Jobst

von c-hater (Gast)


Lesenswert?

Jobst M. schrieb:

> Ja, das war mal so. In letzter Zeit hatte ich aber keine mehr.

Dann bist du vermutlich schlicht etwas klüger geworden und kaufst nicht 
mehr den Billig-Schrott.

> Entweder wird der Speicher immer besser oder das Wear Levelling ist
> mittlerweile auch bei ext angekommen.

Nein, nicht "mittlerweile". Es gab schon immer auch SD-Karten, die das 
richtig gemacht haben. Nur waren die halt auch schon immer etwas 
teuerer. Wobei "etwas" auch gern mal "deutlich" bedeuten konnte...

> Die fehlende gewollte Partitionierungsmöglichkeit unterstützt die FAT
> Theorie. Denn so befindet sich die FAT immer in einem Bereich.

Ganz genau so ist das. Und deswegen wird dies natürlich im 
Billich-Sektor auch gnadenlos ausgenutzt.

Das Schöne an diesem Schluckauf-Test ist: er ist sehr einfach zu 
implementieren und zeigt das Elend schon lange, bevor die Karte 
tatsächlich kaputt geht. Ich habe mir übrigens nicht mal die Mühe 
gemacht, tatsächlich ein Programm dafür zu schreiben, ich mißbrauche 
ddrescue im Kontext eines kleinen Batchs für diesen Zweck, das bietet 
alle nötigen Features für diesen einfachen Test.

Wenn man also rauskriegt, dass so eine Karte zur Kategorie der 
Scheiß-Karten gehört, formatiert man sie einfach wieder auf den 
ursprünglichen Standard und gibt sie zurück oder benutzt sie "normal". 
Wichtiger ist: Man kauft nie wieder von dieser "Marke" (in 
Anführungszeichen weil: oft gefälscht) oder dem Anbieter.

von M.M.M (Gast)


Lesenswert?

Jobst M. schrieb:
> Entweder wird der Speicher immer besser oder das Wear Levelling ist
> mittlerweile auch bei ext angekommen.

Wear Levelling ist bei "Markenherstellern" gefühlt ne Ewigkeit Sandard. 
Ich zitiere mich mal selbst aus 
Beitrag "Re: SD Karte shutdown" Ist gerade mal 2 
Monate her, daß ich das schrieb:

>Ernstzunehmende Hersteller haben das Feature schon seit gefühlt einer
>Ewigkeit. Datenblätter für SD-Karten sind ja eher selten, daher aus
>einem allgemeinen Dokument von Sandisk aus 2010!: "Wear leveling is an
>intrinsic part of the erase pooling functionality of cards in the
>SanDisk microSD Card Product Family using NAND memory."

Stefan ⛄ F. schrieb:
> Außer halt bei den Raspberry Pi Besitzern, da ist der Anteil ungleich
> höher. Das kann am Dateisystem liegen, oder auch an stärkerer Nutzung.
> Wahrscheinlich ist die Kombination aus beidem relevant.

Das liegt regelmäßig daran, daß die falschen Karten oder zu kleine 
Karten oder Karten aus fragwürdiger Quelle bzw. fragwürdiger "Brand" 
usw. usf. in Verbindung mit intensiver Nutzung der Karten verwendet 
werden. Mit anderen Worten: Man spart am falschen Ende.

von M.M.M (Gast)


Lesenswert?

Frank M. schrieb:
> Doch. Die Karte wird zusätzlich zur Mapping-Tabelle eine Statistik
> mitführen, wie oft ein Block beschrieben wurde - fertig. Dafür braucht
> man kein Filesystem.
>
> Ja, die Hersteller rücken dazu nichts raus. Aber Wikipedia erklärt
> Wear-Leveling auch gänzlich ohne FAT:

Doch, natürlich "rücken" die Hersteller zum Thema was raus. Man müßte 
die Info halt mal lesen. Alle Hersteller von SD-Karten außerhalb des 
Consumer-Bereiches geben in ihren Datenblättern (die es sehr wohl gibt) 
die TBW bzw. in Stunden Daueraufnahme für Videos an:

Exemplarisch mal für eine "WD Purple SC QD101" mit 64GB bis zu 32TBW. 
Das geht ohne entsprechendes Wear-Levelling überhaupt nicht. Und so ne 
Karte kostet im WD-Onlineshop, also einer hoffentlich hinreichend 
sicheren Quelle um keine gefälschten Karten zu bekommen, gerade mal 15€. 
Ähnlich sieht's für SanDisk High Endurance, SanDisk Max Endurance, 
Samsung Pro Endurance usw. aus.

von Adam P. (adamap)


Lesenswert?

Auch wenn es ein wenig in Richtung FAT Diskussion ausgeartet ist ;)
danke euch allen für die Vorschläge.

Frank M. schrieb:
> @TO: Schreibe einfach in den ersten Block der Karte einen Header, wo die
> Größenverhältnisse drinstehen. Die kannst Du dann beim Einlegen der
> Karte wieder auslesen und bist dann über die Größenverhältnisse
> informiert.

Das habe ich auch schon überlegt.
Das wäre die Entscheidung, ob ich die Struktur (Aufteilung) fix in die 
FW schreibe oder ob ich es auf die SD auslager.
Dies würde jedoch wieder die Gefahr mit sich bringt, dass wenn die erste 
Page mal weg ist, alle Infos fehlen.
Da sich der Aufbau eigentlich nicht ändert, würde es für die FW Version 
sprechen.

Jobst M. schrieb:
> Du könntest vorne Deine Daten für FW und Update wie gehabt speichern,
> aber die reinen Daten von hinten beginnend nach vorne schreiben.
> Die Grenzen "Anfang" und "Ende" sind Dir sowieso vorgegeben.

Den Ansatz hatte ich auch schon im Kopf, jedoch so, dass sich der 
Datenbereich 1 von unten nach oben bewegt und der Datenbereich 2 von 
oben nach unten.
Warum? Mir ist zwar bekannt, dass der Datenbereich 2 langsamer und mit 
weniger Daten befüllt wird, aber eine richtige Aussage treffen in 
welchem % Verhätnis man diese aufteilen sollte ist nicht so leicht.

Ich werde die Ideen mal mit aufnehmen und noch ein wenig weiter grübeln.

Danke.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Adam P. schrieb:
> Da sich der Aufbau eigentlich nicht ändert, würde es für die FW Version
> sprechen.

Wenn er sich nicht ändert, lass ihn wie es ist. Es spricht dann nichts 
gegen ein #define. Der Thread ist dann allerdings auch nutzlos.

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.