NVOL - это постоянный реестр вспышки, который часто называют эмуляцией EEPROM. Он предлагает базовый API для чтения и написания индексированных паров ключей/значений в флэш -памяти, аналогично реестру. Важно отметить, что как ключ, так и значение хранятся во флэш -памяти, что позволяет изменить реестр во время выполнения. Некоторые из особенностей NVOL включают:
Библиотека предоставляет два варианта управления хранилищем данных: Опция 1: немедленно сохранить записи в флэш -память при изменении. Вариант 2: Храните записи в ОЗУ и сохранить в флэш -памяти по требованию.
Недостаток флэш -памяти заключается в том, что ее нельзя стерто или записано в одиночных байтах. Флэш -память может быть стерта и написана только в больших блоках. Типичный размер блока стирания может составлять 4K или 8K байт. Для NVOL реализации Flash должны поддерживать частичные записи, где стертый блок может быть записан в несколько раз, если биты меняются только с «1» (стерто) на «0» (запрограммированное состояние).
Для вспышки страница считается наименьшим размером блока, который может быть стерт. Каждый сектор может быть составлен из одной или нескольких из этих страниц.
Первый сектор первоначально стирается. Новые записи реестра добавляются последовательно во Flash. Когда запись обновляется, старая запись помечена как недействительная, а новая запись записана на следующем доступном адресу Flash. Как только первый сектор достигает емкости, все действительные записи копируются во второй сектор, а затем стерт первый сектор. Этот процесс повторяется.
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*/
) ;
Это создает NVOL с двумя 32 -километровыми секторами в начале вспышки. Общий размер ключа, включая заголовок входа, составляет 256 байт. Это не требование, но выравнивание должно быть принято во внимание. Словарь Lookup имеет размер хэша 53. Кроме того, этот экземпляр не будет хранить каких -либо значений в ОЗУ ( local_size = 0 ), поэтому всегда будет читать их из вспышки при необходимости.
В демонстрации используется драйвер NVRAMDRV, что эмуляция флэш -память в ОЗУ функциям доступа является RAMDRV_READ, RAMDRV_WRITE и RAMDRV_ERASE, настроенные для этого экземпляра.
Теперь _regdef_nvol3_entry можно использовать с API NVOL. API NVOL немного изобретен, поэтому приведен простой пример реестра.
Приведенный пример испытаний может быть скомпилирован и запускается в коде GitHub. Просто откройте кодовое пространство для этой репостории и типа make в терминале, которая открывается (если терминал не открыт, используйте ctrl + ` чтобы открыть терминал). Теперь вы можете начать пример NVOL, набрав ./build/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.
# >
Демо использует драйвер эмуляции для вспышки в ОЗУ. Это реализовано в «CRC/Drivers/Ramdrv.h/C».
В том же каталоге пример драйвера для реального флэш -чипа находится в файлах «spiflash.h/c». Это было реализовано с использованием драйвера SPI Chibios/Hal и должно быть хорошей отправной точкой для переноса NVOL на вашу собственную платформу.