Forum: Mikrocontroller und Digitale Elektronik elm-chan FatFS 2 Dateien in 2 Ordnern gleichzeitig benutzen


von Ingo S. (ingo-s)


Lesenswert?

Hi,

ich möchte in einem Ordner eine Logdatei öffnen, in die im 1s Rythmus 
jeweils ein Sector geschrieben wird und gleichzeitig sporadisch für eine 
Sprachausgabe in einem anderen Ordner diverse Files lesen.

Die Sprachausgabe funktioniert schon, nun soll das Logging dazu kommen.

Es gibt aber nur eine globale chdir() Funktion.

Kann ich davon ausgehen, das anschliessende Wechsel in einen anderen 
Ordner nachdem die Logdatei schon geöffnet für diese der alte Ordner 
weiterhin gilt?

Ingo

von Falk B. (falk)


Lesenswert?

@Ingo Stahl (ingo-s)

>Es gibt aber nur eine globale chdir() Funktion.

es gibt aber Konfigurationsoptionen.

#define  _FS_LOCK  0  /* 0:Disable or >=1:Enable */
/* To enable file lock control feature, set _FS_LOCK to 1 or greater.
   The value defines how many files can be opened simultaneously. */

von Ingo S. (ingo-s)


Lesenswert?

In der aktuellen Version habe ich das #define nicht mehr gefunden.

Dafür aber:
#define FF_FS_LOCK    0
/* The option FF_FS_LOCK switches file lock function to control 
duplicated file open
/  and illegal operation to open objects. This option must be 0 when 
FF_FS_READONLY
/  is 1.

Das liest sich für mich eher für mehrfaches öffnen von einem File.

Dann steht da aber:
/  >0: Enable file lock function. The value defines how many 
files/sub-directories
/      can be opened simultaneously under file lock control. Note that 
the file
/      lock control is independent of re-entrancy. */

von Falk B. (falk)


Lesenswert?

@ Ingo Stahl (ingo-s)

>Das liest sich für mich eher für mehrfaches öffnen von einem File.

Ach so, kann sein, hab ich bisher nie verwendet.

Aber kann man denn nicht einfach eine Datei mit vollem Dateinamen direkt 
öffnen? Da braucht es kein chdir().
Dann kann man auch problemlos mehrere Dateien gleichzeitig offen halten.

von Falk B. (falk)


Lesenswert?

http://elm-chan.org/fsw/ff/doc/filename.html

In default configuration (FF_FS_RPATH == 0), it does not have a concept 
of current directory like OS oriented filesystem. Every object on the 
volume is always specified in full path name that followed from the root 
directory. Dot directory names (".", "..") are not allowed. Heading 
separator is ignored and it can be exist or omitted. The default drive 
is fixed to drive 0.

When relative path is enabled (FF_FS_RPATH >= 1), specified path is 
followed from the root directory if a heading separator is exist. If 
not, it is followed from the current directory of the drive set by 
f_chdir function. Dot names are also allowed for the path names. The 
default drive is the current drive set by f_chdrive function.

von S. R. (svenska)


Lesenswert?

Probier's doch einfach aus.
1) chdir("/alpha");
2) xx = fopen("alpha.txt");
3) chdir("/beta");
4) yy = fopen("beta.txt");
5) write(xx, "hallo");
6) fclose(xx);
7) fclose(yy);

Und dann schaue mal nach, wo das "hallo" drin steht.
Üblicherweise ist ein Dateihandle an die Datei gebunden, nicht an ihren 
Ort. Allerdings hbe ich von FatFS keine Ahnung.

von Ingo S. (ingo-s)


Lesenswert?

Hi,
nun doch kurz ausprobiert.
Ein geöffnetes File bleibt bei dem zugeordnetem Verzeichnis, auch wenn 
anschliessend das globale Verzeichnis geändert wird.

//------------------------------------------------------------
FIL Fwrt;
const char zeile1[]="Zeile1\n";
const char zeile2[]="zweite Zeile\n";

res= f_mkdir("/logs");
res= f_chdir("/logs");
res= f_open(&Fwrt, "log1.txt", FA_CREATE_ALWAYS | FA_WRITE);
res= f_write(&Fwrt, zeile1,sizeof(zeile1)-1, &cnt);
//
res = f_chdir("/de"); // Verzeichnis wechseln
//
res= f_write(&Fwrt, zeile2,sizeof(zeile2)-1, &cnt);
res= f_close(&Fwrt);
//------------------------------------------------------------
Auch die f_write Daten nach dem Verzeichniswechsel landen korrekt im 
geöffneten File.

Ingo

von Jim M. (turboj)


Lesenswert?

Ingo S. schrieb:
> Ein geöffnetes File bleibt bei dem zugeordnetem Verzeichnis, auch wenn
> anschliessend das globale Verzeichnis geändert wird.

Äh, war das nicht Dein Erwartungswert..? Kann man im FatFS Code genau so 
nachvollziehen.

Übrigens halte ich von der Idee ein Logfile dauern offen zu halten 
überhaupt nix. Denn wenn der mC dann doch mal abstürzt sind die letzten 
Logdaten gar nicht weggeschrieben, denn das macht er nur beim f_close().

FATFS kann (FS_TINY = 0) die letzten 512 Byte in seinem Puffer 
speichern. Den schreibt f_write() nicht weg wenn es nicht sein muss.

von Ingo S. (ingo-s)


Lesenswert?

Hi,
das Projekt ist umgesetzt und f_chdir() funktioniert, wie oben "zu Fuß" 
ausprobiert.

Die vorhanden Sprachausgabe für RC Telemetriedaten mit STM32F051 + 
microSD ist nun mit Logging erweitert.
Unter dem CooCox CooOs RTOS (FreeRTOS benötigt zu viel RAM) laufen nun 
zwei Task, Sprachausgabe und Logging.
Der Zugriff auf die microSD wird per Mutex synchronisiert und f_chdir() 
wird der jeweils anderen Task per Flag mitgeteilt.
Die Logdatei wird offen gehalten, es wird aber zyklisch oder bei 
bestimmten Aktionen ein f_synch() durchgeführt. Erst bei timeout der 
Datenquelle wird ein f_close() durchgeführt.
Fazit:
Der problemlose Einsatz des CooOS hat das ganze entspannt Umsetzen 
lassen.
Das wegschreiben eines Sectors/Buffers mit f_synch() ist bei einer 
class10 microSd schnell genug um auch während einer aktiven 
Sprachausgabe nicht zu stören. Die Sprachausgabe erfolgt per DMA->DAC, 
wobei nach 48ms bzw. spätestens ca. 80ms der nächste Sector des Wave 
Files eingelesen werden muß.
Alternativ bietet sich natürlich ein zwischenspeichern der Logdaten an 
um während der Sprachdaten-Pause das Log zu schreiben, da reichen aber 
die vorhandenen 8k RAM nicht aus.

Ingo

von Jim M. (turboj)


Lesenswert?

Ingo S. schrieb:
> Die Sprachausgabe erfolgt per DMA->DAC,
> wobei nach 48ms bzw. spätestens ca. 80ms der nächste Sector des Wave
> Files eingelesen werden muß.

Dann musst Du aber die Karte jeweils vorher testen und mitliefern.

Ich hatte hier mal 'ne Karte aus dem Supermarkt die eine ganze Sekunde 
zum Schreiben brauchte. So ein Schreibvorgang kann schon mal 300ms auch 
bei guten Karten dauern.

von Ingo S. (ingo-s)


Lesenswert?

Das ganze ist ja nur ein privates Hobby Projekt, auf einer vor zwei 
Jahren entworfenen Hardware, die eigentlich nur für die Sprachausgabe 
gedacht war.

Ich habe vor ca. 8 Jahren schon mal einen reinen Logger mit microSD und 
der Lib von Roland Riegel aufgebaut. Die 300ms Zugriffszeit mit den 
damaligen microSD's konnte ich da auch beobachten.
Jetzt war ich richtig überrascht im Logig Analyser nur Zeiten unter 5ms 
zu sehen. Ich bin aber sicher das da noch viel höhere Zeiten ab und zu 
auftreten, da ich ja nur einen Schnappschuss mit dem LA mache.

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.