Forum: Mikrocontroller und Digitale Elektronik Mehrere Dateien mit gleichem Namen auf microSD


von Mark M. (mom-jovi)


Lesenswert?

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?

von Guest (Gast)


Lesenswert?

FAT-Tabelle fehlerhaft

von Mark M. (mom-jovi)


Lesenswert?

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Simon H. (simi)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dateinamen werden nicht in der FAT, sondern im Verzeichnis gespeichert - 
und genau das wird fehlerhaft sein.

von Mark M. (mom-jovi)


Lesenswert?

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.

von U.R. Schmitt (Gast)


Lesenswert?

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.

von Mark M. (mom-jovi)


Lesenswert?

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
}

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.