NVOL est un registre flash persistant, souvent appelé émulation EEPROM. Il propose une API de base pour la lecture et l'écriture de paires de clés / valeur indexées vers et depuis une mémoire flash, similaire à un registre. Il est important de mentionner que la clé et la valeur sont stockées dans Flash, permettant de modifier le registre pendant l'exécution. Certaines des caractéristiques de NVOL comprennent:
La bibliothèque fournit deux options pour gérer le stockage des données: Option 1: Enregistrez immédiatement les entrées sur la mémoire flash chaque fois que les modifications. Option 2: Stockez les entrées dans RAM et enregistrez dans la mémoire flash à la demande.
L'inconvénient d'une mémoire flash est qu'il ne peut pas être effacé ou écrit en octets uniques. La mémoire flash ne peut être effacée et écrite que dans de grands blocs. Une taille de bloc d'effacement typique peut être des octets de 4K ou 8k. Pour NVOL, les implémentations Flash devraient prendre en charge les écritures partielles, où un bloc effacé peut être écrit plusieurs fois tant que les bits sont passés de «1» (état effacé) à «0» (état programmé).
Pour le flash, la page est considérée comme la plus petite taille de bloc qui peut être effacée. Chaque secteur peut être composé d'une ou plusieurs de ces pages.
Le premier secteur est initialement effacé. Les nouvelles entrées de registre sont ajoutées séquentiellement au flash. Lorsqu'une entrée est mise à jour, l'ancienne entrée est marquée comme non valide et une nouvelle entrée est écrite à l'adresse flash suivante suivante. Une fois que le premier secteur a atteint la capacité, toutes les entrées valides sont copiées dans le deuxième secteur et le premier secteur est ensuite effacé. Ce processus se répète.
NVOL gère efficacement et garde une trace des entrées valides et de leurs emplacements sur Flash. Les secteurs sont gérés dynamiquement.
Les macros sont disponibles pour créer des instances statiques de NVOL, qui peuvent ensuite être utilisées avec l'API. Un exemple de déclaration serait:
#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*/
) ;
Cela crée un NVOL avec deux secteurs 32k au début du flash. La taille totale de la clé, y compris l'en-tête d'entrée, est de 256 octets. Ce n'est pas une exigence, mais l'alignement doit être pris en compte. Le dictionnaire de recherche a une taille de hachage de 53. De plus, cette instance ne stockera aucune valeur dans RAM ( local_size = 0 ), elle les lira donc toujours de Flash en cas de besoin.
Dans la démo, le pilote nvramdrv est utilisé pour l'émulation d'une mémoire flash dans RAM, les fonctions d'accès sont configurées Ramdrv_read, Ramdrv_Write et Ramdrv_erase pour cette instance.
Maintenant, _regdef_nvol3_entry peut être utilisé avec l'API NVOL. L'API NVOL est légèrement invoquée, donc un exemple de registre simple est fourni.
L'exemple de test fourni peut être compilé et exécuté dans un GitHub Codepace. Ouvrez simplement un codeppace pour ce repostoire et type make dans le terminal qui s'ouvre (si le terminal n'est pas ouvert, utilisez ctrl + ` pour ouvrir le terminal). Vous pouvez maintenant commencer l'exemple NVOL en tapant ./build/nvol dans le terminal. Toutes les commandes peuvent être exécutées dans le terminal de l'espace de code.
Lorsque l'exemple de programme est lancé, un shell de commande s'ouvrira et affichera ce qui suit:
@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.
# >
Tout d'abord, nous exécuterons un script simple pour remplir notre registre avec des valeurs. Au type d'invite:
source ./test/reg.sh
Cela devrait remplir le registre de valeurs. Pour répertorier toutes les commandes pour tester le type de registre ? reg , il devrait afficher la liste suivante:
# >? reg
reg [key] [value]
regadd <key> <value>
regdel <key>
regerase
regstats
regtest [repeat]
# >
Nous pouvons maintenant utiliser la commande regier et mettre à jour le registre:
# >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
Ces commandes sont toutes implémentées dans src/registry/registrycmd.c . La mise en œuvre est intuitive et explicite et ne devrait nécessiter aucune explication supplémentaire.
Le shell est un projet en soi, mais n'est inclus que dans cet exemple à des fins de démonstration. Il est facile à étendre. Utiliser ? Pour voir la liste complète des commandes implémentées pour cet exemple.
Lorsque le registre utilise des chaînes pour indexer les entrées, la table de chaîne utilise des valeurs entières. Cette approche nécessite moins de ressources RAM.
Pour cet exemple, il existe également un script pour remplir la table de chaîne avec des valeurs. Au type d'invite:
source ./test/strtab.sh
Encore une fois, nous pouvons maintenant lister la table de chaîne avec une commande simple:
# >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.
# >
Comme le registre, l'exemple de table de chaîne se regarde avec la bibliothèque de substitution de chaîne pour remplacer les valeurs d'index délimitées par <> par la chaîne dans la table de chaîne. Par exemple:
# >echo "<1>"
The end of the world is our playground.
# >
La démo utilise un pilote d'émulation pour Flash dans RAM. Ceci est mis en œuvre dans "CRC / Drivers / Ramdrv.h / C".
Dans le même répertoire, un exemple de pilote pour une véritable puce Flash est prévu dans les fichiers "Spiflash.h / C". Cela a été implémenté à l'aide du pilote Chibios / Hal SPI et devrait être un bon point de départ pour le portage de NVOL sur votre propre plate-forme.