EEPROM

2010-08-23 5 views
9

सुरक्षित रूप से संग्रहीत और एक्सेस करना मैंने हाल ही में माइक्रोकंट्रोलर के ईईपीरोम में बार-बार-अद्यतन कॉन्फ़िगरेशन चर स्टोर करने की आवश्यकता स्थापित की है। कार्यक्रम के लिए राज्य को जोड़ने से तुरंत, EEPROM में अप्रारंभीकृत डेटा के बारे मेंEEPROM

  • का पता लगाने (यानी पहले बूट) में चिंता करने की एक बलों
  • परिवर्तित करने या पुराने फर्मवेयर संस्करणों से डेटा प्राप्त नहीं हो, और
  • कई संरचनाओं के संबोधित जिनमें से प्रत्येक फर्मवेयर अपडेट में बढ़ सकता है।

व्यापक गुगलिंग ने केवल एक लेख बदल दिया है जो keeping your EEPROM data valid through firmware updates को संबोधित करता है। क्या किसी ने उस आलेख में चर्चा की गई दृष्टिकोण का उपयोग किया है? क्या कोई बेहतर वैकल्पिक दृष्टिकोण है?

उत्तर

7

व्यक्तिगत रूप से, मैं एक "टैग की गई तालिका" प्रारूप पसंद करता हूं।

इस प्रारूप में, आपका डेटा "टेबल" की एक श्रृंखला में विभाजित है। प्रत्येक तालिका में एक शीर्षलेख होता है जो एक अनुमानित प्रारूप और एक शरीर का पालन करता है जो आपको इसकी आवश्यकता के अनुसार बदल सकता है।

यहाँ तालिकाओं में से एक की तरह लग रहे हैं का एक उदाहरण है:

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 

मैं बहुत अधिक डेटा का भंडारण नहीं कर रहा था, इसलिए मैं शीर्षक में प्रत्येक क्षेत्र के लिए एक एकल बाइट का इस्तेमाल किया। आप जो भी आकार चाहते हैं उसका उपयोग कर सकते हैं, जब तक आप इसे कभी नहीं बदलते। डेटा टेबल ईईपीरोम में एक के बाद एक लिखा जाता है।

जब आपके फर्मवेयर को ईईपीरोम से डेटा को पढ़ने की आवश्यकता होती है, तो यह पहली तालिका में पढ़ना शुरू कर देता है। यदि फर्मवेयर तालिका आईडी को पहचानता है और सूचीबद्ध तालिका संस्करण का समर्थन करता है, तो यह तालिका के शरीर के बाहर डेटा को लोड करता है (निश्चित रूप से चेकसम को सत्यापित करने के बाद)। यदि आईडी, संस्करण, या चेकसम चेक आउट नहीं करते हैं, तो तालिका बस छोड़ दी जाती है। श्रृंखला में अगली तालिका का पता लगाने के लिए लंबाई क्षेत्र का उपयोग किया जाता है। जब फर्मवेयर शून्य की लंबाई वाली तालिका देखता है, तो यह जानता है कि यह डेटा के अंत तक पहुंच गया है और प्रक्रिया के लिए कोई और टेबल नहीं है।

मुझे यह प्रारूप लचीला लगता है (मैं किसी भी प्रकार के डेटा को किसी तालिका के शरीर में जोड़ सकता हूं) और मजबूत (हेडर प्रारूप निरंतर रखें और डेटा टेबल दोनों आगे और पीछे की ओर संगत होंगे)।

कुछ चेतावनी हैं, हालांकि वे बहुत बोझिल नहीं हैं। सबसे पहले, आपको यह सुनिश्चित करने की ज़रूरत है कि आपका फर्मवेयर उस मामले को संभाल सकता है जहां महत्वपूर्ण डेटा या तो तालिका में नहीं है या असमर्थित प्रारूप संस्करण का उपयोग कर रहा है। आपको ईईपीरोम स्टोरेज एरिया के पहले बाइट को शून्य पर भी आरंभ करने की आवश्यकता होगी (ताकि पहले बूट पर, आप कचरे में लोड करना शुरू नहीं कर रहे हैं कि यह डेटा है)। चूंकि प्रत्येक तालिका इसकी लंबाई जानता है, इसलिए तालिका को विस्तार या संक्षिप्त करना संभव है; हालांकि, आपको यह सुनिश्चित करने के लिए शेष तालिका भंडारण क्षेत्र को चारों ओर स्थानांतरित करना होगा ताकि कोई "छेद" न हो (यदि टेबल की पूरी श्रृंखला आपके डिवाइस की स्मृति में फिट नहीं हो सकती है, तो यह प्रक्रिया परेशान हो सकती है)। व्यक्तिगत रूप से, मुझे इनमें से कोई भी समस्या का बड़ा होने के लिए नहीं मिला है, और यह डेटा संग्रहण के कुछ अन्य तरीकों का उपयोग करके सहेजने वाली परेशानी के लायक है।

+0

यह फ़र्मवेयर संस्करणों के बीच तालिका आकार में परिवर्तनों से निपटने के लिए एक महान समाधान की तरह लगता है। क्या आपके पास डेटा को डुप्लिकेट करने के अलावा बिजली-हानि मध्य-लेखन के प्रति सहिष्णु बनाने के लिए कोई सलाह है? –

+2

संपूर्ण तालिका को अमान्य चेकसम के साथ लिखें, फिर (एक अलग लेनदेन में) वापस जाएं और सही चेकसम लिखें। यदि मध्य-लेखन में कोई समस्या है, तो डेटा में पढ़ने पर आपका चेकसम गलत होगा। – bta

+0

यह एक सुरुचिपूर्ण समाधान है जो कार्यान्वित करने के लिए तुच्छ है: निम्नलिखित के लिए धन्यवाद। –

3

निगेल जोन्स ने आपके संदर्भ में कुछ मूलभूत बातें शामिल की हैं। बहुत सारे विकल्प हैं।

आपके पास एक विकल्प है, जिसमें बहुत से कमरे हैं, संरचनाओं के बजाय कुंजी-मूल्य जोड़े संग्रहीत कर रहे हैं। फिर आप सबकुछ मिटाए बिना एक मान (इसे जोड़कर) अपडेट कर सकते हैं। यह उन उपकरणों में सबसे उपयोगी है जिनके पास सीमित संख्या में मिटा चक्र हैं। आपके पढ़ने की दिनचर्या को शुरुआत से स्कैन करने की आवश्यकता होगी, प्रत्येक बार जब कुंजी का सामना करना पड़ता है तो मूल्यों को अपडेट करना होगा।बेशक आपके अपडेट दिनचर्या में "कचरा कलेक्टर" होना चाहिए जो स्मृति पूर्ण होने पर चलता है।

अपडेट के बीच में डिवाइस त्रुटियों और सत्ता-चढ़ाव को संभालने के लिए, हम आम तौर पर डेटा की कई प्रतियां की दुकान। सबसे आसान तरीका यह निर्धारित करने के लिए कि कौन सा नया है, अनुक्रम संख्या का उपयोग करके डिवाइस के हिस्सों के बीच पिंगपोंग करना है। प्रत्येक खंड पर एक सीआरसी इसका सत्यापन करने के लिए प्रयोग किया जाता है। यह अनियंत्रित डेटा मुद्दे को भी संबोधित करता है।

कुंजी-मूल्य संस्करण के लिए आपको प्रत्येक लिखने के बाद नया सीआरसी जोड़ना होगा।

+0

मुझे वास्तव में सिद्धांत में इस दृष्टिकोण की आवाज़ पसंद है, लेकिन दुर्भाग्यवश यह संभव नहीं है कि इसे संभव बनाने के लिए पर्याप्त EEPROM उपलब्ध हो: ATmega328p पर केवल 1 केबी। विवरण के लिए धन्यवाद! –