NVOL adalah registri flash yang persisten, sering disebut sebagai emulasi EEPROM. Ini menawarkan API dasar untuk membaca dan menulis pasangan kunci/nilai yang diindeks ke dan dari memori flash, mirip dengan registri. Penting untuk menyebutkan bahwa kunci dan nilai disimpan dalam flash, memungkinkan untuk modifikasi registri selama runtime. Beberapa fitur NVOL meliputi:
Perpustakaan menyediakan dua opsi untuk mengelola penyimpanan data: Opsi 1: Segera simpan entri ke memori flash kapan pun diubah. Opsi 2: Simpan entri dalam RAM dan simpan ke memori flash sesuai permintaan.
Kerugian dari memori flash adalah bahwa ia tidak dapat dihapus atau ditulis dalam byte tunggal. Memori flash hanya dapat dihapus dan ditulis dalam blok besar. Ukuran blok penghapus khas mungkin 4K atau 8K byte. Untuk NVOL, implementasi Flash harus mendukung penulisan parsial, di mana blok yang dihapus dapat ditulis beberapa kali selama bit hanya berubah dari "1" (keadaan terhapus) menjadi "0" (keadaan terprogram).
Untuk flash, halaman dianggap sebagai ukuran blok terkecil yang dapat dihapus. Setiap sektor dapat terdiri dari satu atau lebih halaman ini.
Sektor pertama awalnya dihapus. Entri registri baru ditambahkan secara berurutan ke flash. Ketika entri diperbarui, entri lama ditandai sebagai tidak valid dan entri baru ditulis pada alamat flash berikutnya yang tersedia. Setelah sektor pertama mencapai kapasitas, semua entri yang valid disalin ke sektor kedua dan sektor pertama kemudian dihapus. Proses ini berulang.
NVOL secara efisien menangani dan melacak entri yang valid dan lokasi mereka di Flash. Sektor dikelola secara dinamis.
Makro tersedia untuk membuat instance statis NVOL, yang kemudian dapat digunakan dengan API. Contoh deklarasi adalah:
#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*/
) ;
Ini menciptakan NVOL dengan dua sektor 32k di awal flash. Ukuran total kunci, termasuk header entri, adalah 256 byte. Ini bukan persyaratan, tetapi penyelarasan harus diperhitungkan. Kamus pencarian memiliki ukuran hash 53. Selanjutnya, contoh ini tidak akan menyimpan nilai apa pun dalam RAM ( local_size = 0 ) jadi akan selalu membacanya dari flash saat dibutuhkan.
Dalam demo driver NVRAMDRV digunakan bahwa emulasi memori flash dalam RAM, fungsi aksesnya adalah RAMDRV_READ, RAMDRV_WRITE dan RAMDRV_ERASE yang dikonfigurasi untuk contoh ini.
Sekarang _regdef_nvol3_entry dapat digunakan dengan API NVOL. API NVOL sedikit terbukti sehingga contoh registri sederhana disediakan.
Contoh pengujian yang disediakan dapat dikompilasi dan dijalankan dalam codespace github. Cukup buka codespace untuk repostory ini dan ketik make di terminal yang terbuka (jika terminal tidak terbuka penggunaan ctrl + ` untuk membuka terminal). Sekarang Anda dapat memulai contoh NVOL dengan mengetik ./build/nvol di terminal. Semua perintah dapat dieksekusi di terminal codespace.
Ketika program contoh diluncurkan, shell perintah akan terbuka dan akan menampilkan yang berikut:
@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.
# >
Pertama, kami akan menjalankan skrip sederhana untuk mengisi registri kami dengan nilai -nilai. Di tipe prompt:
source ./test/reg.sh
Ini harus mengisi registri dengan nilai. Untuk mendaftar semua perintah untuk menguji jenis registri ? reg , itu harus menampilkan daftar berikut:
# >? reg
reg [key] [value]
regadd <key> <value>
regdel <key>
regerase
regstats
regtest [repeat]
# >
Kami sekarang dapat menggunakan perintah REG untuk melihat dan memperbarui registri:
# >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
Semua perintah ini diimplementasikan dalam src/registry/registrycmd.c . Implementasinya intuitif dan jelas dan tidak memerlukan penjelasan lebih lanjut.
Shell adalah proyek di dalam dan dari dirinya sendiri, tetapi hanya termasuk dalam contoh ini untuk tujuan demonstrasi. Mudah diperpanjang. Menggunakan ? Untuk melihat daftar lengkap perintah yang diterapkan untuk contoh ini.
Di mana registri menggunakan string untuk mengindeks entri, tabel string menggunakan nilai integer. Pendekatan ini membutuhkan lebih sedikit sumber daya RAM.
Untuk contoh ini ada juga skrip untuk mengisi tabel string dengan nilai. Di tipe prompt:
source ./test/strtab.sh
Sekali lagi, kita sekarang dapat mencantumkan tabel string dengan perintah sederhana:
# >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.
# >
Seperti registri, contoh tabel string mendaftarkan dirinya dengan pustaka substitusi string untuk menggantikan nilai indeks yang dibatasi dengan <> dengan string dalam tabel string. Misalnya:
# >echo "<1>"
The end of the world is our playground.
# >
Demo menggunakan driver emulasi untuk flash in RAM. Ini diimplementasikan dalam "CRC/Driver/RAMDRV.H/C".
Dalam direktori yang sama, driver sampel untuk chip flash nyata dipilih dalam file "spiflash.h/c". Ini dilibatkan menggunakan driver Chibios/HAL SPI dan harus menjadi titik awal yang baik untuk porting NVOL ke platform Anda sendiri.