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
@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. */
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. */
@ 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.
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.
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.
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
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.