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 & I2C) getestet (MRAM, FRAM, ReRAM, EEPROM). Außerdem kann das File System auch auf parallelem Speicher wie RAM, FRAM, MRAM oder EEPROM laufen. 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 V1.14b:

ROM: ca. 8 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, Ramtron FM24V10, Cypress CY15B104Q, Fujitsu MB85RS1MT, Fujitsu MB85RC256, ...

ReRAM

Fujitsu MB85AS4MT

nvRAM

Cypress CY14B101Q2

EEPROM

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

running on hosts like: ARC-EM, ARMv8-M, FE310, GD32VF103, STM32F1xx, STM32F4xx, SAM3Sxx, SAMD21xx, SAMD51xx, SAML10, SAML11 ... plus Win32 & Linux



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_114b.zip
download pC/SFS 1.14b (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() added, but only the hash of the name can be returned instead the name itself - and optional LOCK/UNLOCK added in LLdriver to protect serial communication against timeouts

1.01b

parallel memory and I2C memory support added. Rename of LL-driver files to split between SPI, I2C and parallel memory

1.02a

correction in internal SFSChange_Entry() for incorrect SFS_ChangeDir("/") handling

1.10c

correction in internal SFSMem_Alloc() & SFSCreate_Entry() on creation of a DIR

1.12b

optional extension SFS_RemoveDirTree() added and link handling corrected

1.13a

feature switch SFS_AUTO_CLOSE added

1.14b

feature switch SFS_DEEP_FORMAT added and SFS_PATHNAME central for all strings added, internal functions as static as far as possible



Dienste des pC/SFS Version 1.14b (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_Flush

sichern des SFS als Image in einer Windows/LINUX-Datei

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_RemoveDirTree

Verzeichnis und alle Sub-Elemente 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