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.
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.
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?
@ 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?
Da das weiter schreiben klappt würde ich eher auf die FAT Lib tippen
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.
Dachte zunächst auch an eine falsch große Variable aber warum gehen dann weiter größere Datensätze?
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!
> 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
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.
@ Peter (Gast) >diesen nicht Sinnlos zu blockieren. Das habe ich nun entfernt und fülle >den neuen Cluster mit Nullen Was soll der Unsinn? >und hänge diesen an die Datei an. Das schon eher.
@Falk Das Beschreiben mit Hex 0X00 ist kein Unsinn sondern laut SD-Card Tutorial empfohlen
@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.
@Falk, klingt logisch! Werde es ohne die Nullen einfach noch einmal probieren.
>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.
@Falk im Prinzip ist das so ja nur leider greift die Karte bzw. Lib dann daneben. Aus dem Grund hänge ich direkt den nächsten Cluster ran.
Mir ist bewusst, dass ich im Prnzip ein Cluster Sinnlos blockiere jedoch ist das bei meiner Anwendung unkritisch.
>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.
Der schnellste und PREISWERTESTE Weg etwas zu tun, ist es gleich richtig zu tun. Andere Libs können das auch. Suche und behebe den Fehler. Es wird dir nicht schaden, im Gegenteil!
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.
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.