.text
.Text खंड में वास्तविक कोड होता है, और इसे माइक्रोकंट्रोलर्स के लिए फ्लैश मेमोरी में प्रोग्राम किया जाता है। फ्लैश मेमोरी के कई, गैर-सन्निहित ब्लॉक होने पर एक से अधिक टेक्स्ट सेगमेंट हो सकते हैं; उदाहरण के लिए मेमोरी के शीर्ष पर स्थित एक वेक्टर और इंटरप्ट वैक्टर, और 0 से शुरू होने वाला कोड; या बूटस्ट्रैप और मुख्य कार्यक्रम के लिए अलग-अलग अनुभाग।
.बीएस और डाटाटा
तीन प्रकार के डेटा हैं जिन्हें किसी फ़ंक्शन या प्रक्रिया के लिए बाहरी आवंटित किया जा सकता है; पहला अनइंस्टाल्यूटेड डेटा है (ऐतिहासिक रूप से कहा जाता है। एलबीएस, जिसमें 0 इनिशियलाइज़्ड डेटा भी शामिल है), और दूसरा इनिशियलाइज़्ड (नॉन-बीएसएस), या .डाटा है। "बीएसएस" नाम ऐतिहासिक रूप से "ब्लॉक स्टार्टेड बाई सिंबल" से आता है, जिसका उपयोग लगभग 60 साल पहले एक असेंबलर में किया गया था। ये दोनों क्षेत्र राम में स्थित हैं।
जैसा कि एक कार्यक्रम संकलित किया गया है, चर इन दो सामान्य क्षेत्रों में से एक को आवंटित किया जाएगा। लिंकिंग चरण के दौरान, सभी डेटा आइटम एक साथ एकत्र किए जाएंगे। सभी चर जिन्हें आरंभ करने की आवश्यकता होती है, प्रारंभिक मानों को रखने के लिए प्रोग्राम मेमोरी के एक हिस्से को अलग रखा जाएगा, और मुख्य () कहा जाता है, आमतौर पर चर को प्रारंभ किया जाएगा, आमतौर पर crt0 नामक एक मॉड्यूल द्वारा। Bss सेक्शन को एक ही स्टार्टअप कोड द्वारा सभी शून्य में आरंभ किया जाता है।
कुछ माइक्रोकंट्रोलर के साथ, छोटे निर्देश हैं जो रैम के पहले पृष्ठ (पहले 256 स्थानों, जिसे कभी-कभी पृष्ठ 0 कहा जाता है) तक पहुंच की अनुमति देता है। इन प्रोसेसरों के लिए कंपाइलर एक कीवर्ड को आरक्षित कर सकता है जैसे कि near
चर को वहां रखा जाए। इसी तरह, ऐसे माइक्रोकंट्रोलर भी हैं जो केवल एक पॉइंटर रजिस्टर (अतिरिक्त निर्देशों की आवश्यकता) के माध्यम से कुछ क्षेत्रों को संदर्भित कर सकते हैं, और ऐसे चर नामित हैं far
। अंत में, कुछ प्रोसेसर बिट द्वारा मेमोरी के एक सेक्शन को संबोधित कर सकते हैं और कंपाइलर के पास इसे निर्दिष्ट करने का एक तरीका होगा (जैसे कि कीवर्ड bit
)।
इसलिए अतिरिक्त खंड जैसे .nearbs और .neardata, आदि हो सकते हैं, जहाँ ये चर एकत्र किए जाते हैं।
.rodata
किसी फ़ंक्शन या प्रक्रिया के लिए बाहरी बाहरी प्रकार का तीसरा प्रकार आरंभिक चर की तरह है, सिवाय इसके कि यह केवल पढ़ने के लिए है और इसे प्रोग्राम द्वारा संशोधित नहीं किया जा सकता है। C भाषा में, इन चर को const
कीवर्ड का उपयोग करके दर्शाया जाता है । वे आमतौर पर प्रोग्राम फ्लैश मेमोरी के भाग के रूप में संग्रहीत होते हैं। कभी-कभी उन्हें एक .rodata (केवल पढ़ने के लिए डेटा) खंड के हिस्से के रूप में पहचाना जाता है। हार्वर्ड आर्किटेक्चर का उपयोग करने वाले माइक्रोकंट्रोलर्स पर , कंपाइलर को इन चर तक पहुंचने के लिए विशेष निर्देशों का उपयोग करना चाहिए।
ढेर और ढेर
स्टैक और हीप दोनों को रैम में रखा गया है। प्रोसेसर की वास्तुकला के आधार पर, स्टैक बड़ा हो सकता है, या नीचे बढ़ सकता है। यदि यह बड़ा हो जाता है, तो इसे रैम के नीचे रखा जाएगा। यदि यह नीचे बढ़ता है, तो इसे रैम के अंत में रखा जाएगा। ढेर शेष रैम का उपयोग चर को आवंटित नहीं करेगा, और स्टैक के विपरीत दिशा में बढ़ेगा। स्टैक और हीप का अधिकतम आकार आमतौर पर लिंकर मापदंडों के रूप में निर्दिष्ट किया जा सकता है।
स्टैक पर रखे गए वैरिएबल कीवर्ड के बिना किसी फ़ंक्शन या प्रक्रिया के भीतर परिभाषित कोई भी चर हैं static
। उन्हें एक बार स्वचालित चर ( auto
कीवर्ड) कहा जाता था , लेकिन उस कीवर्ड की आवश्यकता नहीं है। ऐतिहासिक रूप से, auto
मौजूद है क्योंकि यह B भाषा का हिस्सा था जो C से पहले था, और वहां इसकी आवश्यकता थी। स्टैक पर फ़ंक्शन पैरामीटर भी रखे जाते हैं।
यहाँ RAM के लिए एक विशिष्ट लेआउट दिया गया है (कोई विशेष पेज 0 अनुभाग नहीं मानते हुए):
EEPROM, ROM और NVRAM
फ़्लैश मेमोरी के साथ आने से पहले, EEPROM (विद्युत रूप से मिटाए जाने योग्य प्रोग्राम-रीड-ओनली मेमोरी) का उपयोग प्रोग्राम और कास्ट डेटा (.text और .rodata सेगमेंट) को संग्रहीत करने के लिए किया गया था। अब EEPROM की बस एक छोटी राशि (जैसे 2KB से 8KB बाइट्स) उपलब्ध है, यदि कोई हो, और इसका उपयोग आमतौर पर कॉन्फ़िगरेशन डेटा या डेटा की अन्य छोटी मात्रा को संग्रहीत करने के लिए किया जाता है, जिसे पावर-डाउन पावर अप पर बनाए रखने की आवश्यकता होती है चक्र। इन्हें प्रोग्राम में वैरिएबल के रूप में घोषित नहीं किया जाता है, बल्कि इसके बजाय माइक्रोकंट्रोलर में विशेष रजिस्टरों का उपयोग करने के लिए लिखा जाता है। EEPROM को एक अलग चिप में भी लागू किया जा सकता है और एक SPI या I busC बस के माध्यम से पहुँचा जा सकता है।
ROM अनिवार्य रूप से Flash के समान है, सिवाय इसके कि इसे कारखाने में क्रमादेशित किया जाता है (उपयोगकर्ता द्वारा प्रोग्राम करने योग्य नहीं)। इसका उपयोग केवल बहुत अधिक मात्रा वाले उपकरणों के लिए किया जाता है।
NVRAM (गैर-वाष्पशील रैम) EEPROM का एक विकल्प है, और इसे आमतौर पर बाहरी आईसी के रूप में लागू किया जाता है। बैटरी के बैकअप होने पर नियमित रैम को गैर-वाष्पशील माना जा सकता है; उस स्थिति में कोई विशेष पहुँच विधियों की आवश्यकता नहीं है।
हालाँकि डेटा को फ़्लैश में सहेजा जा सकता है, लेकिन फ्लैश मेमोरी में सीमित संख्या में इरेज़ / प्रोग्राम साइकल (1000 से 10,000) हैं, इसलिए यह वास्तव में इसके लिए डिज़ाइन नहीं किया गया है। इसके लिए एक बार में मेमोरी को ब्लॉक करना पड़ता है, इसलिए बस कुछ बाइट्स को अपडेट करना असुविधाजनक है। यह कोड और केवल-पढ़ने योग्य चर के लिए अभिप्रेत है।
EEPROM को मिटा / कार्यक्रम चक्र (100,000 से 1,000,000) पर बहुत अधिक सीमाएं हैं, इसलिए यह इस उद्देश्य के लिए बहुत बेहतर है। यदि माइक्रोकंट्रोलर पर EEPROM उपलब्ध है और यह काफी बड़ा है, तो यह वह जगह है जहाँ आप गैर-वाष्पशील डेटा को सहेजना चाहते हैं। हालाँकि लिखने से पहले आपको पहले ब्लॉक (आमतौर पर 4KB) को भी मिटाना होगा।
यदि कोई EEPROM नहीं है या यह बहुत छोटा है, तो एक बाहरी चिप की आवश्यकता है। एक 32KB EEPROM केवल 66 EP है और इसे 1,000,000 बार तक मिटाया / लिखा जा सकता है। समान संख्या में मिटा / कार्यक्रम संचालन के साथ एक एनवीआरएएम बहुत अधिक महंगा है (एक्स 10) एनवीआरएएम आमतौर पर ईईपीआरओएम की तुलना में पढ़ने के लिए तेज होते हैं, लेकिन लिखने के लिए धीमा। वे एक बार में या ब्लॉक में लिखे जा सकते हैं।
इन दोनों का एक बेहतर विकल्प एफआरएएम (फेरोइलेक्ट्रिक रैम) है, जिसमें अनिवार्य रूप से अनंत चक्र (100 ट्रिलियन) और कोई लेखन देरी नहीं है। यह एनवीआरएएम के समान मूल्य के बारे में है, 32KB के लिए $ 5 के आसपास।