pC/SFS



In besonders kleinen Geräten besteht oft nicht einmal die Möglichkeit, einen normalen (parallelen) NVM-Speicher anzuschließen um diverse Daten und Informationen speichern zu können. Ein sehr kleines File-System für serielle NVM-Speicherbausteine wäre da genau die richtige Lösung. FAT-FileSysteme auf diese teilweise sehr kleinen Speicher loszulassen, wäre aber übertrieben und kann vergleichsweise sehr viel Code- wie RAM- Speicher kosten.

Das hier vorgestellte (small) Serial-File-System basiert auf einfach verketteten Blöcken, deren Elemente (DIR/FILE) durch einen 32bit Hash über ihren Namen referenziert werden und wo die Zahl der max. Einträge pro Verzeichnis festgelegt werden muss.
Durch die Verwendung eines 32bit-Hash als Namen kann das Filesystem massiv vereinfacht werden, jedoch sind somit keine Rückgaben zu den Namen der Einträge möglich. Der Hash eines jeden Eintrages muss innerhalb seines Verzeichnisses einmalig sein. Da ein 32bit-Hash Wert an sich nicht garantiert einmalig sein kann - d.h. unter Umständen können zwei Namen den selben Hash Wert ergeben - sind mehrere 32bit-Hash Algorithmen hinterlegt, die Selektion muss aber zu compile-Zeit festgelegt werden.
Das FileSystem verwaltet dabei alle Namen von Verzeichnissen/Dateien als Hash über einen STRING, das heißt auch Sonderzeichen wie Punkt, Leerzeichen und alle anderen gehören zum Namen des Elementes.

Reservierte Names-Elemente:

.. - ein Verzeichnis zurück
/  - am Anfang des Pfades: für ab ROOT
./ - am Anfang des Pfades: für ab current DIR (optional)
/  - innerhalb des Pfades: als Trennung der Verzeichnis/Datei-Namen

Das gesamte FileSystem arbeitet dabei Case-Sensitive !
Als Hardware sind verschiedenste serielle NVM Speicherbausteine (SPI) getestet (MRAM, FRAM, ReRAM, EEPROM). Ideal sind alle Typen, die byte-weises Schreiben durch internes Puffern von Sectoren/Pages unterstützen, jedoch kann dies auch der Low-Level Hardware-Treiber übernehmen.
Die Verwendung von seriellem 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.
Bei Verwendung von EEPROM ist außerdem unbedingt daran zu denken, daß 1.000.000 cycles zwar schon recht viel ist, aber auch dies eine endliche Lebenszeit angibt.
Des Weiteren beachtet das SerialFileSystem keine Hot-Spots (High-update files) oder Transaktionen.


Speicherbedarf des pC/SFS V0.96a:

ROM: ca. 7 kByte auf einer 32bit CPU
RAM: ca. 124 Byte global + 42..64 Byte je User + 32 Byte * SFS_HANDLES per User
         plus ca. 180Byte Stack


tested NVM memory:

MRAM

Everspin MR25H40                            

FRAM

Ramtron FM25H20, Cypress CY15B104Q, Fujitsu MB85RS1MT, ...

ReRAM

Fujitsu MB85AS4MT

nvRAM

Cypress CY14B101Q2

EEPROM

Microchip 25AA1024, Atmel AT25M01, STM M95M01, ONsemi CAT25M01, STM M95512, Atmel AT25256, ...

running on host like: ARMv8-M, STM32F1xx, STM32F4xx, SAM3Sxx, SAMD21xx



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 und Write-Only zur Verfügung.

pCSFS_096a.zip
download pC/SFS 0.96a (as ZIP)


Releases:

0.80a

erste alpa-Release

0.81a

code for create & delete link can be disabled

0.90a

handling of file attributes completed and code uses found config values from file system if compatible to base settings

0.95b

internal function SFSChange_Entry() harmonised and the use of it readjusted

0.96a

SFS_GetEntry() hinzugefügt, aber nur der Hash des Namens kann zurück gegeben werden anstatt der Name selbst - und in LLdriver optional LOCK/UNLOCK hinzugefügt um die serielle Kommunikation gegen timeouts zu schützen



Dienste des pC/SFS Version 0.96a (Kurzform)
Die hier aufgeführte Funktionsübersicht dient einzig als Kurzübersicht.
Für detailierte Informationen sehen Sie bitte in Referenz-Manual zu pC/SFS nach.


SFS-Control:

Description

SFS_Init

Initialisierung des Serial-File-Systems

SFS_GetRev

Gibt Zeiger auf SFS-Revision zurück

SFS_Format

Formatieren des Laufwerkes



User:

Description

SFS_BecomeUser

User anmelden

SFS_CloseUser

User abmelden



Directories:

Description

SFS_CreateDir

Verzeichnis erstellen

SFS_RemoveDir

Verzeichnis löschen

SFS_RenameDir

Verzeichnis umbenennen

SFS_ChangeDir

aktuellen Pfad ändern

SFS_ChangeDirTemp

aktuellen Pfad temporär ändern

SFS_BackDirTemp

temporären Pfad zurücksetzen



Files:

Description

SFS_CreateFile

Datei erstellen

SFS_RemoveFile

Datei löschen

SFS_RenameFile

Datei umbenennen

SFS_AttribFile

Attribute einer Datei ändern

SFS_GetFileAttrib

Gibt Attribute einer Datei zurück

SFS_GetFileSize

Gibt die aktuelle Dateigröße zurück

SFS_GetMaxFileSize

Gibt die maximale Dateigröße zurück

SFS_OpenFile

Datei in "modi" öffnen

SFS_CloseFile

Datei schließen

SFS_SeekFile

Zeiger in geöffneter Datei absolut setzen

SFS_TellFile

Gibt den Zeiger in geöffnete Datei zurück

SFS_SetEOF

setzt EndOfFile in offener Datei an aktuellen R/W-Zeiger

SFS_ReadFile

Lesen aus Datei

SFS_WriteFile

Schreiben in Datei

SFS_GetErrNo

Fehlercode von Open, Read, Write ... lesen



Links:

Description

SFS_CreateLink

Link auf ein Verzeichnis oder eine Datei erstellen

SFS_RemoveLink

Link löschen



Entries:

Description

SFS_GetEntry

Gibt alle Infos des angegebenen Elementes (dir/file/link) zurück



Error-Codes:

Name

Decimal_Value

SFS_NO_ERR

0

SFS_USR_OVF

200

SFS_DBL_USER

201

SFS_NO_USER

202

SFS_NAME_EXIST

210

SFS_NOT_EXIST

211

SFS_PATH_ERR

212

SFS_TMP_DIR

213

SFS_NO_FILE

214

SFS_FILE_RO

215

SFS_FILE_WO

216

SFS_FILE_EOF

217

SFS_NOT_EMPTY

218

SFS_FILE_OPEN

219

SFS_NO_DATA

220

SFS_WRONG_PTR

221

SFS_NO_ENTRY

222

SFS_WRONG_A

223

SFS_LINKED

230

SFS_MAX_LINK

231

SFS_LINK_ERR

232

SFS_NO_LINK

233

SFS_MEM_ERR

240

SFS_MEM_OVF

241

SFS_FORMAT_ERR

250

SFS_PORT_ERR

251