SD-Card FAT16 Schreibproblem bei vollen Clustern

Gast #5378889
Lesenswert?

Hallo,

im Thread 
Beitrag "Re: MMC SD library FAT16 FAT32 read write"
wurde erwähnt, dass es bei der behandelten SD-Karten Lib ein Problem 
gibt beim schreiben auf die SD-Karte wenn gerade vorher ein Cluster voll 
ist. Das Problem habe ich jetzt auch. Ist der Cluster voll so kann ich 
zwar lesen und auch wenn ich am PC die karte weiter beschreibe (denn 
vollen Cluster praktisch überspringe) kann ich über MCU auch wieder 
weiter schreiben. Nur wenn man mit der MCU direkt nach einem vollen 
Cluster schreiben möchte klappt es nicht.

Hat irgendjemand dieses Problem gelöst? Leider wurde der Thread nicht 
mehr gepflegt und ist etwas in Vergessenheit geraten.
Gast #5378935
Lesenswert?

Leider habe ich die lib schon vor zwei Jahren implementiert und bin sehr 
zufrieden. Nur nun wird die Datei in die geschrieben wird so groß dass 
es zum Problem kommt. Jeder Datensatz ist 107 Byte lang daher kommt das 
Problem jetzt bei 32768 Sätzen. Der nächste kann nicht geschrieben 
werden.
Gast #5378983
Lesenswert?

Habe folgende Code im oberen genannten Thread gelesen welcher wohl 
zunächst erfolg brachte dann aber wohl nicht. Leider wurde es nicht 
weiter erörtert.
1
while( offset >= 512 ){
2
    sectors += 1;
3
    offset -= 512;
4
    file.seek += 512;   
5
            
6
    if(offset > 0)
7
    {
8
      chain.cntSecs -= 1;
9
    }
10
    
11
    if ( chain.cntSecs == 0 ){
12
      fat_getFatChainClustersInRow(fat_getNextCluster( chain.lastCluster ));
13
      sectors = chain.startSectors;
14
    }
15
  }

Hat jemand einen Hinweis?
#5378999
Lesenswert?

@ Peter (Gast)

>Leider habe ich die lib schon vor zwei Jahren implementiert und bin sehr
>zufrieden. Nur nun wird die Datei in die geschrieben wird so groß dass
>es zum Problem kommt. Jeder Datensatz ist 107 Byte lang daher kommt das
>roblem jetzt bei 32768 Sätzen. Der nächste kann nicht geschrieben
>werden.

Vielleicht liegt der Fehler nicht in der FAT Lib sondern bei deiner 
anderen Software?
#5379058
Lesenswert?

Peter schrieb:
> Jeder Datensatz ist 107 Byte lang daher kommt das
> Problem jetzt bei 32768 Sätzen. Der nächste kann nicht geschrieben
> werden.

Bei genau 32768*107 Bytes? Du hast eher einen (16-Bit) Integer Überlauf 
im Code, eine "int" Zählvariable kann nur 32767 Sätze addressieren.

Anders ausgedrückt: Zeig uns Deinen Code.
Gast #5379222
Lesenswert?

Jim M. schrieb:
> Bei genau 32768*107 Bytes? Du hast eher einen (16-Bit) Integer Überlauf
> im Code, eine "int" Zählvariable kann nur 32767 Sätze addressieren.
>
> Anders ausgedrückt: Zeig uns Deinen Code.

Als Code verwende ich die oben erwähnte lib und diese wird mit ffwrites 
zum beschreiben einer Sd-Karte verwendet!
Gast #5379531
Lesenswert?

> Jeder Datensatz ist 107 Byte lang daher kommt das
> Problem jetzt bei 32768 Sätzen.

Das liesst sich so als wenn du den Fehler einfach so reproduzieren 
kannst. Warum machst du das nicht und geht einmal im Debugger im 
Singlestep durch dein Programm. Dann musst du nicht labern, raten und 
hoffen sondern weisst genau woran es liegt. Das scheint mir schneller 
zum Ziel zu fuehren als hier zu fragen.

Olaf
Gast #5379627
Lesenswert?

Danke für die teilweisen netten Antworten :P Labern gehört nicht dazu 
Olaf :P

Das Problem ist gefunden.
Wenn ein Cluster gerade voll ist wird ein neuer Angefangen. Wenn jedoch 
dann keine Daten zu schreiben sind wurde der neue Cluster verworfen um 
diesen nicht Sinnlos zu blockieren. Das habe ich nun entfernt und fülle 
den neuen Cluster mit Nullen und hänge diesen an die Datei an. Somit 
weiß die SD nun beim nächsten beschreiben wo es weiter geht.
#5379724
Lesenswert?

@Peter (Gast)

>Das Beschreiben mit Hex 0X00 ist kein Unsinn

Aber sicher. Denn der Inhalt von Sektoren/Clustern JENSEITS der 
Dateilänge ist undefiniert. Und er spielt auch keine Rolle, weil man 
dort über solide FAT Libs so oder so NICHT rankommt.

>sondern laut SD-Card Tutorial empfohlen

Welches denn? Mal ganz abgesehen davon, daß du damit deine Sektoren 
doppelt beschreibst bzw. löschst. Das halbiert die statistische 
Lebensdauer und kostet DOPPELTE Schreibzeit, sprich, deine effektive 
Schreibgeschwindigkeit halbiert sich. Prost Mahlzeit!

Der schnellste und PREISWERTESTE Weg etwas zu tun, ist es gleich richtig 
zu tun. Andere Libs können das auch.
#5379746
Lesenswert?

>Wenn ein Cluster gerade voll ist wird ein neuer Angefangen.

Das scheint mir falsch zu sein. Ein neuer Cluster wird IMO nur angelegt, 
wenn mindestens 1 Byte geschrieben werden muss. Sprich, wenn beim 
Schreibvorgang ein Sektor voll ist, aber noch Restdaten vorhanden sind 
und diese einen neuen Sektor im neuen Cluster erfordern. Wenn aber das 
letzte Byte eines Schreibzugriffs im letzten Bytes das aktuellen 
Clusters beim Schreiben Platz hat, wirdn nur dieser Sektor geschrieben, 
DANACH muss vorerst kein neuer Cluster angefordert werden! Erst beim 
nächsten Schreibzugriff.
#5379755
Lesenswert?

>im Prinzip ist das so

Aber halt nicht im Detail in der Praxis.

>ja nur leider greift die Karte bzw. Lib dann
>daneben.

Deine Lib. Die Karte macht es schon richtig.

>Aus dem Grund hänge ich direkt den nächsten Cluster ran.

Ist auch nur ein Workaround. Damit verschwendet jede Datei mindestens 
einen ganzen Cluster, je nach Länge.
(Firma: Vescomp) #5380237
Lesenswert?

Peter schrieb:
> Das Problem ist gefunden.
> Wenn ein Cluster gerade voll ist wird ein neuer Angefangen. Wenn jedoch
> dann keine Daten zu schreiben sind wurde der neue Cluster verworfen um
> diesen nicht Sinnlos zu blockieren. Das habe ich nun entfernt und fülle
> den neuen Cluster mit Nullen und hänge diesen an die Datei an. Somit
> weiß die SD nun beim nächsten beschreiben wo es weiter geht.

 Das ist kein Problem, das ist ein Fehler in der Lib.

 Ein neuer Cluster wird nur dann angefangen, wenn der vorherige voll ist
 und noch weitere Daten anstehen, sonst nicht.
 Besetzte Cluster werden als solche in der FAT vermerkt, somit braucht
 eine Datei mit Cluster + 1Byt Länge 2 Cluster.
 Aber die genaue Dateilänge wird im DIR-Eintrag reingeschrieben, somit
 ist deine Behauptung das irgendwelche Cluster angehängt und dann
 verworfen werden müssen, doch Blödsinn.
 Ein Cluster wird entweder angefangen oder nicht.
 Bereitgestellt weil der vorherige voll ist - das gibt es bestimmt
 nicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren