क्या मैं PROGMEM का उपयोग करके फ्लैश मेमोरी को लिख सकता हूं?


11

Arduino के प्रलेखन पर, मैं बोली:

http://playground.arduino.cc/Learning/Memory नोट: फ्लैश (PROGMEM) मेमोरी को प्रोग्राम बर्न टाइम पर ही पॉप्युलेट किया जा सकता है। आप परिवर्तन नहीं कर सकते> कार्यक्रम शुरू होने के बाद फ्लैश में मान।

और PROGMEM विवरण पर:

http://arduino.cc/en/Reference/PROGMEM SRAM के बजाय फ्लैश (प्रोग्राम) मेमोरी में डेटा स्टोर करें। एक Arduino बोर्ड पर उपलब्ध विभिन्न प्रकार की मेमोरी का विवरण है।

PROGMEM कीवर्ड एक चर संशोधक है, इसका उपयोग केवल pgmspace.h में परिभाषित डेटाटिप्स के साथ किया जाना चाहिए। यह संकलक को "फ्लैश मेमोरी में यह जानकारी डालता है" बताता है, एसआरएएम के बजाय, जहां यह सामान्य रूप से जाएगा।

तो क्या हम या हम नहीं कर सकते? या यह एक ही बात नहीं है?


यद्यपि आप रन टाइम पर (फ्लैश) प्रोग्राम मेमोरी (जब तक कि यह लॉक न हो) में लिख सकते हैं, प्रक्रिया थोड़ी अधिक शामिल है, और PROGMEM निर्देश के साथ पूरा नहीं किया जा सकता है, जो मूल रूप से सिर्फ आवंटन प्रक्रिया को नियंत्रित करते हैं। यदि आप यह देखना चाहते हैं कि यह कैसे किया जा सकता है, तो बूटलोडर स्रोत को देखें।
क्रिस स्ट्रैटन

पृष्ठ लिखने वाले ब्लॉक अव्यावहारिक फ़्लैश करने के लिए लेखन नहीं करते हैं। वास्तव में इसके कुछ करने के लिए तत्पर था।
जीसी जीमेल

जवाबों:


9

संक्षिप्त उत्तर नहीं है: PROGMEM डेटा केवल-पढ़ने के लिए है।

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

क्या PROGMEM वास्तव
में आपके कोड (जैसे तार और संख्या) में निर्दिष्ट कोई भी शाब्दिक डेटा हमेशा प्रोग्राम स्पेस में रहता है (यानी फ्लैश में)। हालाँकि, जब आपका स्केच वास्तव में रनटाइम पर उस डेटा का उपयोग करना चाहता है, तो उसे आम तौर पर SRAM में इसके लिए कुछ स्थान आवंटित करना होता है और उसे कॉपी करना होता है। इसका मतलब है कि आप दो प्रतियों के साथ समाप्त होते हैं: फ्लैश में निश्चित मूल और SRAM में अस्थायी प्रतिलिपि।

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

हालाँकि, यदि आप डेटा को संशोधित करना चाहते हैं, तो इसे SRAM में कॉपी करना आवश्यक है। ऊपर उल्लिखित फ्लैश सीमाओं के अलावा, यह कोड सुरक्षा का भी सवाल है।

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

अधिक जानकारी
आप यहाँ से निम्न स्तर के PROGMEM सामान के बारे में अधिक जान सकते हैं:

उसी PROGMEM ट्यूटोरियल का एक पुराना संस्करण यहां उपलब्ध है:


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