noch einige Fragen zu Elm chans Fat:
Ich habe eine Datei mit 300k Byte angelegt.
Anfangssektor ist 339792
Die link-table sagt 74 Cluster hintereinander + Startcluster 38669.
Ich gehe davon aus, dass der Sektor ohne Offset von Beginn der Karte
zählt?
Wie ist das mit den Clustern? Ich nehme an, 8 Sektoren ergeben einen
Cluster. Woher kommt dann der Offset von den Clustern gegenüber den
Sektoren? Woher weiß man bei fragmentierten Dateien, mit welchem Sektor
eines Clusters anzufangen ist?
sector ist bei Chan ein 32bit-Wert. Wie wird der 33bit-Bereich der Karte
angesprochen?
Grundschüler schrieb:> noch einige Fragen zu Elm chans Fat:
Das ist schon das erste grundlegende Problem, was du hast: Es ist nicht
Elm chans FAT. Sondern das von Microsoft. Elm hat's bloß implementiert.
Zum tausendsten(?) Mal.
> Ich gehe davon aus, dass der Sektor ohne Offset von Beginn der Karte> zählt?
Schon falsch. Gerechnet wird vom Beginn der Partition (sofern es eine
gibt, was der Normalfall ist). Nur wenn die Karte als "Superfloppy"
formatiert ist, stimmt der Nullpunkt der Kartenadresse mit dem Nullpunkt
des Filesystems überein.
> Wie ist das mit den Clustern? Ich nehme an, 8 Sektoren ergeben einen> Cluster.
Nur dann, wenn das entsprechende Feld des Headers das so sagt. Das ist
ein variabler Wert. Nichtmal für eine Karte konstanter Größe zwingend
konstant. Man kann es durch Neu"formatieren" ändern.
> Woher kommt dann der Offset von den Clustern gegenüber den> Sektoren?
Partitionierung. Das Filesystem beginnt einfach nicht am physikalischen
Beginn des Mediums.
> Woher weiß man bei fragmentierten Dateien, mit welchem Sektor> eines Clusters anzufangen ist?
Immer beim ersten. Genau das ist doch die Idee des Clustering:
Verwaltungseinheiten vergrößern, um Verwaltungsinformationen kleiner
halten zu können.
Wie wäre es, wenn du erstmal lernst, wie FAT funktioniert, bevor du dich
mit Code auseinandersetzt, der FAT implementiert?
Danke für die konstruktiven Antworten. Das Problem ist, dass ich einen
großen Teil des Grundlagenwissens außen vor lassen muss, weil ich sonst
mit meinem Code nicht weiterkomme. Es läuft viel über Versuch und
Irrtum, aber es läuft dann meist auch irgendwie. Mein Programm schreibt
inzwischen mittels DMA Blöcke an die richtige Stelle einer Datei, so
dass man die Datei anschließend mit MS-Chan-Fat-Implementierung - oder
wie auch immer das richtig bezeichnet wird - auslesen kann.
Damit ist meine Aufgabenstellung bzgl. SD+DMA im Prinzip gelöst, es muss
nur noch in das Hauptprogramm eingebunden werden.
letzte dumme Frage hierzu: Ist die Anzahl der 512Byte-Blöcke, die mit
einem cmd25 geschrieben werden können nach oben begrenzt?
@Grundschüler (Gast)
>Danke für die konstruktiven Antworten. Das Problem ist, dass ich einen>großen Teil des Grundlagenwissens außen vor lassen muss, weil ich sonst>mit meinem Code nicht weiterkomme.
:-)
Das ist der Brüller des Tages.
> Es läuft viel über Versuch und>Irrtum, aber es läuft dann meist auch irgendwie.
Aber nie solide und stabil. Eben WEIL dein Grundlagenwissen viel zu dünn
ist.
>Damit ist meine Aufgabenstellung bzgl. SD+DMA im Prinzip gelöst,
Nö. Deine Zielstellung war ja, parallel zum laufenden Programm die Daten
per DMA und INterruptsteuerung zu schreiben. Das macht dein Programm
Afaik NICHT. Was man tun muss habe ich mehrfach gesagt.
>es muss nur noch in das Hauptprogramm eingebunden werden.
Wo ist dann das Problem?
>letzte dumme Frage hierzu: Ist die Anzahl der 512Byte-Blöcke, die mit>einem cmd25 geschrieben werden können nach oben begrenzt?
Keine Ahnung, AFAIK setzt FatFs eine Grenze bei 128 Sektoren. OB die
SD-Karten mehr können weiß ich nicht.
Falk Brunner schrieb:> Nö. Deine Zielstellung war ja, parallel zum laufenden Programm die Daten> per DMA und INterruptsteuerung zu schreiben. Das macht dein Programm> Afaik NICHT. Was man tun muss habe ich mehrfach gesagt.
???????
macht es doch, Schreibvorgang läuft im Hintergrund, nur per DMA +
Interrupt. Getestet mit 20k Daten. Problemlos und fehlerfrei. Ziel sind
600k Daten.
do
{tmp=xchg_spi(0xFf);
buf_rx[10+x]=tmp;
x++;
}
while(tmp!=255);
Diesen Teil habe ich noch nicht auf DMA umgestellt, weil nennenswerte
Wartezeiten bislang nicht aufgetreten sind.
Ein einzelner Aufruf von tmp=xchg_spi(0xFf) ist kürzer als der Aufruf
der DMA
Sollte es hier zu mehreren Schleifendurchläufen kommen, wird auch dies
durch per DMA ausgelagert.