سؤال

لقد أنشأت مؤخرًا الحاجة إلى تخزين متغيرات التكوين المكتظة بشكل غير متكرر في EEPROM من متحكم. إضافة الدولة إلى البرنامج على الفور يجبر المرء على الفور للقلق

  • الكشف عن البيانات غير المخصصة في EEPROM (أي التمهيد الأول) ،
  • تحويل البيانات أو إبطالها من إصدارات البرامج الثابتة القديمة ، و
  • معالجة هياكل متعددة ، كل منها قد تنمو في تحديثات البرامج الثابتة.

قامت Googling الواسعة بتشغيل مقال واحد فقط يعالج إبقاء بيانات EEPROM صالحة من خلال تحديثات البرامج الثابتة. هل استخدم أي شخص النهج الذي تمت مناقشته في هذه المقالة؟ هل هناك نهج بديل أفضل؟

هل كانت مفيدة؟

المحلول

أنا شخصياً أفضل تنسيق "الجدول الموسومة".

في هذا التنسيق ، يتم تقسيم بياناتك إلى سلسلة من "الجداول". يحتوي كل جدول على رأس يتبع تنسيقًا يمكن التنبؤ به وجسم يمكن أن يتغير كما تحتاج إليه.

إليك مثال على شكل أحد الجداول:

Byte 0: Table Length   (in 16-bit words)
Byte 1: Table ID       (used by firmware to determine what this data is)
Byte 2: Format Version (incremented every time the format of this table changes)
Byte 3: Checksum       (simple sum-to-zero checksum)
Byte 4: Start of body
...
Byte N: End of body

لم أكن أقوم بتخزين الكثير من البيانات ، لذلك استخدمت بايت واحد لكل حقل في الرأس. يمكنك استخدام أي حجم تحتاجه ، طالما لم تقم بتغييره أبدًا. تتم كتابة جداول البيانات واحدة تلو الأخرى في EEPROM.

عندما يحتاج البرنامج الثابت إلى قراءة البيانات خارج EEPROM ، فإنه يبدأ في القراءة في الجدول الأول. إذا كان البرنامج الثابت يتعرف على معرف الجدول ويدعم إصدار الجدول المدرج ، فإنه يقوم بتحميل البيانات من جسم الجدول (بعد التحقق من التحقق من الاختبارات ، بالطبع). إذا لم يتم التحقق من المعرف أو الإصدار أو الفحص ، فسيتم تخطي الجدول ببساطة. يتم استخدام حقل الطول لتحديد موقع الجدول التالي في السلسلة. عندما ترى البرامج الثابتة جدولًا بطول صفر ، فإنه يعلم أنه قد وصل إلى نهاية البيانات وأنه لا يوجد المزيد من الجداول للمعالجة.

أجد هذا التنسيق مرنًا (يمكنني إضافة أي نوع من البيانات في جسم الجدول) وقويًا (حافظ على تنسيق الرأس ثابتًا وستكون جداول البيانات متوافقة إلى الأمام والخلف).

هناك اثنين من التحذيرات ، على الرغم من أنهما ليسا مرهقة للغاية. أولاً ، تحتاج إلى التأكد من أن البرنامج الثابت الخاص بك يمكنه التعامل مع الحالة التي لا تكون فيها البيانات المهمة إما في الجدول أو تستخدم إصدار تنسيق غير مدعوم. ستحتاج أيضًا إلى تهيئة البايت الأول لمنطقة تخزين EEPROM إلى الصفر (بحيث في أول التمهيد ، لا تبدأ في التحميل في تفكير القمامة بأن البيانات). نظرًا لأن كل جدول يعرف طوله ، فمن الممكن توسيع أو تقليص جدول ؛ ومع ذلك ، يجب عليك تحريك بقية منطقة تخزين الجدول من أجل التأكد من عدم وجود "ثقوب" (إذا كانت سلسلة الجداول بأكملها لا يمكن أن تتناسب مع ذاكرة جهازك ، فقد تكون هذه العملية مزعجة). أنا شخصياً لا أجد أن أيًا من هذه المشكلة كبيرة ، ويستحق الأمر أن أوضح أكثر من استخدام بعض الطرق الأخرى لتخزين البيانات.

نصائح أخرى

غطت نايجل جونز بعض الأساسيات في مرجعك. هناك الكثير من البدائل.

بديل واحد ، لديك الكثير من المساحات ، يقوم بتخزين أزواج القيمة الرئيسية بدلاً من الهياكل. ثم يمكنك تحديث قيمة واحدة (عن طريق إلحاقها) دون محو كل شيء. هذا مفيد للغاية في الأجهزة التي لديها عدد محدود من دورات المسح. سيحتاج روتين القراءة إلى مسح من البداية ، وتحديث القيم في كل مرة يتم فيها مواجهة المفتاح. بالطبع ، سيحتاج روتين التحديث الخاص بك إلى الحصول على "جامع القمامة" الذي يبدأ عندما تكون الذاكرة ممتلئة.

للتعامل مع أخطاء الجهاز ومواد الطاقة في منتصف التحديثات ، عادة ما نقوم بتخزين نسخ متعددة من البيانات. إن أبسط طريقة هي pingpong بين نصفي الجهاز باستخدام رقم التسلسل لتحديد ما هو أحدث. يتم استخدام CRC في كل قسم للتحقق منه. هذا يعالج أيضًا مشكلة البيانات غير المخصصة.

بالنسبة لإصدار قيمة المفاتيح ، ستحتاج إلى إلحاق CRC الجديد بعد كل كتابة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top