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