NVOL ist ein anhaltendes Flash -Register, das oft als EEPROM -Emulation bezeichnet wird. Es bietet eine grundlegende API zum Lesen und Schreiben von indizierten Schlüssel-/Wertpaaren zu und von einem Flash -Speicher, ähnlich wie eine Registrierung. Es ist wichtig zu erwähnen, dass sowohl der Schlüssel als auch der Wert in Flash gespeichert werden, sodass die Registrierung während der Laufzeit geändert werden kann. Einige der Merkmale von NVOL sind:
Die Bibliothek bietet zwei Optionen zum Verwalten von Datenspeicher: Option 1: Speichern Sie Einträge bei der Änderung sofort in den Flash -Speicher. Option 2: Speichern Sie Einträge in RAM und speichern Sie den Flash -Speicher bei Bedarf.
Der Nachteil eines Flash -Speichers ist, dass es nicht in einzelnen Bytes gelöscht oder geschrieben werden kann. Der Flash -Speicher kann nur in großen Blöcken gelöscht und geschrieben werden. Eine typische Löschblockgröße kann 4K- oder 8K -Bytes betragen. Für NVOL sollten die Flash -Implementierungen Teilschreibungen unterstützen, wobei ein gelöschter Block mehrfach geschrieben werden kann, solange die Bits nur von „1“ (gelöschter Zustand) zu „0“ (programmierter Zustand) geändert werden.
Für den Blitz gilt die Seite als die kleinste Blockgröße, die gelöscht werden kann. Jeder Sektor kann aus einer oder mehreren dieser Seiten bestehen.
Der erste Sektor wird ursprünglich gelöscht. Neue Registrierungseinträge werden nacheinander zum Flash hinzugefügt. Wenn ein Eintrag aktualisiert wird, wird der alte Eintrag als ungültig markiert und ein neuer Eintrag unter der nächsten verfügbaren Flash -Adresse geschrieben. Sobald der erste Sektor die Kapazität erreicht hat, werden alle gültigen Einträge in den zweiten Sektor kopiert und der erste Sektor wird dann gelöscht. Dieser Vorgang wiederholt sich.
NVOL verarbeitet und verfolgt gültige Einträge und ihre Standorte auf Flash. Die Sektoren werden dynamisch verwaltet.
Makros stehen zur Verfügung, um statische Instanzen von NVOL zu erstellen, die dann mit der API verwendet werden können. Ein Beispiel für eine Erklärung wäre:
#define NVOL3_REGISTRY_START 0
#define NVOL3_REGISTRY_SECTOR_SIZE STORAGE_32K
#define NVOL3_REGISTRY_SECTOR_COUNT 2
#define REGISTRY_KEY_LENGTH 24
#define REGISTRY_VALUE_LENGT_MAX 224
NVOL3_INSTANCE_DECL(_regdef_nvol3_entry,
ramdrv_read, ramdrv_write, ramdrv_erase,
NVOL3_REGISTRY_START,
NVOL3_REGISTRY_START + NVOL3_REGISTRY_SECTOR_SIZE,
NVOL3_REGISTRY_SECTOR_SIZE,
REGISTRY_KEY_LENGTH, /*key_size*/
DICTIONARY_KEYSPEC_BINARY(6), /*dictionary key_type (24 char string)*/
53, /*hashsize*/
REGISTRY_VALUE_LENGT_MAX, /*data_size*/
0, /*local_size (no cache in RAM)*/
0, /*tallie*/
NVOL3_SECTOR_VERSION /*version*/
) ;
Dies schafft ein NVOL mit zwei 32 -km -Sektoren zu Beginn des Blitzes. Die Gesamtgröße des Schlüssels, einschließlich des Eingangsheaders, beträgt 256 Bytes. Dies ist keine Voraussetzung, aber die Ausrichtung sollte berücksichtigt werden. Das Lookup -Wörterbuch hat eine Hash -Größe von 53. Darüber hinaus speichert diese Instanz keine Werte in RAM ( local_size = 0 ). Lesen Sie sie daher bei Bedarf immer von Flash vor.
In der Demo wird der NVRAMDRV -Treiber verwendet, als ein Flash -Speicher im RAM die Zugriffsfunktionen ramdrv_read, ramdrv_write und ramdrv_erase für diese Instanz ist.
Jetzt kann _regdef_nvol3_entry mit der NVOL -API verwendet werden. Die NVOL -API ist leicht eingestellt, sodass ein einfaches Registrierungsbeispiel bereitgestellt wird.
Das bereitgestellte Testbeispiel kann kompiliert und in einem Github -Codespace ausgeführt werden. Öffnen Sie einfach einen Codespace für dieses Repostory und make im Terminal, das sich öffnet (wenn das Terminal nicht geöffnet ist, verwenden Sie ctrl + ` um das Terminal zu öffnen). Jetzt können Sie das NVOL -Beispiel starten, indem Sie im Terminal tippen ./build/nvol . Alle Befehle können im Terminal des Codespace ausgeführt werden.
Wenn das Beispielprogramm gestartet wird, wird eine Befehlsschale geöffnet und die folgenden Angaben angezeigt:
@navaro /workspaces/nvol (main) $ ./build/nvol
REG : : resetting _regdef_nvol3_entry
NVOL3 : : '_regdef_nvol3_entry' 0 / 255 records loaded
Navaro corshell Demo v 'Jan 16 2023'
use 'help' or '?' for help.
# >
Erstens werden wir ein einfaches Skript ausführen, um unsere Registrierung mit Werten zu füllen. Am schnellen Typ:
source ./test/reg.sh
Dies sollte die Registrierung mit Werten füllen. Alle Befehle zum Testen des Registrierungsarts auflisten ? reg sollte die folgende Liste anzeigen:
# >? reg
reg [key] [value]
regadd <key> <value>
regdel <key>
regerase
regstats
regtest [repeat]
# >
Wir können jetzt den Befehl reg verwenden, um die Registrierung anzuzeigen und zu aktualisieren:
# >reg
player.age: Ancient
player.gender: Otherworldly
player.level: legendary
player.location: Mount Olympus
player.name: cool_cat
player.points: 9000
player.power: invisibility
player.species: Dragon
player.status: awakened
player.weapon: lightning bolt
test: 123
user.address: 123 Main St.
user.age: 30
user.children: 0
user.email: [email protected]
user.favorite_color: blue
user.gender: male
user.marital_status: single
user.name: John Smith
user.occupation: contributor
user.phone_number: 555-555-5555
21 entries found.
# >reg user.favorite_color yellow
OK
# >reg user.favorite_color
user.favorite_color: yellow
# >regdel user.gender
OK
# >reg player
player.age: Ancient
player.gender: Otherworldly
player.level: legendary
player.location: Mount Olympus
player.name: cool_cat
player.points: 9000
player.power: invisibility
player.species: Dragon
player.status: awakened
player.weapon: lightning bolt
10 entries found.
# >regstats
NVOL3 : : '_regdef_nvol3_entry' 20 / 255 records loaded
record : 256 recordsize
: 0x000000 1st sector version 0x0155 flags 0xaaaaffff
: 0x010000 2nd sector version 0x0000 flags 0xffffffff
: 0x010000 sector size
: 20 loaded
: 20 inuse
: 2 invalid
: 0 error
: 640 lookup table bytes
: 53 dict hash size
: dict hash - max 2, empty 34, used 19
Diese Befehle werden alle in src/registry/registrycmd.c implementiert. Die Implementierung ist intuitiv und selbsterklärend und sollte keine weitere Erklärung erfordern.
Die Shell ist ein Projekt an und für sich, ist jedoch nur für Demonstrationszwecke in diesem Beispiel enthalten. Es ist leicht zu verlängern. Verwenden ? Um die vollständige Liste der für dieses Beispiel implementierten Befehle anzuzeigen.
Wenn die Registrierung die Zeichenfolgen verwendet, um die Einträge zu indizieren, verwendet die String -Tabelle Ganzzahlwerte. Dieser Ansatz erfordert weniger RAM -Ressourcen.
In diesem Beispiel gibt es auch ein Skript, um die String -Tabelle mit Werten zu füllen. Am schnellen Typ:
source ./test/strtab.sh
Auch hier können wir die String -Tabelle jetzt mit einem einfachen Befehl auflisten:
# >strtab
0000 ENGLISH
0001 The end of the world is our playground.
0002 The company is family. The family is the company.
0003 Escape the mundane. Embrace the extraordinary.
0004 Work hard, live easy.
0005 The future is now. Join us.
0006 There is no I in team. But there is in severance.
0007 We're not just a company. We're a movement.
0008 Success is a journey, not a destination.
0009 Innovation starts with you.
0010 Welcome to the beginning of something great.
0100 DUTCH
0101 Het einde van de wereld is onze speeltuin.
0102 Het bedrijf is familie. De familie is het bedrijf.
0103 Ontsnap aan het alledaagse. Omarm het buitengewone.
0104 Hard werken, makkelijk leven.
0105 De toekomst is nu. Doe met ons mee.
0106 Er is geen ik in team. Maar wel in ontslagvergoeding.
0107 We zijn niet alleen een bedrijf. We zijn een beweging.
0108 Succes is een reis, geen bestemming.
0109 Innovatie begint bij jou.
0110 Welkom bij het begin van iets groots.
0999 test
23 entries found.
# >
Wie bei der Registrierung registriert sich das Beispiel für die String -Tabelle mit der String -Substitutionsbibliothek, um die durch <> durch die Zeichenfolge in der String -Tabelle begrenzten Indexwerte zu ersetzen. Zum Beispiel:
# >echo "<1>"
The end of the world is our playground.
# >
Die Demo verwendet einen Emulationsfahrer für Flash im RAM. Dies ist in "CRC/Treiber/Ramdrv.h/c" implementiert.
Im selben Verzeichnis wird in den Dateien "spiflash.h/c" ein Beispiel -Treiber für einen echten Flash -Chip zugewiesen. Dies wurde mit dem Chibios/Hal -SPI -Treiber implementiert und sollte ein guter Ausgangspunkt für das Portieren von NVOL auf Ihrer eigenen Plattform sein.