Mein MSP430 schreibt über das FAT-System (zu finden bei Google über "sham176") Textdateien auf eine microSD. Soweit funktioniert alles. Manchmal aber sind nach der Messung mehrere Dateien auf der Karte, die alle denselben Namen (+ Endung) haben, aber unterschiedliche Größe. Der Inhalt ist bei allen Dateien identisch und man kann sie auch alle öffnen. Wenn ich eine der Dateien lösche, kommt die übliche Windows-Abfrage, die man mit Ja bestätigen muss. Ist diese erste Datei gelöscht, kommt die Abfrage erneut, bis alle Duplikate der Datei weg sind. Hat jemand ne Idee, was hier vorliegt?
Guest schrieb: > FAT-Tabelle fehlerhaft Hab ich mir auch gedacht. Und wie passiert sowas? Das ist ja nur ab und zu. Ist es ein Formatierungsproblem (nach vielen Schreibaktionen ohne Formatierung von Windows), oder liegt es am µC?
Dein Verzeichnis ist fehlerhaft, bzw. Deine Routine zum Anlegen neuer Dateien prüft nicht, ob die betreffende Datei schon existiert, und legt weitere Verzeichniseinträge gleichen Namens an.
Könnte es sein, dass im uC mehrere Tasks auf das Filesystem zugreifen? Sprich: - Läuft irgendein Task-Scheduler auf Deinem uC? - Falls ja: Hat mehr als ein Task Zugriff auf Dein FAT-System? - Falls ja: Ist Dein FAT-System reentrant? - Falls nein: Hast Du eine eigene Zugriffskontrolle (Mutex) gemacht, so dass nie zwei Tasks gleichzeitig Zugriff auf die FAT haben? Das ist, was mir spontan dazu einfällt. Gruäss Simon
Dateinamen werden nicht in der FAT, sondern im Verzeichnis gespeichert - und genau das wird fehlerhaft sein.
Die Datei wird nur einmal zu Beginn geöffnet und anschließend beschrieben. Die zum-Schreiben-öffnen-Funktion gab ursprünglich beim Vorhandensein einer Datei einen Fehler zurück und hat dann nichts mehr gemacht. Das habe ich geändert. Führt das zu Fehlern, wenn eine Datei schon vorhanden ist? Aber es passeirt auch, wenn ich davor am PC alle Dateien lösche.
Mark M. schrieb: > Die zum-Schreiben-öffnen-Funktion gab ursprünglich beim Vorhandensein > einer Datei einen Fehler zurück und hat dann nichts mehr gemacht. Das > habe ich geändert. Tja bloss wie hast Du es geändert? Richtig wäre daß entweder ein Fehler kommt oder die alte Datei überschrieben wird, je nach deinem Gusto. Du wirst es so geändert haben, daß eine 2. gleichen Namens angelegt wird.
U.R. Schmitt schrieb: > Tja bloss wie hast Du es geändert? Richtig wäre daß entweder ein Fehler > kommt oder die alte Datei überschrieben wird, je nach deinem Gusto. > Du wirst es so geändert haben, daß eine 2. gleichen Namens angelegt > wird. Meine Änderungen dafür sind unten im Kommentar angegeben, ich habe einfach die Zeile ersetzt, in der -2 für eine schon existierende Datei zurückgegeben wird (siehe Block A). Dann ist mich aber noch eine andere Frage aufgekommen: Macht es Sinn, eine -1 zurückzugeben, wenn der pathname invalid ist? So wie ich das sehe, kommt die -1 zurück, wenn cluster == 0 ist. Da aber cluster = fileSys gesetzt wird, welches global nur 0 oder 1 sein kann, ist cluster nach erfolgreicher FAT-Initialisierung immer 1. Und cluster hat schon gar nichts mit pathname zu tun. Stattdessen wird bei einem ungültigen Pathname - nämlich, wenn mehr als ein Backslash vorkommt, die -128 zurückgegeben. Sollte die -1 nicht dort stehen?
1 | #define UNKNOWN 0
|
2 | #define FAT16 1
|
3 | |
4 | /**
|
5 | * opens the file indicated by the input path name. If the pathname
|
6 | * points to a valid path, the file is created and added to the list of
|
7 | * currently opened files for writing and the unique file handle is returned.
|
8 | *
|
9 | * @param pathname a pointer to the location of the file to be opened
|
10 | *
|
11 | * @return -1 invalid pathname
|
12 | * @return -2 file already exist
|
13 | * @return -3 file already opened for writing
|
14 | * @return -4 no directory entries left
|
15 | * @return -10 no handles available
|
16 | * @return -20 memory card error
|
17 | * @return -128 other error
|
18 | * @return (non-negative) file handle of sucessfully opened file
|
19 | **/
|
20 | signed char fat_openWrite(const char *pathname) |
21 | {
|
22 | unsigned char buf[SECTOR_SIZE]; |
23 | const char *tempPathname; |
24 | unsigned long cluster; |
25 | unsigned long tempCluster; |
26 | unsigned long fileSize = 0; |
27 | signed char i = 0; |
28 | signed char index = -1; |
29 | |
30 | if(detectCard() == FALSE) |
31 | {
|
32 | return -20; |
33 | }
|
34 | if(filesOpenedWrite >= BUFFER_SIZE) |
35 | {
|
36 | return -10; |
37 | }
|
38 | else
|
39 | {
|
40 | while((i < BUFFER_SIZE) && (index < 0)) |
41 | {
|
42 | if(openedWrite[i].fileHandle == -1) |
43 | {
|
44 | index = i; |
45 | }
|
46 | i++; |
47 | }
|
48 | }
|
49 | cluster = fileSys; //fileSys ist entweder UNKNOWN oder FAT16 (s. oben 0 oder 1) |
50 | |
51 | if(*pathname == 0x5C) |
52 | {
|
53 | pathname++; |
54 | }
|
55 | tempPathname = pathname; |
56 | while(*tempPathname) |
57 | {
|
58 | if(*tempPathname == 0x5C) |
59 | return -128; |
60 | tempPathname++; |
61 | }
|
62 | |
63 | tempPathname = pathname; |
64 | if(cluster != 0) |
65 | {
|
66 | tempCluster = cluster; |
67 | cluster = getFirstCluster(tempPathname, cluster, buf, FILE, &fileSize); |
68 | if(cluster != 0) |
69 | {
|
70 | return -2; // anstelle dieser Zeile BLOCK A eingefügt |
71 | }
|
72 | else
|
73 | {
|
74 | cluster = createNewEntry(tempPathname, tempCluster, buf, FILE); |
75 | if(cluster != 0) |
76 | {
|
77 | /* *****************************************************************
|
78 | * BLOCK A
|
79 | * ****************************************************************/
|
80 | openedWrite[index].currentCluster = cluster; |
81 | openedWrite[index].dirLocation = tempCluster; |
82 | openedWrite[index].fileHandle = getFileHandle(); |
83 | openedWrite[index].fileSize = 0; |
84 | openedWrite[index].sectorCount = 0; |
85 | openedWrite[index].firstCluster = cluster; |
86 | openedWrite[index].byteCount = 0; |
87 | openedWrite[index].updateDir = FALSE; |
88 | filesOpenedWrite++; |
89 | return openedWrite[index].fileHandle; |
90 | /* *****************************************************************
|
91 | * ENDE BLOCK A
|
92 | * ****************************************************************/
|
93 | }
|
94 | else
|
95 | {
|
96 | return -4; |
97 | }
|
98 | }
|
99 | }
|
100 | else
|
101 | {
|
102 | return -1; |
103 | }
|
104 | return -128; |
105 | }
|
Mark M. schrieb: > Meine Änderungen dafür sind unten im Kommentar angegeben, ich habe > einfach die Zeile ersetzt, in der -2 für eine schon existierende Datei > zurückgegeben wird (siehe Block A). Und wie hast du sie ersetzt? So einfach wird das nicht sein, sonst hätte das wohl der Originalautor auch so gemacht. Das mindeste was du tun musst, ist die bereits existierende Datei zu löschen, damit die Löschroutine die FAT und das Directory aufräumt. Aber eigentlich ist es üblich, dass nicht das Filesystem solche Dinge entscheidet, sondern der Anwendercode. Ein Basissystem sollte nicht eigenmächtig (ausser es ist dokumentiert) destruktive Dinge machen, wenn sie im Anwendercode leicht durchgeführt werden können. > Stattdessen wird bei einem ungültigen Pathname - nämlich, wenn mehr als > ein Backslash vorkommt, die -128 zurückgegeben. Sollte die -1 nicht dort > stehen? Das kann man so nicht sagen. Dazu müsste man wissen, was die Doku zum Fehlercode -1 zu sagen hat.
Karl heinz Buchegger schrieb: >> Stattdessen wird bei einem ungültigen Pathname - nämlich, wenn mehr als >> ein Backslash vorkommt, die -128 zurückgegeben. Sollte die -1 nicht dort >> stehen? > > Das kann man so nicht sagen. Dazu müsste man wissen, was die Doku zum > Fehlercode -1 zu sagen hat. Ooops. seh gerade, dass das ja im Funktionskommentar drinnen steht. Ja, das würde ich mal als 'misslungene' Fehlermeldung klassifizieren.
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.