गैर-वाष्पशील मेमोरी में बार-बार लिखें


10

मैं एक ऐसा उपकरण डिजाइन कर रहा हूं जो स्वचालित रूप से तापमान परिवर्तन के साथ भौतिक स्थिति को समायोजित करता है। यदि डिवाइस इसे बंद कर देता है या बिजली बंद हो जाती है तो डिवाइस को यह याद रखना होगा कि यह अंतिम तापमान और स्थिति है। मेरे पास EEPROM में इन मूल्यों को संग्रहीत करने की क्षमता है लेकिन समस्या यह है कि स्थिति और तापमान बहुत तेजी से बदल सकता है। यदि मैं हर बार बदलने के बाद EEPROM को अस्थायी और पॉज़ लिखना चाहता था (1) फर्मवेयर को थोड़ा धीमा कर देता, और (2) एक या दो साल बाद EEPROM को मार देता। तो जैसा कि मैंने देखा कि मेरे विकल्प इस प्रकार हैं ...

1) पावर खोने के बाद डिवाइस को कम समय के लिए चालू रखने के लिए कैपेसिटर / बैटरी का उपयोग करें ताकि मैं उस समय EEPROM को केवल मान लिख सकूं। मुझे यह पसंद नहीं है क्योंकि बोर्ड थोड़े बिजली की भूख है और इसके लिए एक बड़ी टोपी की आवश्यकता होगी। और मेरे पास एक टन खाली जगह नहीं है। और मैं बैटरी और बैटरी धारक / या एक बड़ी टोपी की अतिरिक्त लागत नहीं चाहता।

2) EEPROM के बजाय F-RAM का उपयोग करें ताकि मैं इसे बाहर पहने बिना कई बार खरबों को लिख सकूं। मुझे यह विकल्प पसंद नहीं है क्योंकि FRAM EEPROM की तुलना में थोड़ा अधिक महंगा है और यह उत्पादन उत्पाद (केवल एक नहीं) के लिए है।

3) केवल स्थिति और तापमान को हर 5 मिनट में लिखें। इस तरह से मेरे पास हमेशा एक हालिया स्थिति / अस्थायी रिकॉर्ड है लेकिन मैं हर सेकंड नहीं लिख रहा हूँ इसलिए मेरा कार्यक्रम धीमा नहीं है और EEPROM इतनी तेज़ी से नहीं मरेगा। यह मेरा सबसे अच्छा विकल्प लगता है।

क्या किसी और के पास कोई सुझाव है जो मैं नहीं सोच रहा हूँ?


5
सिर्फ एक प्रश्न। यदि डिवाइस स्वचालित रूप से समायोजित करता है तो यह भौतिक स्थिति है, आपको अंतिम तापमान याद रखने की आवश्यकता क्यों है? जब आप डिवाइस पर फिर से बिजली डालते हैं, तो यह तापमान को अपडेट नहीं करेगा और इसकी स्थिति को समायोजित करेगा?
डैनियल ग्रिलो

1
मैं डैनियल से सहमत हूं। क्या होगा अगर आप बिजली गिराते हैं और परिवेश का तापमान काफी बदल जाता है? पावरअप पर, यदि आपने अंतिम सहेजे गए अस्थायी / स्थान का उपयोग किया है, तो आप वैसे भी गलत स्थान पर होंगे, और डिवाइस बिना परवाह किए आगे बढ़ जाएगा। क्या कोई और आवश्यकता है जो आपके प्रश्न में सूचीबद्ध नहीं है?
डेव

EEPROM युक्ति क्या है - कितने चक्र लिखें?
जेसन एस

जवाबों:


10

आपको एक तकनीक की आवश्यकता है जिसे वियर लेवलिंग कहा जाता है । यह EEPROM में एक ही स्थान पर हर बार आपका डेटा नहीं लिखता है, लेकिन विभिन्न स्थानों का उपयोग करने के लिए कुछ एल्गोरिथ्म का उपयोग करता है। मैंने कॉम्प्लेक्स वियर लेवलिंग एल्गोरिदम के बारे में पढ़ा है, लेकिन मुझे नहीं पता कि निम्न सरल विधि काम क्यों नहीं करेगी।

अपने डेटा में एक 24-बिट काउंटर जोड़ें, ताकि आपका डेटा ब्लॉक उदाहरण के लिए 8 बाइट्स लंबा हो। 24AA64 के पेज 32 बाइट्स लंबे होते हैं, इसलिए 64kb EEPROM में 256 पेज होते हैं। डेटाशीट से:

"जब 32 बाइट्स से कम का लेखन करना होता है, तो बाकी पेजों में डेटा ताज़ा होता है, साथ ही डेटा बाइट्स लिखे जाते हैं। यह पूरे पृष्ठ को एक लिखने के चक्र को सहने के लिए बाध्य करेगा, इस कारण से धीरज प्रति पृष्ठ निर्दिष्ट होता है।"

इसलिए यह 32 बाइट्स पृष्ठ से छोटे डेटा ब्लॉक का उपयोग करने के लिए समझ में नहीं आता है।

पहले पृष्ठ के काउंटर को देखें। यदि यह शून्य है तो आपने उस पृष्ठ के लिए अधिकतम संख्या में चक्र का उपयोग किया है, इसलिए आप अगले पृष्ठ पर जाते हैं और उस काउंटर की जांच करते हैं। तब तक दोहराएं जब तक आपको काउंटर> शून्य न मिल जाए। वह पृष्ठ जो आप वर्तमान में उपयोग कर रहे हैं। माइक्रोचिप के EEPROMs में 1 मिलियन चक्र धीरज है, जिसे आप 64kb EEPROM में अधिकतम 32 बाइट्स प्रति ब्लॉक के दिए गए उदाहरण के साथ 256 मिलियन तक बढ़ा सकते हैं। यह आपके उत्पाद को अलग करने के लिए पर्याप्त होना चाहिए: 40 साल यदि आप हर 5 सेकंड (!) में एक बार लिखते हैं।

आप पहले उपयोग पर अपने EEPROM को इनिशियलाइज़ करना चाहेंगे। आप कैसे जानते हैं कि कब क्या है। प्रारंभ पर एक अद्वितीय हस्ताक्षर लिखने के लिए अंतिम पृष्ठ का उपयोग करें। हस्ताक्षर होने पर प्रत्येक पावर-अप की जांच करें। यदि यह नहीं है तो डिवाइस को इनिशियलाइज़ करना होगा। आप प्रत्येक पृष्ठ में 0xF4240 (1 मिलियन के लिए) के साथ काउंटर पूर्व निर्धारित कर सकते हैं या 0xFF पर सब कुछ साफ़ कर सकते हैं और जब आप पहली बार पृष्ठ का उपयोग करते हैं तो 0xF4240 लिखें।
एक EEPROM को शुरू करने की आवश्यकता है क्योंकि कभी-कभी उत्पादन / परीक्षण प्रक्रिया में एक निश्चित पैटर्न इसे लिखा जाता है।

संपादित करें
पहनने के स्तर को आपकी समस्याओं को हल करना चाहिए, लेकिन मैं अभी भी संधारित्र समाधान पर टिप्पणी करना चाहता हूं। आप कहते हैं कि बोर्ड बल्कि सत्ता-भूखा है, लेकिन हो सकता है कि आप माइक्रोकंट्रोलर / EEPROM की शक्ति को बोर्ड के बाकी हिस्सों से डायोड से अलग कर सकते हैं। जब मुख्य बिजली चली जाती है, तो आपको शायद केवल कुछ एमए की आवश्यकता होगी। 24AA64 5ms से कम में एक पृष्ठ लिखता है, फिर 10mA और 100mV की स्वीकार्य वोल्टेज ड्रॉप पर आपको आवश्यकता होगी

C=ItΔV=10mA5ms100mV=500μF

एक छोटे से सुपरकैप के साथ आसान।

आगे पढने की
डेटशीट 24AA64
EEPROM धीरज ट्यूटोरियल


EEPROM का धीरज प्रति पृष्ठ (कम से कम 24AA64 और अन्य EEPROMs जो मैंने उपयोग किया है) के लिए दिया गया है। 24AA64 एक 32-बाइट पृष्ठ निर्दिष्ट करता है, इसलिए गणना प्रति पृष्ठ होनी चाहिए और प्रति ब्लॉक नहीं होनी चाहिए।
सायद

@ साद - सही। मेरे उत्तर में निश्चित।
स्टीवनवह

4

1) एक बार जब आप लिखने की प्रक्रिया शुरू कर देते हैं, तो आपको केवल MCU / EEPROM को पावर देना होगा और यह सुनिश्चित करना होगा कि नियंत्रण रेखाएं गड़बड़ न हों - I2C शायद इसके लिए SPI के लिए बेहतर है। केवल कुछ मिलीसेकंड के लिए कुछ एमएए की आवश्यकता होती है, ताकि एक बड़ी टोपी न हो, और आप एक बार लिखने की पहल करने के बाद एमसीयू को सो सकते हैं। 3) आप शायद कुछ बुद्धिमत्ता को लागू कर सकते हैं, उदाहरण के लिए एक होल्डऑफ - एक बार लिखे जाने के बाद यह हमेशा एक निश्चित समय के साथ होता है जब दूसरा लेखन हो सकता है। या प्रतीक्षा करें टिल मूल्य लिखने से पहले थोड़ी देर के लिए स्थिर है।
आप कई स्थानों पर डेटा फैलाकर धीरज भी बढ़ा सकते हैं। माइक्रोचिप में कुछ उपकरण और एपनोट हैं, जो उनके इप्रोम के लिए धीरज की गणना करते हैं, जो उपयोगी हो सकते हैं।


4
धीरज पर माइक्रोचिप ऐप नोट: ww1.microchip.com/downloads/en/AppNotes/01019A.pdf Appnote से, आप ऑपरेटिंग वीवी को 5V से 3.5v तक घटाकर धीरज को 2x तक बढ़ा सकते हैं।
14

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

3

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

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

यदि आपका डेटा 16 बिट्स है, तो 64Kx8 चिप 32,000 से अधिक प्रविष्टियों को रखेगा। प्रति सेकंड एक प्रविष्टि लिखने से चिप लगभग 2.7 गुना भर जाएगी। यहां तक ​​कि "केवल" 10K मिटा चक्र के धीरज के साथ एक चिप 10 वर्षों तक चलेगी। एक बड़ी चिप का उपयोग, या 100K धीरज के साथ, उपयोगी जीवन को आनुपातिक रूप से बढ़ाएगा।


2

1) संभवतः सबसे सरल विकल्प, हालाँकि इसके लिए हार्डवेयर परिवर्तनों की आवश्यकता हो सकती है। मैंने पीबीसी संशोधनों के बिना केवल डिकॉउलिंग कैप बढ़ाकर और ब्राउन-आउट पर हस्तक्षेप करके इसे हासिल किया है।

2) जैसा कि आपने बताया है, एफआरएएम का मुद्दा मूल्य है!

3) आपके तापमान और स्थिति डेटा की अस्थिरता के आधार पर, यदि मूल्य बदल गया है, तो आप केवल लेखन द्वारा धीरज बढ़ाएंगे। आप हर दूसरे एक बार तापमान का नमूना ले सकते हैं, लेकिन अगर यह हर 5 मिनट में बदलता है, तो समस्या हल हो जाती है।


1

मैंने अपनी परियोजना में इस समस्या को हल किया है:

रिज़र्व के 1 सेक्टर को अप्रयुक्त स्लॉट्स का एक बिटमास्क और मूल्य के लिए कई स्लॉट्स रखने के लिए।

मेरे द्वारा उपयोग किया जाने वाला बिटमास्क 16 बाइट्स लंबा था, इसलिए मेरे पास मान रखने के लिए 128 स्लॉट थे।

बिटमास्क को सभी लोगों के लिए आरम्भ किया जाता है, जो कि फ्लैश की दृष्टि से मिटाया हुआ राज्य है।

जब आप एक नया मान लिखना चाहते हैं, तो बिटमास्क में पढ़ें और पहले बिट को खोजें जो एक है। यह स्लॉट नंबर है जहां आप मूल्य लिखेंगे। उस बिट को एक शून्य में बदलें जैसा कि इसे चिह्नित किया गया है और पहले इसे मिटाए बिना फ्लैश करने के लिए बिटमास्क को वापस लिखें। इसके बाद, फ़्लैश को मिटाए बिना बिटमास्क के बाद स्लॉट का मान भी लिखें।

इस तरह, आप एक बिट से एक शून्य में केवल एक बदलाव के साथ नए बिटमास को लिखकर फ्लैश राइट साइकल को 128 गुना बढ़ाते हैं।

यदि पूरे बिटकॉम्स 0 हैं, तो फ्लैश सेक्टर को मिटा दें और नए सिरे से शुरू करें।


3
मैं आपको निराश कर सकता हूं, लेकिन जब आप थोड़ा फ्लैश करते हैं, तो पूरा सेक्टर ओवरराइट हो जाता है। आपका समाधान solution बिटमस्क ’क्षेत्र को वास्तव में जल्द ही मृत बना देगा।
बेपन्स कैनिकोव्स

1
यदि आप फ्लैश को नहीं मिटाते हैं, तो आप सेक्टर के लिए 10K मिटा चक्र में से एक का उपयोग नहीं करते हैं। यदि आपके पास मान 0x7F है और आप मान 0x3F लिखते हैं, तो परिणाम 0x3F होगा। यह बिटमाक को अप-टू-डेट रखता है, लेकिन फ्लैश को मिटाता नहीं है। इरेट केवल एक बार होता है जब पूरा बिटकॉइंस 0.
रॉबर्ट

अगर मैं गलत हूं, तो चर्चा करें। मैं यहां खराब जवाब नहीं चाहता और मैं वास्तव में अपने प्रोजेक्ट में खराब डिजाइन नहीं चाहता।
रॉबर्ट

मुझे लगता है कि रॉबर्ट सही हैं। मेरे माइक्रोकंट्रोलर पर, आप एक बार में केवल 4 बाइट्स लिख सकते हैं, लेकिन आवश्यक बिट्स शून्य पर सेट हैं। उन्हें 1k पर वापस लाने का एकमात्र तरीका 1k ब्लॉक को खाली करना है। इसका एकमात्र मिटा हुआ चक्र है जो फ्लैश पहनता है ...
टिम

यह प्रत्येक प्रकार की मेमोरी के लिए भिन्न हो सकता है और शायद मेमोरी विक्रेता के लिए भी। मैंने देखा है कि EEPROMs को पृष्ठ को मिटा देना चाहिए और फिर इसे हर लेखन के लिए लिखना होगा। मैंने फ्लैश मेमोरी देखी है आप उस बिट्स को लिख सकते हैं जो अभी भी पेज को मिटाए बिना 1 है।
mjh2007
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.