NVOL هو سجل فلاش مستمر ، وغالبًا ما يشار إليه باسم مضاهاة EEPROM. يوفر واجهة برمجة تطبيقات أساسية لقراءة وكتابة أزواج المفتاح/القيمة المفهرسة من وإلى ذاكرة فلاش ، على غرار السجل. من المهم أن نذكر أنه يتم تخزين كل من المفتاح والقيمة في فلاش ، مما يسمح بتعديل السجل أثناء وقت التشغيل. تشمل بعض ميزات NVOL:
توفر المكتبة خيارين لإدارة تخزين البيانات: الخيار 1: احفظ إدخالات على الفور في ذاكرة الفلاش كلما تغيرت. الخيار 2: تخزين إدخالات في ذاكرة الوصول العشوائي وحفظها لفلاش الذاكرة عند الطلب.
عيب ذاكرة الفلاش هو أنه لا يمكن محوها أو كتابتها بالبايت المفرد. لا يمكن محو ذاكرة الفلاش إلا في كتل كبيرة. قد يكون حجم كتلة محو نموذجي 4K أو 8K بايت. بالنسبة إلى NVOL ، يجب أن تدعم تطبيقات الفلاش عمليات الكتابة الجزئية ، حيث يمكن كتابة كتلة محوّة عدة مرات طالما تغيرت البتات فقط من "1" (الحالة المحوّة) إلى "0" (الحالة المبرمجة).
بالنسبة للفلاش ، تعتبر الصفحة أصغر حجم كتلة يمكن محوها. يمكن أن يتكون كل قطاع من واحد أو أكثر من هذه الصفحات.
تم مسح القطاع الأول في البداية. تتم إضافة إدخالات التسجيل الجديدة بالتتابع إلى الفلاش. عند تحديث إدخال ، يتم تمييز الإدخال القديم على أنه غير صالح ويتم كتابة إدخال جديد في عنوان الفلاش التالي المتاح. بمجرد أن يصل القطاع الأول إلى السعة ، يتم نسخ جميع الإدخالات الصالحة إلى القطاع الثاني ثم يتم مسح القطاع الأول. هذه العملية تكرر نفسها.
يقوم 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 مع قطاعين 32K في بداية الفلاش. الحجم الكلي للمفتاح ، بما في ذلك رأس الدخول ، هو 256 بايت. هذا ليس شرطا ، ولكن ينبغي أن تؤخذ المحاذاة في الاعتبار. يحتوي قاموس Lookup على حجم التجزئة 53. علاوة على ذلك ، لن يخزن هذا المثيل أي قيم في ذاكرة الوصول العشوائي ( local_size = 0 ) ، لذا ستقرأها دائمًا من الفلاش عند الحاجة.
في العرض التوضيحي ، يتم استخدام برنامج تشغيل NVRAMDRV لمحاكاة ذاكرة فلاش في ذاكرة الوصول العشوائي ، وهي وظائف الوصول هي RAMDRV_READ و RAMDRV_WRITE و RAMDRV_ERASE التي تم تكوينها لهذا المثيل.
الآن يمكن استخدام _regdef_nvol3_entry مع API NVOL. تم استدعاء API NVOL قليلاً بحيث يتم تقديم مثال للتسجيل البسيط.
يمكن تجميع مثال الاختبار المقدم وتشغيله في مساحة CodeSpace github. ما عليك سوى فتح مساحة CodeSpace لهذا النجوم make في المحطة التي تفتح (إذا لم تكن المحطة مفتوحة ، فاستخدم ctrl + ` لفتح المحطة). يمكنك الآن بدء مثال NVOL عن طريق الكتابة ./build/nvol في المحطة. يمكن تنفيذ جميع الأوامر في محطة CodeSpace.
عند إطلاق برنامج المثال ، سيتم فتح قذيفة الأوامر وسيعرض ما يلي:
@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 . التنفيذ بديهية وتوسيمية ذاتيا ولا ينبغي أن تتطلب أي تفسير آخر.
القشرة هي مشروع في حد ذاته ، ولكن يتم تضمينه فقط في هذا المثال لأغراض التوضيح. من السهل تمديدها. يستخدم ? لرؤية القائمة الكاملة للأوامر التي تم تنفيذها لهذا المثال.
حيث يستفيد السجل من السلاسل لفهرسة الإدخالات ، يستخدم جدول السلسلة قيم عدد صحيح. هذا النهج يتطلب موارد رام أقل.
في هذا المثال ، يوجد أيضًا برنامج نصي لملء جدول السلسلة بالقيم. في نوع المطالبة:
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". تم تنفيذ هذا باستخدام برنامج تشغيل CHIBIOS/HAL SPI ويجب أن يكون نقطة انطلاق جيدة لتنفيذ NVOL إلى النظام الأساسي الخاص بك.