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.


pCTFS_238b.zip
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