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