AVR फ्लैश मेमोरी भ्रष्टाचार


11

यह सवाल एवीआर डिप्रोग्रामिंग से ही जुड़ा है

प्रोजेक्ट जानकारी:
हमारे पास ATMEGA644P का उपयोग करके बैटरी चालित उत्पाद है। आवेदन स्थायी रूप से स्लीप मोड में चलता है और केवल एक सेकंड (RTC) या दो बाहरी व्यवधान लाइनों में से एक को ट्रिगर करने पर जागता है।

डिवाइस में एक बहुत ही सरल बूट-लोडर है जो UART (RS232 इंटरफ़ेस आईसी का उपयोग करके) पर संचार कर रहा है। यह बस फर्मवेयर को अपडेट करने के लिए एक सुविधा विधि के रूप में कार्य करता है ताकि किसी हार्डवेयर ISP प्रोग्रामर की आवश्यकता न हो। (बूट-लोडर चेकसम सिक्योर टेलीग्राम की उम्मीद करता है)

उपकरणों को आंतरिक ब्राउन-आउट DISABLED के साथ डिज़ाइन किया गया था क्योंकि यह बिजली की खपत को दोगुना करता है और लंबी बैटरी जीवन अनिवार्य है (मुझे लगता है कि बाहरी ब्राउन-आउट डिटेक्शन का उपयोग किया जाना चाहिए था - एक फिर से डिजाइन काम में है)।

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

यह दूषित सामग्री (दाएं) की मूल फ़्लैश सामग्री (बाएं) की तुलना है:

फ्लैश तुलना

कुछ अवलोकन:

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

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

हो सकता है कि अंडर-वोल्टेज के कारण नियंत्रक बेतरतीब ढंग से फिर से शुरू हो रहा हो और बूट-लोडर कोड इस दौरान पूरी तरह से अप्रत्याशित हो। अंडर-वोल्टेज के बारे में एक और मंच से कुछ लड़के को उद्धृत करने के लिए:

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

प्रश्न (ओं):
क्या आपको लगता है कि "अंडर-वोल्टेज के दौरान यादृच्छिक व्यवहार और फ्लैश पेजों में डेटा बदलने वाले कुछ निर्देशों को निष्पादित करना" - स्पष्टीकरण ध्वनि है? अगर ऐसा है, तो हम इस तरह की त्रुटियों को हर समय कुछ सॉफ्टवेयर मुद्दों (स्टैक ओवरफ्लो, अमान्य पॉइंटर्स) के कारण के रूप में नहीं देखते हैं।

क्या आपके पास कोई अन्य विचार है जो इस तरह के भ्रष्टाचार का कारण हो सकता है? क्या यह ईएमआई / ईएसडी के कारण हो सकता है?


आपके उदाहरण में दूसरे ब्लॉक में, क्या कोई बिट्स 1-> 0 से चला गया या वे सभी 0-> 1 संक्रमण? मेरे पास एक स्क्रिप्ट है जो इसकी गणना करती है, लेकिन मैं आपके स्क्रीनशॉट से सभी नंबरों को टाइप करने वाला नहीं हूं।
बजे

@ बुकमार्क: इसे देखने से, 0-> 1 ही। एक उत्तर में यह भी कहा गया है कि यह एक आंशिक मिटाए जैसा दिखता है, जहां सभी बिट्स फ़्लिप नहीं किए गए थे। अवलोकन के लिए धन्यवाद।
रेव .1.0

जवाबों:


11

आपको ध्यान देना चाहिए कि फ्लैश नहीं लिखा है, यह मिटा दिया गया है। एक मिटाया गया फ्लैश 0xFF से भरा होता है। आपके पहले 256 बाइट्स पूरी तरह से मिटा दिए गए हैं, आपका तीसरा 256-बाइट्स क्षेत्र आंशिक रूप से मिटा दिया गया है (आपके पास केवल 0 से 1 बिटफ़्लिप सही डेटा से दूषित एक तक है)।

डेटाशीट के अनुसार , यह फ्लैश पेज-इरेज़ेबल है (मैं आमतौर पर पेजों से बड़ा मिटा-ब्लॉक के साथ काम करता हूं)। जैसा कि पृष्ठ २ Perform२ में देखा गया है, एसपीएम द्वारा प्रदर्शन पृष्ठ मिटा देना बहुत आसान है।

आप खंड 23.8.1 (फ़्लैश भ्रष्टाचार पर रोक) द्वारा रुचि ले सकते हैं:

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

  1. यदि सिस्टम में बूट लोडर अपडेट की कोई आवश्यकता नहीं है, तो किसी भी बूट लोडर सॉफ़्टवेयर अपडेट को रोकने के लिए बूट लोडर लॉक बिट्स को प्रोग्राम करें।
  2. अपर्याप्त बिजली आपूर्ति वोल्टेज की अवधि के दौरान AVR RESET को सक्रिय (कम) रखें।
    यह आंतरिक ब्राउन-आउट डिटेक्टर (बीओडी) को सक्षम करके किया जा सकता है यदि ऑपरेटिंग वोल्ट-उम्र का पता लगाने के स्तर से मेल खाता है। यदि नहीं, तो एक बाहरी कम वीसीसी रीसेट सुरक्षा सर्किट का उपयोग किया जा सकता है। यदि एक राइट ऑपरेशन चालू है, तो रीसेट होता है, राइट ऑपरेशन पूरा हो जाएगा बशर्ते कि बिजली की आपूर्ति वोल्टेज पर्याप्त हो।
  3. कम वीसीसी की अवधि के दौरान एवीआर कोर को पावर-डाउन स्लीप मोड में रखें। यह CPU को निर्देशों को डिकोड करने और निष्पादित करने से रोकने के लिए प्रभावी ढंग से SPMCSR रजिस्टर की रक्षा करेगा और इस प्रकार अनजाने में लिखी गई फ़्लैश से बचाएगा।

तीसरे पृष्ठ पर आंशिक मिटाए जाने के बारे में आपका अवलोकन प्रशंसनीय लगता है। Atmel पाठ के बारे में: हम सभी सहमत हैं कि BOD अनिवार्य प्रतीत होता है। लेकिन मैं अभी भी भ्रष्टाचार के सटीक कारण के बारे में निश्चित नहीं हूं। क्या यह बहुत कम संभावना नहीं है कि नियंत्रक केवल निष्पादित करता है (कम वोल्टेज के कारण) यह विशिष्ट निर्देश फ्लैश पेज को मिटाने के लिए है? मेरा मतलब है, यह बूट लोडर कोड निष्पादन के दौरान भी होता होगा, क्योंकि फ्लैश केवल वहां से लिखने योग्य होता है। और इसके लिए एक विशिष्ट अनुक्रम की आवश्यकता होती है।
191

3
भ्रष्टाचार के सटीक स्रोत की व्याख्या करना संभव नहीं है: जैसा कि आपके Vcc की गिरावट है, यह एक दूसरे के साथ एक ट्रांजिस्टर को पूरी तरह से संतृप्त करने के लिए बहुत कम हो जाता है। एक MCU मूल रूप से एक बहुत बड़ा तार्किक समीकरण है। यदि आपके ट्रांजिस्टर तार्किक स्विच के रूप में व्यवहार करना बंद कर देते हैं, तो आप इस समीकरण को बदलते हैं। दुर्व्यवहार के लिए पहला ट्रांजिस्टर ASIC वेफर डोपिंग और बाहरी विद्युत चुम्बकीय गड़बड़ी पर निर्भर करता है, आप अनुमान नहीं लगा सकते कि क्या होगा। इस समस्या को हल करने के लिए, जब आप अपने ASIC को डिज़ाइन करते हैं, तो आप एक एनालॉग भाग जोड़ सकते हैं जो दुर्व्यवहार करने से पहले डिजिटल भाग को बंद कर देता है। लेकिन यह पूरे एएसआईसी लागत को बढ़ाता है।
जैकन

यह सुनिश्चित करते हुए कि अनुप्रयोग नोट AVR180 एक्सटर्नल ब्राउन-आउट प्रोटेक्शन बताता है: "ध्यान दें कि AVR® आंतरिक फ्लैश प्रोग्राम मेमोरी सामग्री कभी भी अपर्याप्त बिजली आपूर्ति वोल्टेज से प्रभावित नहीं होती है"। इसके अलावा: "AVR CPU अपनी स्वयं की प्रोग्राम मेमोरी में लिखने में सक्षम नहीं है, आंतरिक फ़्लैश प्रोग्राम मेमोरी कंटेंट कभी भी बिजली की विफलता की स्थिति से प्रभावित नहीं होते हैं।" - IMO Atmel सिर्फ इस बात की अनदेखी कर रहा है कि फ्लैश लोडर को बदलने के लिए बूट लोडर जैसा कुछ है।
Rev1.0

@ Rev1.0 ठीक है, हाँ, यह बहुत कम संभावना है ... यही कारण है कि आप इसे हर महीने केवल एक डिवाइस पर देखते हैं, बजाय सभी उपकरणों के।
23:25 पर user253751

"मेरा मतलब है, यह बूट लोडर कोड निष्पादन के दौरान भी होता होगा, क्योंकि फ्लैश केवल वहां से लिखने योग्य होता है।" - यह केवल सही है अगर बूट लॉक बिट्स ( BLB01और मित्र) उचित रूप से सेट किए गए हैं! क्या वो? "कन्फ़्यूज़िंग ... एप्लीकेशन नोट ..." - एप्लिकेशन नोट बेहद अविश्वसनीय हैं। केवल प्रेरणा के लिए उनका उपयोग करें; गारंटी के लिए, डेटशीट पर भरोसा करें (जो अचूक नहीं हैं लेकिन हे)।
मार्सेल

4

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

आपको निश्चित रूप से माइक्रोकंट्रोलरों पर ब्राउन-आउट सुरक्षा को सक्षम करना चाहिए।


3
क्या आपके पास HOW और WHY के बारे में कोई ठोस संदर्भ है "स्मृति नियंत्रण हार्डवेयर भ्रष्ट या कम वोल्टेज की स्थिति के तहत मेमोरी का हिस्सा मिटा देता है"? फ्लैश भ्रष्टाचार के बारे में बहुत सारे मंच चर्चाएं हैं, लेकिन यह लगभग कभी भी ठोस नहीं होता है, यही कारण है कि मैंने यहां पूछा।
Rev1.0

क्या यह इन-चिप अंडर-वोल्टेज समस्या है या क्या यह बूटलोडर सेक्शन में प्रोग्राम के गलत / यादृच्छिक निष्पादन से संबंधित है जिसे AFAIK केवल FLASH को संशोधित कर सकता है। यदि दूसरा समस्या है बूटलोडर निष्पादन को निष्क्रिय करने के लिए FUSE के माध्यम से समस्या को हल करना चाहिए।
टीएमए

मुझे कम से कम एक मेगा माइक्रो के इरेटा में इसके बारे में पढ़ना याद है।
उपयोगकर्ता

3

अंडर-वोल्टेज एक बहुत ही संभावित कारण है। उदाहरण के लिए, मेरे पास एक बार एक परियोजना थी जहां 1.8 वी का भूरा-आउट स्तर अक्सर भ्रष्टाचार का कारण बनता था, और इन भ्रष्टाचारों को 3.5 वी के भूरे-बाहर स्तर के साथ पुन: पेश नहीं किया जा सकता था।

ध्यान दें, कि प्रोसेसर जितनी तेजी से चलता है, यह अंडर-वोल्टेज समस्याओं के प्रति उतना ही संवेदनशील होता है। यदि सीपीयू आवृत्ति कम करना आपके लिए एक उपलब्ध विकल्प है, तो यह एक कोशिश के लायक हो सकता है।


1
उत्तर के लिए धन्यवाद। हमने एक बाहरी अल्ट्रा लो पावर ब्राउन-आउट डिटेक्टर का उपयोग किया और तब से भ्रष्टाचार की कोई समस्या नहीं थी।
Rev1.0

0

अगर कोई PCB डिजाइन के मुख्य नियमों का पालन नहीं करता है, तो EMC आपका सबसे बड़ा दुश्मन होगा। यहां मेरे अपने अनुभव से सबसे महत्वपूर्ण हैं: - किसी भी आईसी पर अवरोधक कैपेसिटर, चाहे वे निर्माता आपको अपने डेटाशीट में हीन योजनाबद्धता के बारे में बताएं, प्रत्येक आईसी की बिजली लाइनों पर कम से कम 100pF - 1nF के बीच एक - डाल जमीन क्षेत्रों का संचालन करना; प्रत्येक पीसीबी की परत जितना संभव हो सके। उन क्षेत्रों को vias के माध्यम से सभी परतों के माध्यम से संपर्क किया जाएगा जितनी बार कब्जे के रूप में, एक ग्रिड 50mil एक अच्छा मूल्य है। उन क्षेत्रों को ग्राउंड सिग्नल से कनेक्ट करें। - अपने पीसीबी में कभी भी असंबद्ध (फ्लोटिंग, नो सिग्नल कनेक्टेड) ​​कॉपर न रखें। यह ऐन्टेना की तरह काम करता है और उपकरणों पर इलेक्ट्रो-मैग्नेटिक रेडिएशन लगाता है - घड़ी के संकेतों को यथासंभव कम करके निशान बनाते हैं

"ईएमसी प्रूफ पीसीबी डिजाइन के लिए गाइड" जैसे खोज इंजन अनुरोधों द्वारा अधिक जानकारी प्राप्त करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.