سؤال

أحتاج إلى تخزين عناصر طول متفاوتة في قائمة انتظار دائرية في رقاقة فلاش. سيكون لكل عنصر مغلفاته حتى أتمكن من معرفة مقدار كبير وأين يبدأ العنصر التالي. عندما يكون هناك ما يكفي من العناصر في المخزن المؤقت، فإنه سوف يختتم إلى البداية.

ما هي طريقة جيدة لتخزين قائمة انتظار دائرية في رقاقة فلاش؟

هناك إمكانية لعشرات الآلاف من العناصر التي أرغب في تخزينها. لذا بدءا من البداية والقراءة إلى نهاية المخزن المؤقت ليس مثاليا لأنه سيستغرق وقتا للبحث في النهاية.

أيضا، لأنه دائري، أحتاج إلى أن أكون قادرا على التمييز بين العنصر الأول من الأخير.

المشكلة الأخيرة هي أن هذا مخزن في الفلاش، لذلك يتم مسح كل كتلة وقتا طويلا ولا يمكن القيام به فقط عدد مرات من المرات لكل كتلة.

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

المحلول

أولا، إدارة كتلة:

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

عند بدء التشغيل، يقرأ التعليمات البرمجية رؤوس كل كتلة بدوره، ويحدد الكتل الأولى والأخيرة في التسلسل الذي هو Nأنا + 1. = (N.أنا + 1) modulo ك. احرص على عدم الخلط بين الكتل المسحونة (رقم كتلة مثل 0xFFFF) أو بيانات تالفة بطريقة أو بأخرى (مثل محو غير مكتمل).

داخل كل كتلة

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

إذا كنت ترغب في الحصول على سجلات متغيرة الحجم، ولكن تجنب المسح الخطي، فيمكنك أن يكون لديك رأس محدد جيدا على كل سجل. على سبيل المثال استخدام 0 كمسؤول سجل، و الكربون-نسود (أو COBS / R.-نسود) كل سجل. أو استخدم بايت من اختيارك كمسؤول، و "الهروب" الذي بايت إذا حدث في كل سجل (يشبه بروتوكول PPP).

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

مسح الجدولة

بالنسبة لبعض رقائق ذاكرة الفلاش، يمكن أن تتخذ محو الكتلة وقتا كبيرا - على سبيل المثال 5 ثوان. النظر في جدولة محو كامرأة خلفية قليلا "في وقت مبكر". على سبيل المثال عندما تكون الكتلة الحالية هي x٪ بالكامل، ثم ابدأ في محو الكتلة التالية.

ترقيم القياس

قد ترغب في نسق السجلات. الطريقة التي قمت بها في الماضي هي وضع، في رأس كل كتلة، الرقم القياسي للسجل الأول. ثم يتعين على البرنامج الحفاظ على عدد أعداد كل سجل داخل الكتلة.

المجموع الاختباري أو CRC.

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

نصائح أخرى

احتفظ بكتلة منفصلة تحتوي على مؤشر لبدء السجل الأول ونهاية السجل الأخير. يمكنك أيضا الحفاظ على مزيد من المعلومات مثل إجمالي عدد السجلات، إلخ.

حتى تنفد في البداية من المساحة، فإن إضافة سجلات بسيطة مثل كتابةها إلى نهاية المخزن المؤقت وتحديث مؤشر الذيل.

كما تحتاج إلى استعادة المساحة، حذف سجلات كافية حتى تتمكن من تطراف سجلك الحالي. قم بتحديث مؤشر الرأس أثناء حذف السجلات.

ستحتاج إلى تتبع مقدار مساحة إضافية تم تحريرها. إذا كنت تبقي مؤشرا لإنهاء السجل الأخير، في المرة التالية التي تحتاجها إلى إضافة سجل، يمكنك مقارنة ذلك مع المؤشر إلى السجل الأول لتحديد ما إذا كنت بحاجة إلى حذف أي سجل آخر.

أيضا، إذا كان هذا NAND، فستحتاج أنت أو وحدة تحكم الفلاش إلى إجراء إزالة وارتدائية، ولكن يجب أن تكون كل ذلك في طبقة أقل من تخصيص مساحة المخزن المؤقت الدائري.

أعتقد أنني أحصل عليه الآن. يبدو أن أكبر مشكلتك ستكون، بعد أن تملأ المساحة المتاحة للتسجيل، ماذا يحدث بعد ذلك؟ يجب على البيانات الجديدة الكتابة فوق أقدم البيانات، والتي أعتقد أن ما تعنيه بمخزن مؤقت دائري. ولكن نظرا لأن البيانات ليست ثابتة، فيمكنك الكتابة فوق أكثر من سجل واحد.

أفترض أن كمية التباين في الطول مرتفع بما فيه الكفاية التي تحشد كل شيء إلى طول ثابت ليس خيارا.

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

سجل منفصل يمكنه تتبع البداية؛ هذه هي أقدم البيانات التي لم يتم الكتابة عليها بعد. إذا ذهبت لقراءة البيانات، فهذا ستبدأ.

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

على الأقل، ربما هذا ما سأفعله. هذر

أرى ثلاثة خيارات:

Option1: هو لوحة كل شيء على نفس الحجم، هذا بسيط، تخزين مؤشر إلى رأس وذيل المخزن المؤقت حتى تعرف أين تكتب وأين تبدأ في القراءة، استخدم حجم كل كائن للحصول على إزاحة إلى التالي، هذا يعني أنك بحاجة إلى عرض المخزن المؤقت أثناء وجود قائمة مرتبطة، و AKA بطيئة إذا كنت بحاجة إلى البند 5000.

Option2: هو تخزين المؤشرات فقط إلى البيانات الحقيقية في المخزن المؤقت الدائري، بهذه الطريقة عندما لا يتعين عليك حلقة حولك للتعامل مع حجم Mis-Miss. إذا قمت بتخزين البيانات الحقيقية في المخزن المؤقت الدائري ولا يتم تشغيلها، فيمكنك تشغيلها في مواقف حيث يمكنك تجاوز العناصر المتعددة مع كائن بيانات جديد واحد، أفترض أن هذا ليس موافقا.

تخزين البيانات الفعلية في أي مكان آخر في الفلاش، معظم الفلاش سيكون لديه نوع من التآكل المضيف، إذا كان الأمر كذلك لا داعي للقلق بشأن الكتابة فوق نفس الموقع عدة مرات، فسيكون IC معرفة مكان تخزينه بالفعل على رقاقة، مجرد الكتابة إلى المساحة الحرة المتاحة التالية.

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

الخيار 3: إذا كان الكائن يمكن أن يكون حقا أي حجم، في النقطة التي يجب عليك فيها استخدام نظام ملفات فقط، اسم الملفات بالترتيب والنسخة مرة أخرى عندما تعينك بالكامل في الاعتبار إذا كان دخولك الجديد كبيرا، فقد تضطر إلى حذف إدخالات قديمة متعددة لتناسب ذلك. هذا مجرد امتداد للخيار 2 كخيار 2 هو في العديد من الطرق لنظام الملفات البسيطة.

يمكن إجراء "التعميم" في فلاش على أساس حجم الكتلة، مما يعني أنه يجب أن تعلن مقدار كتل الفلاش التي تخصصها لهذا المخزن المؤقت.

سيكون الحجم الفعلي للمخزن المؤقت في كل مرة معينة بين n-1 (n هو عدد الكتل) و n.

يجب أن تبدأ كل كتلة برأس يحتوي على رقم متسلسل أو طابع زمني يمكن استخدامه لتحديد الكتلة الأكبر من الآخر.

كل قطعة مغلفة مع رأس وتذييل الصفحة. يحتوي الرأس الافتراضي على ما تريد ولكن وفقا لهذا الرأس، يجب أن تعرف حجم العنصر. التذييل الافتراضي هو 0xFFFFFFFFFF. تشير هذه القيمة إلى إنهاء فارغة.

في ذاكرة الوصول العشوائي، يجب عليك حفظ مؤشر إلى أقدم كتلة وأحدث كتلة ومؤشر إلى أقدم عنصر وأحدث العنصر. على السلطة حتى تذهب فوق جميع الكتل البحث عن الكتل ذات الصلة وتحميل هذا الأعضاء.

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

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

إيلاء الاهتمام الذي لا يتم حفظه دائرية المخزن المؤقت في الفلاش ولكن يحتوي الفلاش فقط على كتل مع العناصر التي يمكنك تحديدها وفقا لرؤوس الكتل ورؤوس العناصر ما هو ترتيب هذه العناصر

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