Forum: Mikrocontroller und Digitale Elektronik Wie ist die Lage einer TEXT-Datei auf einer frisch formatierten SD-Karte?


von Niels K. (niels-k)


Lesenswert?

Der Betreff beeinhaltet im Grunde bereits die Frage:

Ich habe gerade meinen Bildlogger 
(Beitrag "IQP 500 GSM Bildübertragung Tonerätzverfahren") auf SD-Kartenbetrieb 
umgestellt. Dafür habe ich eine Mini-SD-Karte verwendet. Diese kann auch 
problemlos betrieben werden. Ich habe mir anfangs ein eigenes 
Dateisystem entwickelt, bei welchem neben Name, Zeit, Größe, Lage auch 
die Position in einer seperaten TOC hinterlegt werden können. Ich ging 
davon aus, dass das "besonders clever" ist - leider zu kurz gedacht. Auf 
dem uC ist das prima speicherschonend und auch richtig schnell. Aber 
sobald ich die Daten (also die Bilder) über die serielle Schnittstelle 
übertragen möchte - und das sind dann schnell einige MB - kann ich 
warten und warten und warten. Da ist einfach kein Durchsatz möglich.

Daher meine Idee (oder irgendwo gelesen) anstatt eines FAT-Dateisystems 
die SD-Karte mit Windows zu formatieren und nur eine einzige Textdatei 
darauf abzulegen. Da ich es bisher nicht getestet habe, würde es mich 
interessieren, ob diese Datei immer an der selben Stelle (Sektoren) 
liegt, wie man die Längen und Lageangabe manipulieren kann (oder ob das 
überhaupt notwendig ist (Thema Fragmentbildung))?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Nee... das ist nicht "anstatt" sondern das ist FAT. Du legst eine 
einzige Datei an, welche so groß ist wie deine SD Karte. Dann suchst du 
per Hand den Anfang der Datei (z.B. mit einem Hex/Disk Editor) und 
merkst dir diesen im Programm. Dein Programm kann nun von diesem Sektor 
beginnend in die Datei reinschreiben und trotzdem ist die (große) Datei 
per PC lesbar.
Seriell übertragen geht mit Baudratenquarz aber doch auch recht fix? 
ggf. ein USB/Seriellwandler von FTDI mit parallel Eingang?

von Niels K. (niels-k)


Lesenswert?

Stimmt - das ist der springende Punkt - einfach die Datei groß genug 
machen. Danke für den Tip.

Ja, habe einen Schnittstellenquarz drinne. Da die Verbindung aber immer 
noch über einen Softwareuart läuft, bekomme ich nur bis zu 57,6kbit/s 
fehlerfreie Datensätze. Also fehlerfrei bedeutet hier auf 11MByte drei 
gekippte Bits.

von MagIO (Gast)


Lesenswert?

Das mit der Datei funktioniert soweit ganz gut. Bei einer leeren 
SD-Karte wird diese Datei immer ab dem ersten Cluster beginnen. Welcher 
Sektor das ist hängt von der Clustergröße ab, da diese dann auch 
bestimmt wie groß die Cluster-Tabelle sein muss.

Ich habe einfach im Treiber (der FAT funktionen enthält) ein wenig 
rumgefummelt. Das öffnen einer Datei liefert mir dann den ersten Sektor 
dieser Datei zurück. Von da an benutze ich die Datei nur noch per 
Sektor-Addressen.
Das hat den Vorteil, dass man auf die SD-Karte auch noch andere Dateien 
packen kann. (Ich habe z.B. 3 solcher riesen-Dateien für Sektor-Zugriff 
und noch Programm-Images und andere Text-Dateien).

Fragmentierung tritt nur dann auf, wenn man eine Datei vergrößert und 
direkt hinter der Datei der Platz schon von einer anderen Datei belegt 
ist, oder beim löschen von Dateien mit anschließendem wiederbeschreiben 
z.B. durch kleinere Dateien.

von Olaf (Gast)


Lesenswert?

Ich mache das so das ich auch eine grosse Datei auf einer leeren Karte 
kopiere damit die nicht fragmentiert ist. Aber ich nutze den ersten 
Sektor von 512Bytes dieser Datei nicht fuer meine Daten.
In diesem ersten Sektor habe ich eine Magicnumber stehen. So kann der 
Controller die Datei auf der Karte selber finden und es funktioniert 
auch mit unterschiedlichen Karten. Und es ist auch egal ob die Karten 
partioniert sind oder als superfloppy formatiert wurden.

Und die restlichen Bytes dieses ersten Sektor kann man dann noch fuer 
ein paar Verwaltungsinformationen nutzen. Da steht dann z.B drin 
wieviele der Bytes der grossen Datei nun mit Daten belegt sind.

Also sozusagen ein kleines Primitivfilesystem in einer Datei. Wichtig 
ist nur das automatische erkennen.

Das schoene an dieser Loesung ist dann auch das man auf der PC-Seite mit 
ganz normalen Filezugriffen darauf zugreifen kann. Und man kann so eine 
Datendatei auch mal einfach irgendwohin kopieren!

Olaf

von Wolfgang-G (Gast)


Lesenswert?

>In diesem ersten Sektor habe ich eine Magicnumber stehen.

Muss mal fragen: Was ist eine Magicnumber?
MfG

von Troll B. (blaubeer)


Lesenswert?

Joa, Kinnings, datt wird wohl eineh Zaubärzoahl sein.

MfG Blaubär

von Robert F. (fastred)


Lesenswert?

Wolfgang-G schrieb:
> Muss mal fragen: Was ist eine Magicnumber?

@ Wolfgang:
http://en.wikipedia.org/wiki/Magic_number_%28programming%29

von MaWin (Gast)


Lesenswert?

Die Frage ist nicht, wo die Datei steht,
sondern wie dein Gerät die SD-Karte so beschreibt,
das ein Windows sie als EXAKTE kund KORREKTE Speicherkarte sieht.

Das ist nicht schwer, du schriebst neben der Datei auch einen 
Boot-Sektor (Partitionheader), die FAT und das Stammverzeichnis mit 
raus, das sind ja immer dieselben, also konstante Daten.


Siehe:
http://dse-faq.elektronik-kompendium.de/dse-faq.htm#F.7.6

von Niels K. (niels-k)


Lesenswert?

Vielen Dank für die vielen guten Informationen. Meine jetztige Idee ist 
die Folgende: Ich lese die SD-Karte im Kartenlesegerät des PCs. Dazu 
verwende ich ein Programm, das ich gerade in Delphi geschrieben habe 
(hätte ich auch früher drauf kommen können...). Das Ganze geht sehr fix 
und ich kann das selbst entwickelte Dateisystem auf dem uC behalten. Ich 
bin bisher eben davon ausgegangen, dass man ein nicht formatiertes 
Laufwerk nicht am PC auslesen kann - aber Programme wie HXDde machen das 
ja schließlich auch - nur da stört mich am Rand die Sektorbezeichnung, 
die immer mit abgespeichert wird. In diesem Sinne nochmals meine 
Danksagung an alle Ideengeber...

von Laszlo H. (mobius)


Lesenswert?

Du kannst auch das Programm dd verwenden um direkt die Daten von der 
Karte in eine Datei zu lesen. In Linux ist das ja keine Hexerei und das 
Programm gibt es auch für Windows (siehe http://www.chrysocome.net/dd 
mit Beispielen für lese-operationen).

gruß
Mobius

von Niels K. (niels-k)


Lesenswert?

Nachtrag: Die selbst zusammengeschriebene Software liest die SD-Karte 
mit akzeptablen 0,24 Mbit/s aus und generiert auch gleich die 
entsprechenden Bilddaten. Die limitierende Größe scheint aber am 
Programm selbst zu liegen, da es keine fertigen Routinen verwendet und 
daher recht viel zu berechnen hat.

von Stefan A. (aige)


Lesenswert?

Niels Keller schrieb:
> ...einfach die Datei groß genug machen...

Sorry für die dumme Frage: Einfach irgendeine große Datei nehmen und auf 
die Karte kopieren?
zB ne .txt Datei mit irgendwelchen Zeichen auffüllen bis sie gewünschte 
Größe erreicht ist? Oder geht da zB auch, was weis ich, irgend ne 
x-beliebige zB 100MB große Datei? Ist normal egal oder?

Gruß Aige

von Hannes L. (hannes)


Lesenswert?

Stefan A. schrieb:
> Niels Keller schrieb:
>> ...einfach die Datei groß genug machen...
>
> Sorry für die dumme Frage: Einfach irgendeine große Datei nehmen und auf
> die Karte kopieren?
> zB ne .txt Datei mit irgendwelchen Zeichen auffüllen bis sie gewünschte
> Größe erreicht ist? Oder geht da zB auch, was weis ich, irgend ne
> x-beliebige zB 100MB große Datei? Ist normal egal oder?

Naja, Du solltest schon wissen, was in der Datei drin ist, damit Du die 
betreffenden Sektoren auch wieder findest, wenn Du ohne Dateisystem 
darauf zugreifen willst. Ich hab's zwar noch nicht gemacht, aber ich 
würde den ersten Sektor mit einer Kennung versehen und den Rest mit $FF 
auffüllen.

>
> Gruß Aige

von Stefan A. (aige)


Lesenswert?

ok danke

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.