pC/TFS
Oft wird in kleineren Geräten eine Möglichkeit der Speicherung diverser Daten und Informationen benötigt.
Ein kleines File-System wäre da genau die richtige Lösung. Nur sind professionelle Lösungen für Geräte mit geringem Speicher oft Überdimensioniert.
MS-DOS kompatible Systeme kommen da schon mal schnell auf 150kB Code oder benötigen relativ viel RAM. Nur die Daten mal einfach so irgend wohin kontrolliert ablegen... ?
Das hier vorgestellte Tiny-File-System basiert auf hierarchisch doppelt-verketteten Listen, wodurch keine Beschränkung in Zahl der Dateien innerhalb eines Verzeichnisses oder Dateigröße (max 4GB) vorliegt.
Jede Datei kann dabei in fragmentierter oder unfragmentierter Form erstellt, verwaltet und gelöscht werden.
Das FileSystem verwaltet dabei alle Namen von Verzeichnissen/Dateien als STRING, das heißt auch Sonderzeichen wie Punkt, Leerzeichen und alle anderen gehören zum Namen des Elementes. Jedoch nicht zulässig sind zwei Punkte hintereinander bzw. ein oder mehrere Slashes im Namen.
Reservierte Names-Elemente:
.. - ein Verzeichnis zurück
/ - am Anfang des Pfades: für ab ROOT
/ - innerhalb des Pfades: als Trennung der Verzeichnis/Datei-Namen
Das gesamte FileSystem arbeitet dabei Case-Sensitive !
Als Hardware sind unter anderem paralleles batterie-gepuffertes sRAM, EEPROM, FRAM, MRAM und 256byte-page NOR-Flash (Atmel) getestet und entspechende Port's erstellt. Für kritische Anwendungen kam je eine Variante mit Roll-Back-Pufferung für ein sicheres Schreiben hinzu, was jedoch zur Verdoppelung der Schreibzugriffe führt.
Die Verwendung von anderem Flash-Speicher wurde auf Grund der Sektorengröße von ≥64kB, der notwendigen Pufferung einer Solchen zum Update, sowie die lange Programmierzeit einer ganzen Seite nicht vorgesehen.
Desweiteren wäre eine Absicherung wie durch ein o.g. Roll-Back-Mechanismus zeitlich kaum zu vertreten.
Eine Verwendung moderner Daten-Flashes mit Pagegrößen von 128 Byte .. 64 kBytes kann mittels eines "ReadPageToBuffer-UpdateBuffer-ErasePage-WriteBufferToPage" Mechanismus jederzeit möglich gemacht werden, jedoch prüft das TinyFileSystem nicht auf optimiertes (zusammengefaßtes) PageWrite.
Bei Verwendung von NOR-Flash ist außerdem unbedingt daran zu denken, daß 10.000 .. 100.000 cycles ein recht kurzes Leben ist bei häufigen Updates in die selbe Page.
Des Weiteren beachtet das TinyFileSystem keine Hot-Spots (High-update files).
Speicherbedarf des pC/TFS V2.38b:
ROM: ca. 14 kByte auf einer 32bit CPU
ca. 22 kByte auf einer 8bit CPU
RAM: ca. 24 Byte global + 16..24 Byte je User + 9 Byte * TFS_HANDLES per User
plus ca. 100Byte Stack
Ports:
sRAM | battery-buffered IS62WV51216, EM7644SU16 |
FRAM | FM22L16 |
MRAM | MR4A16 |
NOR | AT91SAM7SE512 / ATSAM3SD8B |
NOR | SAMD21 |
plus some special processors and their NOR or EEPROM based internal memory |
Es sind aber keine Mechanismen des File-Sharings hinterlegt. Das heißt, eine Datei kann gleichzeitig von mehreren Usern zum Lesen aber nur von einem User zum Schreiben geöffnet werden.
Als File-Attribute stehen Read-Only, Write-Only und Hidden(System) zur Verfügung. Hidden-Einträge werden dabei bei einem TFS_GetFirst.. oder TFS_GetNext.. nicht angegeben, können aber direkt zugegriffen werden.
Das gesamte File-System arbeitet auf einen linearen Speicherbereich von maximal 4 GByte. Die Nutzung einer MMU ist dabei ohne weiteres möglich.
Zusätzlich wurden die optionalen Funktionen TFS_Defrag zum Defragmentieren des Laufwerkes und TFS_Repair zum Reparieren defekter hierarchischer Verkettungen erstellt.
Ab Version 2.00 werden nun auch Links (auf Dateien oder Verzeichnisse) unterstützt. Desweiteren haben sich ab Version 2.01 einige Funktionen in ihren Parametern geändert.
download pC/TFS 2.38b (as ZIP)
Releases:
1.00a | erste alpa-Release |
1.20d | Kleine Korrekturen in TFS_GetFirstEntry() und TFS_GetNextEntry() sowie Erweiterung der Fileattribute. Verzeichnisse haben keine Attribute mehr. Komplette Optimierung des Codes. |
2.00a | alpha-Release mit Links. Tripple-Source für Keil, gcc und Microsoft-C |
2.01b | Änderung der Return-Werte von TFS_OpenFile(), TFS_FileRead() und TFS_FileWrite(). Implementation von TFS_GetErrNo(). Erstellung eine LINUX-Host Port's zur Simulation im RAM eines PC. |
2.10a | Userverwaltung geändert - jeder Task kann nur ein User sein, aber jeder User kann TFS_HANDLES Dateien öffnen. Anpassung der Funktionsaufrufe. Änderung der Funktionalität von TFS_ExpandFile(), neue Funktion TFS_ResizeFile(). Für ein FileSystem kleiner 64kByte wurde TFSLONG für die Längenparameter implementiert, um den API- und Speicher-Overhead zu minimieren. Nun kann eine Datei von mehreren Usern gleichzeitig zum Lesen geöffnet werden - aber nur ein User kann eine Datei zum Schreiben öffnen. Wenn eine Datei bereits (mehrfach) zum Lesen geöffnet ist, kann ein anderer User diese nicht zum Schreiben öffnen - wenn eine Datei zum Schreiben geöffnet ist, kann kein anderer User diese zum Lesen oder Schreiben öffnen. |
2.11b | TFS_GetFileSize(), TFS_GetFileAttrib() und TFS_TellFile() implementiert. Kleiner Bugfix in interner Funktion TFSChange_Entry(). |
2.20b | komplette Code-Optimierung. |
2.21a | TFS_GetFreeSize() und TFS_MoveFile() hinzugefügt. Bugfix in TFS_RenameFile() und TFS_RenameDir(). |
2.23b | TFS_WriteFileE() hinzugefügt. SpeedUp in interner Funktion TFSChange_Entry(). |
2.30d | Komplettes Update zu U08..U32 Typen. Typänderungen von HANDLE zu TFS_HANDLE, TFSLONG zu TFS_LONG und ATTR zu TFS_ATTR. Kleine Korrektur in TFS_SeekFile(). Bessere Portabilität für RTOS-lose Verwendung implementiert. Clean-Up in Kommentaren und einigen Code-Zeilen. |
2.32a | TFS_GetFirstEntry() und TFS_GetNextEntry() umbenannt zu TFS_GetFirstName() und TFS_GetNextName(). TFS_GetFirst() und TFS_GetNext() hinzugefügt, diese Funktionen liefern alle Informationen über einen Eintrag (DIR/FILE) in eine übergebene Struktur. TFS_GetRev() hinzugefügt. |
2.34b | TFS_BecomeUserSubROOT(), TFS_GetCurrentPath(), TFS_ChangeDirTemp() und TFS_BackDirTemp() hinzugefügt. |
2.35a | Anpassung zu task-ID bei Verwendung des pC/OS für eindeutige Identifizierung des aktuellen Tasks. TFS_SetEOF() hinzugefügt. |
2.36a | User-Prüfung für GCC und bei unbekanntem User korrigiert. |
2.37b | TFS_GetEntry hinzugefügt und kleine Korrektur in interner Funktion TFSChange_Entry. |
2.38b | TFS_PATHNAME zentral für alle Strings gesetzt, interne Funktionen als static soweit möglich |
Dienste des pC/TFS Version 2.38b (Kurzform)
Die hier aufgeführte Funktionsübersicht dient einzig als Kurzübersicht.
Für detailierte Informationen sehen Sie bitte in Referenz-Manual zu pC/TFS nach.
TFS-Control: | Description |
TFS_Init | Initialisierung des File-Systems |
TFS_GetRev | Gibt Zeiger auf TFS-Revision zurück |
TFS_Flush | sichern des TFS als Image in einer LINUX-Datei |
TFS_Format | Formatieren des Laufwerkes |
User: | Description |
TFS_BecomeUser | User anmelden |
TFS_BecomeUserSubROOT | User in einem Sub-DIR als User-ROOT anmelden |
TFS_CloseUser | User abmelden |
TFS_GetFreeSize | Gibt den Brutto-Freispeicher des Laufwerkes zurück |
Directories: | Description |
TFS_CreateDir | Verzeichnis erstellen |
TFS_RemoveDir | Verzeichnis löschen |
TFS_RenameDir | Verzeichnis umbenennen |
TFS_ChangeDir | aktuellen Pfad ändern |
TFS_ChangeDirTemp | aktuellen Pfad temporär ändern |
TFS_BackDirTemp | temporären Pfad zurücksetzen |
TFS_GetCurrentDir | Gibt aktuellen Verzeichnis-Namen (ohne Pfad) zurück |
TFS_GetCurrentPath | Gibt aktuellen Verzeichnis-Pfad ab ROOT zurück |
Files: | Description |
TFS_CreateFile | Datei erstellen |
TFS_RemoveFile | Datei löschen |
TFS_RenameFile | Datei umbenennen |
TFS_MoveFile | Datei verschieben/bewegen |
TFS_AttribFile | Attribute einer Datei ändern |
TFS_GetFileAttrib | Gibt Attribute einer Datei zurück |
TFS_ResizeFile | Dateigröße ändern |
TFS_GetFileSize | Gibt Dateigröße zurück |
TFS_OpenFile | Datei in "modi" öffnen |
TFS_CloseFile | Datei schließen |
TFS_SeekFile | Zeiger in geöffneter Datei absolut setzen |
TFS_TellFile | Gibt den Zeiger in geöffnete Datei zurück |
TFS_ExpandFile | offene Datei vergrößern |
TFS_SetEOF | setzt EndOfFile in offener Datei an aktuellen R/W-Zeiger |
TFS_ReadFile | Lesen aus Datei |
TFS_WriteFile | Schreiben in Datei |
TFS_WriteFileE | Schreiben in Datei, vergrößern dieser wenn nötig |
TFS_GetErrNo | Fehlercode von Open, Read, Write ... lesen |
Links: | Description |
TFS_CreateLink | Link auf ein Verzeichnis oder eine Datei erstellen |
TFS_RemoveLink | Link löschen |
TFS_RenameLink | Link umbenennen |
TFS_ReadLink | Gibt Namen des gelinkten Eintrages zurück |
Entries: | Description |
TFS_GetFirstName | Gibt Namen des ersten Eintrag im Verzeichnis zurück |
TFS_GetNextName | Gibt Namen des nächsten Eintrages im Verzeichnis zurück |
TFS_GetFirst | Gibt alle Infos des ersten Eintrag im Verzeichnis zurück |
TFS_GetNext | Gibt alle Infos des nächsten Eintrages im Verzeichnis zurück |
TFS_GetEntry | Gibt alle Infos des angegebenen Elementes (dir/file/link) zurück |
Optional: | Description |
TFS_Defrag | Defragmentiert das Laufwerk |
TFS_Repair | Repariert das hierarchische Pointersystem |
Error-Codes:
Name | Decimal_Value |
TFS_NO_ERR | 0 |
TFS_USR_OVF | 200 |
TFS_DBL_USER | 201 |
TFS_NO_USER | 202 |
TFS_SUB_USER | 203 |
TFS_NAME_EXIST | 210 |
TFS_NOT_EXIST | 211 |
TFS_PATH_ERR | 212 |
TFS_TMP_DIR | 213 |
TFS_NO_FILE | 214 |
TFS_FILE_RO | 215 |
TFS_FILE_WO | 216 |
TFS_FILE_EOF | 217 |
TFS_NOT_EMPTY | 218 |
TFS_FILE_OPEN | 219 |
TFS_NO_DATA | 220 |
TFS_WRONG_PTR | 221 |
TFS_LINKED | 230 |
TFS_MAX_LINK | 231 |
TFS_LINK_ERR | 232 |
TFS_NO_LINK | 233 |
TFS_MEM_ERR | 250 |
TFS_MEM_OVF | 251 |
TFS_WR_PTR | 252 |
TFS_WRITE_ERR | 253 |
TFS_INVALID | 254 |