NVOL เป็นรีจิสทรีแฟลชถาวรซึ่งมักเรียกกันว่าการจำลอง EEPROM มันมี API พื้นฐานสำหรับการอ่านและการเขียนคู่คีย์/ค่าที่จัดทำดัชนีไปและจากหน่วยความจำแฟลชคล้ายกับรีจิสทรี เป็นสิ่งสำคัญที่จะกล่าวถึงว่าทั้งคีย์และค่าจะถูกเก็บไว้ในแฟลชทำให้สามารถปรับเปลี่ยนรีจิสทรีในช่วงรันไทม์ คุณสมบัติบางอย่างของ NVOL รวมถึง:
ไลบรารีมีสองตัวเลือกในการจัดการการจัดเก็บข้อมูล: ตัวเลือก 1: บันทึกรายการลงในหน่วยความจำแฟลชทันทีเมื่อมีการเปลี่ยนแปลง ตัวเลือกที่ 2: จัดเก็บรายการใน RAM และบันทึกลงในหน่วยความจำแฟลชตามความต้องการ
ข้อเสียของหน่วยความจำแฟลชคือไม่สามารถลบหรือเขียนเป็นไบต์เดียว หน่วยความจำแฟลชสามารถลบและเขียนในบล็อกขนาดใหญ่เท่านั้น ขนาดบล็อกลบทั่วไปอาจเป็น 4K หรือ 8K ไบต์ สำหรับ NVOL การใช้งานแฟลชควรสนับสนุนการเขียนบางส่วนซึ่งบล็อกลบอาจเขียนหลายครั้งตราบเท่าที่บิตเปลี่ยนจาก“ 1” (สถานะลบ) เป็น“ 0” (สถานะโปรแกรม) เท่านั้น
สำหรับแฟลชหน้านี้ถือเป็นขนาดบล็อกที่เล็กที่สุดที่สามารถลบได้ แต่ละภาคสามารถสร้างขึ้นจากหนึ่งหน้าหรือมากกว่าเหล่านี้
ภาคแรกจะถูกลบครั้งแรก รายการรีจิสทรีใหม่จะถูกเพิ่มตามลำดับลงในแฟลช เมื่อมีการอัปเดตรายการรายการเก่าจะถูกทำเครื่องหมายว่าไม่ถูกต้องและรายการใหม่จะถูกเขียนขึ้นตามที่อยู่แฟลชถัดไป เมื่อภาคแรกถึงกำลังการผลิตรายการที่ถูกต้องทั้งหมดจะถูกคัดลอกไปยังภาคที่สองและภาคแรกจะถูกลบ กระบวนการนี้ทำซ้ำตัวเอง
NVOL จัดการอย่างมีประสิทธิภาพและติดตามรายการที่ถูกต้องและตำแหน่งของพวกเขาบนแฟลช ภาคส่วนได้รับการจัดการแบบไดนามิก
มาโครมีให้เพื่อสร้างอินสแตนซ์คงที่ของ 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 ที่มีสองภาค 32K ในช่วงเริ่มต้นของแฟลช ขนาดทั้งหมดของคีย์รวมถึงส่วนหัวรายการคือ 256 ไบต์ นี่ไม่ใช่ข้อกำหนด แต่ควรคำนึงถึงการจัดตำแหน่ง พจนานุกรมค้นหามีขนาดแฮช 53 นอกจากนี้อินสแตนซ์นี้จะไม่เก็บค่าใด ๆ ใน RAM ( local_size = 0 ) ดังนั้นจะอ่านจากแฟลชเสมอเมื่อจำเป็น
ในการสาธิตไดรเวอร์ NVRAMDRV ถูกใช้เพื่อจำลองหน่วยความจำแฟลชใน RAM ฟังก์ชั่นการเข้าถึงคือ ramdrv_read, ramdrv_write และ ramdrv_erase ที่กำหนดค่าสำหรับอินสแตนซ์นี้
ตอนนี้ _regdef_nvol3_entry สามารถใช้กับ NVOL API ได้ NVOL API ได้รับการริเริ่มเล็กน้อยดังนั้นจึงมีตัวอย่างรีจิสทรีอย่างง่าย
ตัวอย่างการทดสอบที่ให้ไว้สามารถรวบรวมและทำงานในรหัส GitHub เพียงเปิดรหัสสำหรับการทำซ้ำนี้และ make ในเทอร์มินัลที่เปิด (หากเทอร์มินัลไม่ได้เปิดใช้ ctrl + ` เพื่อเปิดเทอร์มินัล) ตอนนี้คุณสามารถเริ่มต้นตัวอย่าง NVOL ได้โดยพิมพ์ ./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 สิ่งนี้ถูกนำไปใช้ใน "CRC/Drivers/Ramdrv.h/C"
ในไดเรกทอรีเดียวกันไดรเวอร์ตัวอย่างสำหรับชิปแฟลชจริงได้รับการพิสูจน์ในไฟล์ "spiflash.h/c" นี่คือการใช้งานโดยใช้ไดรเวอร์ Chibios/Hal SPI และควรเป็นจุดเริ่มต้นที่ดีสำหรับการพอร์ต NVOL ไปยังแพลตฟอร์มของคุณเอง