NVOLは永続的なフラッシュレジストリであり、しばしばEEPROMエミュレーションと呼ばれます。レジストリと同様に、フラッシュメモリとの間でインデックス付きキー/値のペアを読み書きするための基本的なAPIを提供します。キーと値の両方がフラッシュに保存され、ランタイム中にレジストリを変更できることに言及することが重要です。 NVOLの機能には次のものがあります。
ライブラリには、データストレージを管理する2つのオプションがあります。オプション1:変更されるたびにフラッシュメモリにエントリをすぐに保存します。オプション2:RAMにエントリを保存し、オンデマンドでフラッシュメモリに保存します。
フラッシュメモリの欠点は、単一バイトで消去または書き込まないことです。フラッシュメモリは、広いブロックでのみ消去および記述できます。典型的な消去ブロックサイズは、4Kまたは8Kバイトです。 NVOLの場合、Flashの実装は部分的な書き込みをサポートする必要があります。ここでは、ビットが「1」(消去状態)から「0」(プログラムされた状態)に変更のみが変更されている限り、消去されたブロックを複数回記述できます。
フラッシュの場合、ページは消去できる最小のブロックサイズと見なされます。各セクターは、これらのページの1つ以上で構成できます。
最初のセクターは最初に消去されます。新しいレジストリエントリがフラッシュに順番に追加されます。エントリが更新されると、古いエントリは無効としてマークされ、新しいエントリが次に利用可能なフラッシュアドレスに記述されます。最初のセクターが容量に達すると、すべての有効なエントリが第2セクターにコピーされ、最初のセクターが消去されます。このプロセスは繰り返されます。
NVOLは、Flashの有効なエントリとその場所を効率的に処理および追跡します。セクターは動的に管理されます。
マクロは、NVOLの静的インスタンスを作成するために利用でき、APIで使用できます。宣言の例は次のとおりです。
#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*/
) ;
これにより、フラッシュの開始時に2つの32Kセクターを備えたNVOLが作成されます。エントリヘッダーを含むキーの合計サイズは256バイトです。これは要件ではありませんが、アラインメントを考慮する必要があります。 Lookup Dictionaryのハッシュサイズは53です。さらに、このインスタンスはRAM( local_size = 0 )に値を保存しないため、必要に応じて常にFlashから読み取ります。
デモでは、NVRAMDRVドライバーがRAMのフラッシュメモリをエミュレーションするように使用されます。アクセス関数は、このインスタンス用に構成されたRAMDRV_READ、RAMDRV_WRITE、RAMDRV_ERASEです。
_regdef_nvol3_entryは、NVOL APIで使用できます。 NVOL APIはわずかに請求されているため、簡単なレジストリの例が提供されます。
提供されたテストの例は、GitHubコーダースパースでコンパイルして実行できます。この再投稿のコードスペースを開くだけで、開く端子にタイプmakeが開いています(端子が開いていない場合は、 ctrl + `を使用して端末を開きます)。これで、ターミナルで./build/nvolを入力してNVOLの例を開始できます。すべてのコマンドは、コードスペースの端子で実行できます。
サンプルプログラムが起動すると、コマンドシェルが開き、以下が表示されます。
@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.
# >
まず、レジストリに値を入力するための簡単なスクリプトを実行します。プロンプトタイプで:
source ./test/reg.sh
これにより、レジストリに値が記入されるはずです。レジストリタイプをテストするためのすべてのコマンドをリストするには? reg 、次のリストを表示する必要があります。
# >? reg
reg [key] [value]
regadd <key> <value>
regdel <key>
regerase
regstats
regtest [repeat]
# >
これで、REGコマンドを使用して、レジストリを表示および更新できます。
# >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
これらのコマンドはすべて、 src/registry/registrycmd.cに実装されています。実装は直感的で自明であり、それ以上の説明を必要としないはずです。
シェルはそれ自体がプロジェクトですが、デモンストレーションの目的でこの例にのみ含まれています。拡張は簡単です。使用?この例で実装されたコマンドの完全なリストを表示します。
レジストリが文字列を使用してエントリをインデックス化する場合、文字列テーブルは整数値を使用します。このアプローチでは、RAMリソースが少なくなります。
この例では、文字列テーブルに値を入力するスクリプトもあります。プロンプトタイプで:
source ./test/strtab.sh
繰り返しますが、ここで、文字列テーブルを簡単なコマンドでリストできます。
# >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.
# >
レジストリと同様に、文字列テーブルの例は、文字列テーブルの文字列に区切られたインデックス値を置き換えるために、文字列置換ライブラリにそれ自体を登録します。例えば:
# >echo "<1>"
The end of the world is our playground.
# >
デモは、RAMのFlashにエミュレーションドライバーを使用します。これは、「CRC/Drivers/RAMDRV.H/C」に実装されています。
同じディレクトリでは、ファイル「spiflash.h/c」で実際のフラッシュチップのサンプルドライバーが証明されています。これは、Chibios/HAL SPIドライバーを使用して実装されており、NVOLを独自のプラットフォームに移植するための適切な出発点になるはずです。