Hallo, ich möchte ein Projekt beginnen wo eine SD-Karte beschrieben und gelesen wird. Klar es gibt genug Bibliotheken aber ich wollte gerne den Code so anpassen das er perfekt auf meine Bedürfnisse passt. Bevor ich nun ein Bibliothek wo weite anpasse wollte ich gerne von vorne selber anfangen. Ich habe mit C eine .exe programmiert um Dateien von einer SD-Karte auszulesen und mir ist auch bekannt wie die Ordnung auf einer SD-Karte gehalten wird. Nun aber zu meiner Frage: Wenn ich eine Datei erstelle muss ja ein Parameter hinterlegt werden wo die Datei beginnt. Muss ich dieses Parameter selber beschreiben sprich vorher prüfen wo platz für den Inhalt der Datei ist oder mach es die Sd-Karte intern selber? Wenn ich eine Datei schreibe und mehr als 512 byte beschreibe wird ja eine zweite Seite aufgeschlagen. Nun wird ja in der FAT festgehalten wo Seite 2 usw. zu finden sind. Muss man und er FAT Selber die Pfade angeben oder macht die SD-Karte das intern selber? Also reicht es einfach auf die SD Karte zu schreiben mit Angabe von Adresse und Daten oder muss ich manuell auch eintragen von wo bis wo die Datei zu finden ist? Danke für eure Hilfe schonmal im voraus und frohe Weihnachten euch allen :)
@ Peter (Gast) >ich möchte ein Projekt beginnen wo eine SD-Karte beschrieben und gelesen >wird. Einfach. > Klar es gibt genug Bibliotheken Nutze sie. >aber ich wollte gerne den Code so >anpassen das er perfekt auf meine Bedürfnisse passt. Perfektionist? https://de.wikipedia.org/wiki/Perfektionismus_%28Psychologie%29 >Bevor ich nun ein >Bibliothek wo weite anpasse wollte ich gerne von vorne selber anfangen. Ob das so sinnvoll ist, das Rad immer wieder neu zu erfinden? >Ich habe mit C eine .exe programmiert um Dateien von einer SD-Karte >auszulesen Auf dem PC? >und mir ist auch bekannt wie die Ordnung auf einer SD-Karte >gehalten wird. Nennt sich FAT. >Wenn ich eine Datei erstelle muss ja ein Parameter hinterlegt werden wo >die Datei beginnt. Nö, darum kümmert sich die Bibliothek, so man denn eine benutzt. > Muss ich dieses Parameter selber beschreiben sprich >vorher prüfen wo platz für den Inhalt der Datei ist oder mach es die >Sd-Karte intern selber? Und du willst uns erzählen, du wüßtest wie auf einer SD-Karte Ordung gehalten wird? Das bezweifle ich mal ;-) >Wenn ich eine Datei schreibe und mehr als 512 byte beschreibe wird ja >eine zweite Seite aufgeschlagen. Nun wird ja in der FAT festgehalten wo >Seite 2 usw. zu finden sind. Muss man und er FAT Selber die Pfade >angeben oder macht die SD-Karte das intern selber? ;-) Eine SD-Karte kann nur einzelen Pages a 512 Bytes beschreiben und lesen. Was in den Pages steht, interessiert die SD-Karte nicht. Darum muss der "Anwender" sich kümmern. Sinnvollerweise überläßt man das der FAT-Lib seiner Wahl. >Also reicht es einfach auf die SD Karte zu schreiben mit Angabe von >Adresse und Daten oder muss ich manuell auch eintragen von wo bis wo die >Datei zu finden ist? Logisch. Und warum meinst du nun immer noch, daß du eine Bibliothek "perfekt" an deine Anforderungen anpassen zu müssen? Worin sind deine Anforderungen so besonders, als daß sie die meisten Libs nicht erfüllen könnten?
die Karte macht überhaupt nichts selber. Du musst du alles machen. Du musst dafür sorgen, das ein gültiges Dateisystem vorhanden ist, auch das die Einträge in der FAT alle richtig sind. (Sofern du ein FAT-Dateisystem verwendest).
Danke so weit. Dann war ja meine Vermutung ganz richtig und ich muss alles vorgeben. Warum ich keine Bibliothek verwenden möchte? Viele geben die Eins vor wo angeschlossen wird. Ich möchte gerne selber entscheiden welche meiner SPI Schnittstellen verwendet wird. Auch möchte ich selber festlegen wie viele Daten auf einmal ausgelesen werden z.b. und ich möchte gerne wissen was mein Programm da macht und nicht macht. Gerade wenn es um die Fehlersuche geht finde ich es sehr nützlich ;) Im Prinzip dachte ich daran ganz von FAT 16 oder ähnlichem weg zugehen und ein eigenes Format zu nutzen. Zwar kann man dann die Karte nicht am PC auslesen aber das will ich ja auch nicht :) Aber ich könnte den Aufbau einfacher erhalten oder?
@ Peter (Gast) >Warum ich keine Bibliothek verwenden möchte? >Viele geben die Eins vor wo angeschlossen wird. Quark. Das ist frei einstellbar. >Ich möchte gerne selber >entscheiden welche meiner SPI Schnittstellen verwendet wird. Das kannst du. > Auch möchte >ich selber festlegen wie viele Daten auf einmal ausgelesen werden Daran hindert dich keiner. >z.b. >und ich möchte gerne wissen was mein Programm da macht und nicht macht. >Gerade wenn es um die Fehlersuche geht finde ich es sehr nützlich ;) Unsinn. Eine gescheite Lib ist gut bis sehr gut getestet. Da muss und WILL man die internen Dinge gar nicht wissen! >Im Prinzip dachte ich daran ganz von FAT 16 oder ähnlichem weg zugehen >und ein eigenes Format zu nutzen. Zwar kann man dann die Karte nicht am >PC auslesen aber das will ich ja auch nicht :) Aber ich könnte den >Aufbau einfacher erhalten oder? Sag doch einfach. Ich will frickeln weil ich denke schlauer zu sein als der Rest der Welt. Mach mal, viel Spaß.
Peter schrieb: > und ein eigenes Format zu nutzen. Die SD Spezifikation schreibt die Nutzung von FAT16/FAT32/exFAT (bei SDSC/SDHC/SDXC) vor. Wenn du das nicht verwendest, ist das Betrieb außerhalb der Spezifikation. Das kann funktionieren, muss aber nicht, insbesondere nicht mit der angegebenen Geschwindigkeit und Haltbarkeit. Peter schrieb: > Viele geben die Eins vor wo angeschlossen wird. Ich möchte gerne selber > entscheiden welche meiner SPI Schnittstellen verwendet wird. Das kannst du bei fertigen Libraries Problemlos einstellen. Wegen dieser winzigen Änderung eine eigene Library zu erstellen ist sinnlos. Lies mal die SD Spezifikation anstatt hier aufs geratewohl rumzufragen. Das musst du zur Implementierung deiner eigenen Library sowieso tun. Vielleicht vergeht dir angesichts der Komplexität dann doch die Lust an der Eigenentwicklung...
Peter schrieb:
> Zwar kann man dann die Karte nicht am PC auslesen
Das ist durchaus möglich, und für die ersten Gehversuche u.U. recht
nützlich; ich verwende 'Win32 Disk Imager', es gibt sicher noch andere.
Auch Librarys die schon fertig sind kann man bearbeiten. Das geht übrigens auch mit Arduino..<gd&r>
:
Bearbeitet durch User
Welche Lib würdet ihr dann empfehlen wo man all diese Sachen selber anpassen kann? Habe mir ElmChan's angesehen aber die ist ja auch sehr komplex und habe nicht wirklich den Punkt gefunden wo man z.b. die Eins vorgeben kann. Würde mich hier gerne über Hilfe freuen. Ach und sehe mich nicht schlauer als der Rest der Welt aber das gemachte Nest war nie ganz so meins. Aber bin bereit ein zusehen wenn eine andere Lösung mit gleichen Ziel bequemer ist :)
>>und ich möchte gerne wissen was mein Programm da macht und nicht macht. >>Gerade wenn es um die Fehlersuche geht finde ich es sehr nützlich ;) > > Unsinn. Eine gescheite Lib ist gut bis sehr gut getestet. Da muss und > WILL man die internen Dinge gar nicht wissen! und wenn doch: es hindert einen keiner, die vorhandene Lib zu analysieren, wie das alles funktioniert. Das hat dann auch den grossen Vorteil, dass man etwas lernt, dass man die Lib intern kennt und somit auch Anpassungen vornehmen kann, so es denn unbedingt sein muss. > PC auslesen aber das will ich ja auch nicht :) Aber ich könnte den > Aufbau einfacher erhalten oder? Das bezweifle ich. Gerade FAT16 ist an Einfachheit eigentlich kaum noch zu schlagen. Es gibt * ein Inhaltsverzeichns. Logisch, das muss es geben. Denn woher soll man denn sonst wissen, wo welche Datei residiert und auf welchen Blöcken in welcher Reihenfolge die Daten gespeichert sind * einen Mechanismus mit dem man feststellen kann, welche Blöcke belegt sind und welche nicht. Auch das ist logisch, denn wenn auf ein Datei geschrieben werden soll, dann muss ich ja wissen, wo ich auf der Karte schreiben kann ohne das ich bestehende Daten zerstöre * und die Daten selber, gespeichert in Form von Datenblöcken auf der Karte.
Peter schrieb: > Welche Lib würdet ihr dann empfehlen wo man all diese Sachen selber > anpassen kann? Habe mir ElmChan's angesehen aber die ist ja auch sehr > komplex und habe nicht wirklich den Punkt gefunden wo man z.b. die Eins > vorgeben kann. Welche 'Eins'? Du meinst den SPI Anschluss. Dann stöbere mal weiter im Code. Irgendwo wird es zentrale SPI Routinen geben. Ist ja schliesslich keine Raketentechnik. Zum Beispiel würde eine Codesuche quer über den ganzen Code mit dem Stichwort 'SPI' höchst wahrscheinlich auch die SPI Funktionen finden. Dort ist dann dein Anpasspunkt, um das SPI entweder per Hardware machen zu lassen (wenn dein µmC das kann) oder mittels Software-SPI jede beliebige Pinkombination zu benutzen. > Ach und sehe mich nicht schlauer als der Rest der Welt aber das gemachte > Nest war nie ganz so meins. Dann musst du was dagegen tun. Soweit schon richtig. Aber: Wenn ich aus dem was du schreibst und wie du es schreibst extrapolieren darf, dann stellst du dir das alles einfacher vor als es ist. Es reicht eben nicht, mit for und if-"Schleifen" umgehen zu können, wenn man eine hinreichend komplexe Sache programmieren will. Ein Dateisystem ist sicherlich nicht Raketentechnik, aber so komplex ist es auch wieder nicht. Vor allen Dingen dann nicht, wenn die Anforderungen nicht so wahsinnig hoch gestellt werden. Aber für einen Anfänger, der mit Datenstrukturen auf Kriegsfuss steht, ist das nichts. Dein Anfangsposting zeigt, dass du da rechlich naiv an die Sache rangehst. Eine SD Karte ist eine riesige Halle mit haufenweise Schachteln. In jeder Schachtel kannst du 512 Bytes ablegen. Es ist jetzt deine Aufgabe ein Sytsem zu finden, mit dem die Ordnung in die Schachteln bringst, jederzeit weisst, was in welcher Schachtel abgelegt ist und welche Schachteln eigentlich zu einer Serie gehören und wie diese Serie heisst und in welche Schachtel du die nächsten 512 Bytes reingeben kannst, weil sie frei ist. Und das ganze so, dass diese Ordnung ebenfalls in den Schachtel dokumentiert ist. Denn es gibt unbegrenzt viele derartige Hallen und du musst dich nur mit dem zurecht finden, was du in den Schachteln vorfindest. Und das möglichst schnell und wenn geht auch dann noch, wenn eine der Schachteln feucht wurde und auseinanderfällt. Das ist der Job, den es zu bewältigen gilt.
:
Bearbeitet durch User
Peter schrieb: > Im Prinzip dachte ich daran ganz von FAT 16 oder ähnlichem weg zugehen > und ein eigenes Format zu nutzen. Wer hindert Dich daran? Peter schrieb: > Aber bin bereit ein zusehen wenn eine andere > Lösung mit gleichen Ziel bequemer ist :) Äh ... Peter schrieb: > Habe mir ElmChan's angesehen aber die ist ja auch sehr > komplex und habe nicht wirklich den Punkt gefunden wo man z.b. die Eins > vorgeben kann. Wenn ich alles so zusammenzähle -> Troll
Was die Struktur angeht habe ich ein gutes Tutorial durchgearbeitet. Darum bin ich auch der Meinung es hinzubekommen die Struktur selber einzuhalten. Ich denke ich werde mir Elm Chan's FatFs ansehen und durcharbeiten und anpassen so dass es genau das macht was ich mir wüsche. Da sollte ich auf jedenfalls heraus finden wie wo was geschrieben oder gelesen wird. Diese Befehle kann ich ja dann selber stück für stück testen und sehen was passiert. Gute oder schlechte Idee? Hat jemand Erfahrung mit dieser Lib?
Danke Dieter für deine Ausführungen :D Troll hihi klar als Bill Gates damals anfing meinten auch alle der sei verrückt :D Und wo sitzen wir jetzt davor? Dieser Troll ;)
Peter schrieb: > Was die Struktur angeht habe ich ein gutes Tutorial durchgearbeitet. > Darum bin ich auch der Meinung es hinzubekommen die Struktur selber > einzuhalten. Ich denke ich werde mir Elm Chan's FatFs ansehen und > durcharbeiten und anpassen so dass es genau das macht was ich mir > wüsche. Da sollte ich auf jedenfalls heraus finden wie wo was > geschrieben oder gelesen wird. Das ist ganz einfach. Denn Elm Chan hat ja dokumentiert, wie sein System Lay aussehen muss
1 | Device Control Interface |
2 | |
3 | Since the FatFs module is a file system layer, it is completely separated |
4 | from the physical devices, such as memory card, harddisk and any type of |
5 | storage devices. FatFs accesses the storage devices via a simple interface |
6 | shown below. The low level device control module is not a part of FatFs |
7 | module. It is provided by implementer. Also sample implementations for some |
8 | platforms are available in the downloads. |
9 | |
10 | disk_status - Get device status |
11 | disk_initialize - Initialize device |
12 | disk_read - Read sector(s) |
13 | disk_write - Write sector(s) |
14 | disk_ioctl - Control device dependent features |
15 | get_fattime - Get current time |
Das sind also die Funktionen, die jemand der die Elm Chan Lib benutzen will, für seine Hardware schreiben muss. Dort findet dann auch logischerweise die Anpassnung an deine Hardware statt. Wenn von den Treibern, die Elm Chan zur Verfügung stellt, einer prinzipiell passt, dann ist das auch die Stelle an der du deine Hardware Änderungen einfliessen lässt bzw. wo die den vorhandenen Treiber anpasst. Wenn es keinen passenden gibt, dann musst du eben einen schreiben. Die Funktionen sind ja ausführlich dokumentiert, was sie zu tun haben. Für jemanden der ein komplettes Filesystem selber schreiben will, sollte das eigentlich ein Kinderspiel sein.
Peter schrieb: > :D Troll hihi klar als Bill Gates > damals anfing meinten auch alle der sei verrückt Was wird das? Ein verkapptes Gallileo Gambit? Bill Gates hatte dir gegenüber einen riesigen Vorteil. Er konnte etwas. Und nein, keiner meinte er wäre verrückt. Denn die Leute mit denen er zu tun hatte, sahen ja, dass der Junge gut drauf war, wusste wovon er spricht und das auch mit funktionierendem Code belegen kann. Und eines ist sicher: Gates brauchte kein Forum, damit die ihm sagen wies geht. Er hat es einfach gemacht! Nur was du nicht siehst, das sind die Jahre an Lernzeit, die durchgearbeiteten Nächte, die zehntausend vollgekritzelten Schmierzettel, die verschlissenen Bücher und der vergossene Schweiss, damit er in diese Liga kam.
:
Bearbeitet durch User
@ Peter (Gast) >Welche Lib würdet ihr dann empfehlen wo man all diese Sachen selber >anpassen kann? Habe mir ElmChan's angesehen Die ist TOP! >aber die ist ja auch sehr >komplex und habe nicht wirklich den Punkt gefunden wo man z.b. die Eins >vorgeben kann. Nö, das ist eher einfach. Beitrag "Re: Elm Chan FatFs SD Karte auf Keil MCB2300 LCP2378" >Ach und sehe mich nicht schlauer als der Rest der Welt aber das gemachte >Nest war nie ganz so meins. Aber bin bereit ein zusehen wenn eine andere >Lösung mit gleichen Ziel bequemer ist :) Wenn man aus reinem Spaß an der Freud eine FAT Lib selber schreiben will, OK. Aber die allermeisten Leute wollen sie nur benutzen, um etwas vollkommen anderes zu erreichen.
Peter schrieb: > Troll hihi klar als Bill Gates > damals anfing meinten auch alle der sei verrückt :D Und wo sitzen wir > jetzt davor? Dieser Troll ;) Wenn Du nicht anonym unterwegs wärst würde ich mir vielleicht Deinen Namen merken - aber bei dem, was Du hier ablieferst lohnt sich das nicht. Der Vergleich ist um Dimensionen zu hoch gegriffen :-) -> Troll³
Bill Gates hat vor allen Dingen viel bei der Fa. " Digital Research" abgeguckt.... um es mal vornehm auszudrücken.... und dann der Fa. IBM als PC-DOS verkauft...
@Peter Ein ähnliches Konzept wie es Peter vorschwebt wurde früher bei der Programmiersprache FORTH angewendet: Dort wurden Daten (vom sogenannten Frame Stack) als fixe Blöcke (512 Bytes ?) auf externen Datenträgern in durchnummerierten Blöcken abgelegt. Ein Block konnten dann mit dem Befehl load(x) oder write(x) auf den Datenträger geschrieben oder gelesen werden (z.B.) Floppy des C64. Mit der Arduino SD Library lässt sich dasselbe anstellen. Mit den Befehlen #include <SDCARD.h> und SDCARD.readblock(sector number); //read 512 bytes from this sector SDCARD.writeblock(sector number); //write 512 bytes to this sector Blöcke irgendwo auf der SD-Karte lesen bw. schreiben. Wie Peter erwähnt, ist eine SD-Karte hardwaremässig in Sektoren à 512 Byte eingeteilt, eine SD-Karte hat dann 65536 Sektoren. Bei der üblichen Verwendung einer SD-Karte mit FAT16 ist sie so eingeteilt: Sektor 0 MBR und Partition Sektor 1 Boot Sektor Sektoren (xx) FAT Anschliessend folgen die Sektoren mit den Daten. Man kann SD Karte natürlich beliebig beschreiben, sie ist dann jedoch auf einem PC mit dem File Manager unlesbar. Dazu braucht man dann einen Hex Editor wie HDX. Links: http://forum.arduino.cc/index.php?topic=52871.0 http://codeandlife.com/2012/04/02/simple-fat-and-sd-tutorial-part-1/
> Man kann SD Karte natürlich beliebig beschreiben, sie ist > dann jedoch auf einem PC mit dem File Manager unlesbar. Sollte man aber nicht tun, weil dadurch die Haltbarkeit und Performance der Karte drastisch reduziert werden können. SD Karten sind ausschließlich für FAT Filesysteme spezifiziert. Die Karte muss das Filesystem "verstehen" um freie Blöcke zu erkennen und Daten so zu verteilen, dass alle Speicherzellen gleichmäßig verschleissen. Bei meinen SD Karten stand sogar im Beipackzettel, dass die Garantie erlischt, wenn man sie anders formatiert, als sie geliefert wurden.
Stefan U. schrieb: > Sollte man aber nicht tun, weil dadurch die Haltbarkeit und Performance > der Karte drastisch reduziert werden können. SD Karten sind > ausschließlich für FAT Filesysteme spezifiziert. Die Karte muss das > Filesystem "verstehen" um freie Blöcke zu erkennen und Daten so zu > verteilen, dass alle Speicherzellen gleichmäßig verschleissen. wobei das auch nicht ganz sein kann. Wenn man die Karte randvoll macht. Und immer nur ein Inhalt von Dateien ändert, darf sie auch nicht gleich Kaputt gehen. Dabei muss sie auch Sektoren umsortieren.
Stefan U. schrieb: > Sollte man aber nicht tun, weil dadurch die Haltbarkeit und Performance > der Karte drastisch reduziert werden können. SD Karten sind > ausschließlich für FAT Filesysteme spezifiziert. Die Karte muss das > Filesystem "verstehen" um freie Blöcke zu erkennen und Daten so zu > verteilen, dass alle Speicherzellen gleichmäßig verschleissen. Der Part mit "spezifiziert" ist OK. Der Rest fällt unter "Urban Legends". Meine Raspberrys usw. bevorzugen andere Filesysteme und keine der SD-Cards ist explodiert.
crami schrieb: > Wie Peter erwähnt, ist eine SD-Karte hardwaremässig in Sektoren à 512 > Byte eingeteilt, eine SD-Karte hat dann 65536 Sektore Das sind 32 MByte. So kleine SD Karten gab es IIRC nie, das wären dann eher MMC Karten als Vorläufer. Die wären dann übrigens mit FAT12 formatiert... crami schrieb: > Bei der üblichen Verwendung einer SD-Karte mit FAT16 ist sie so > eingeteilt: > > Sektor 0 MBR und Partition > Sektor 1 Boot Sektor > [...] Völliger Blödsinn. MBR ist Sektor 0, aber aber die Partition beginnt praktisch immer erst ein paar Sektoren später. Die Aufteilung ist wegen der Page Größen - 1 MByte bei moderneren SD und 4 MByte bei SDHC - wesentlich komplizierter: Die FAT beginnt auf Page 1 (also 1 oder 4 MByte Offset) und die Daten dann auf Page 2. Die Cluster (32KB) sind so aufgeteilt dass es keine Cluster gibt die über Page Grenzen gehen - sonst müssten beim Schreiben dieser Cluster 2 Pages angefasst werden. Darum sollte man es auch vermeiden, SD Karten mit Windows Boardmitteln zu formatiern. Auf 'ner Windoof Kiste sieht man als Laufwerk übrigens nur die 1. Partition, was immer mal für Verwirrung sorgt.
:
Bearbeitet durch User
> Das sind 32 MByte. So kleine SD Karten gab es IIRC nie
Ich habe eine 64MB Karte.
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.