फ्लैश और रैम: कोड निष्पादन


13

मैंने हाल ही में असेंबली सीखना शुरू किया और लिंकर स्क्रिप्ट और हार्डवेयर प्रोग्रामिंग के अन्य निम्न-स्तरीय विवरणों के बारे में पता चला। मैं खुद को कंप्यूटर आर्किटेक्चर भी सिखा रहा हूं और कहीं न कहीं लाइन के साथ मुझे यह डर भी था कि मेमोरी मॉडल की मेरी तस्वीर भी गलत हो सकती है।

वर्तमान में मुझे जो समझ में आता है उसके अनुसार, सभी कोड और डेटा नॉन-वाष्पशील मेमोरी पर रहते हैं, जब हम प्रोसेसर पर बाइनरी को 'बर्न' करते हैं - रैम के अस्थिर होने पर रीसेट पर कुछ भी नहीं होता है। जब प्रोग्राम 'निष्पादित' शुरू होता है, तो यह 0x0000 पते से होता है जो लगभग हमेशा (AFAIK) फ्लैश में सबसे कम पता होता है। इसलिए, फ्लैश को सीपीयू कोर से जोड़ने वाली बस पर निर्देश दिए गए हैं और यही वह जगह है जहां वास्तविक निष्पादन होता है। हालाँकि, जब हम मेमोरी से डेटा को पुनः प्राप्त करने या स्टोर करने के लिए सीपीयू के बारे में बात करते हैं, तो हम आमतौर पर रैम के बारे में बात करते हैं - मुझे पता है कि हम प्रोग्राम मेमोरी से डेटा भी पढ़ / लिख सकते हैं (मैंने इसे AVR पर देखा है) लेकिन क्या यह उतना सामान्य नहीं है? क्या ऐसा इसलिए है क्योंकि RAM ROM से तेज है जिसे हम वहां डेटा स्टोर करना पसंद करते हैं?

इस प्रश्न का स्वीकृत उत्तर कहता है कि अधिकांश कोड रैम से बाहर हैं।

क्या इसका मतलब यह है कि स्टार्ट-अप रनटाइम कोड (जो स्वयं फ्लैश से निष्पादित होता है) को फ्लैश से रैम तक सभी प्रोग्राम ऑपकोड की प्रतिलिपि बनाना होगा और किसी भी तरह से फ्लैश में पते को मैप करने के लिए रैम को इंगित करना होगा ताकि सीपीयू वहां से ऑपकोड प्राप्त करे? क्या यह उस प्रक्रिया के समान है जिसमें हम ROM पर RAM से स्टार्टअप पर .data सेक्शन को स्थानांतरित करते हैं?

मैं वॉन न्यूमैन आर्किटेक्चर में सरल होने की कल्पना कर सकता हूं जहां कार्यक्रम और डेटा यादें बस साझा करती हैं लेकिन हार्वर्ड आर्किटेक्चर में इसका मतलब यह नहीं होगा कि सभी कोड और डेटा को पहले सीपीयू रजिस्टरों से गुजरना होगा?

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


2
सरल माइक्रोकंट्रोलर्स में निष्पादित करने के लिए प्रोग्राम मेमोरी (अक्सर फ्लैश आजकल) से कॉपी करने की आवश्यकता नहीं है।
डेविड

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

जवाबों:


14

यह डिवाइस पर निर्भर करता है।

रैम को फ्लैश से तेज बनाया जा सकता है; यह लगभग 100 मेगाहर्ट्ज रेंज में महत्वपूर्ण होने लगता है।

सरल माइक्रोकंट्रोलर

छोटे धीमे माइक्रोकंट्रोलर सीधे फ्लैश से बाहर निकलते हैं। इन प्रणालियों में आमतौर पर SRAM की तुलना में अधिक फ्लैश होता है।

मिडरेंज सिस्टम

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

बड़े सिस्टम

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

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


1

RAM आमतौर पर फ्लैश से तेज होती है, लेकिन यह वास्तव में तब तक मायने नहीं रखती है जब तक आप घड़ी की गति को 80-100MHz या उससे अधिक तक नहीं मारते हैं - जब तक कि फ्लैश एक्सेस का समय एक निर्देश को चलाने में लगने वाले समय की तुलना में तेज होता है, यह कोई बात नहीं होनी चाहिए।

रैम का भौतिक निर्माण हमें बहुत तेज उपकरण बनाने की अनुमति देता है; फ्लैश से बहुत तेज। इस बिंदु पर, निष्पादन से पहले रैम में कोड के ब्लॉक को कॉपी करना समझ में आता है। यह डेवलपर को अतिरिक्त लाभ भी पहुंचाता है, जैसे कि रनटाइम पर कोड को संशोधित करने में सक्षम होना।

वॉन न्यूमैन आर्किटेक्चर में जहां कार्यक्रम और डेटा यादें बस साझा करती हैं, लेकिन हार्वर्ड आर्किटेक्चर में इसका मतलब यह नहीं होगा कि सभी कोड और डेटा को पहले सीपीयू रजिस्टरों से गुजरना होगा?

जरुरी नहीं। यह वह जगह है जहाँ वर्चुअल एड्रेसिंग आती है। प्रोग्राम कोड के बजाय कच्चे हार्डवेयर रैम पतों का जिक्र करते हुए, यह वास्तव में एक वर्चुअल एड्रेस स्पेस को संदर्भित करता है। वर्चुअल एड्रेस स्पेस के ब्लॉक को भौतिक मेमोरी डिवाइस पर मैप किया जाता है, जिसमें रैम, रोम, फ्लैश या यहां तक ​​कि डिवाइस बफ़र्स भी हो सकते हैं।

उदाहरण के लिए, जब आप माइक्रो पर एड्रेस 0x000f0004 का संदर्भ देते हैं, तो आप फ्लैश से एड्रेस 0x0004 पढ़ रहे होंगे। वर्चुअल ऐड्रेस 0x000f0004 है, लेकिन भौतिक पता सिर्फ 0x0004 है - पूरे 0x000fxxxx पता स्थान एक 4KB भौतिक स्मृति डिवाइस के लिए मैप किया गया है। यह सिर्फ एक उदाहरण है, निश्चित रूप से, और वर्चुअल एड्रेस स्पेस को प्रबंधित करने और व्यवस्थित करने का तरीका बहुत हद तक आर्किटेक्चर में भिन्न है।

जैसे, जब आप कहते हैं कि "कार्यक्रम 0x0000 पते से [...] निष्पादित करना शुरू कर रहा है जो लगभग हमेशा फ़्लैश में सबसे कम पता है", तो आप सही होने की गारंटी नहीं देते हैं। वास्तव में, कई माइक्रोकंट्रोलर 0x1000 से शुरू होते हैं।


3
मैंने कहा होगा कि यह अंतर 20-40MHz के आसपास प्रासंगिक है, न कि 100Mhz के बाद से, सबसे अधिक फ्लैश डिवाइस मैंने देखा है कि मुझे उस बिंदु के आसपास प्रतीक्षा स्थिति की आवश्यकता होती है। कई मामलों में, कोड फ्लैश में सर्किटरी शामिल होगी, ताकि प्रत्येक भ्रूण कई निर्देश शब्दों को पकड़ लेगा, ताकि कई प्रकार के कोड के लिए फ्लैश से चलने के लिए "जुर्माना" केवल लगभग 5-10% हो, लेकिन कुछ अन्य प्रकार के लिए कोड (जैसे ढेर सारे जंप के साथ) जुर्माना बहुत अधिक गंभीर हो सकता है।
सुपरकैट

यह वर्चुअल एड्रेसिंग नहीं है, यह मेमोरी-मैप्ड I / O (एक परिधीय का उपयोग करके मेमोरी क्षेत्र मैप्स I / O में है, कई MCUs पर नाम "स्टेटिक मेमोरी कंट्रोलर" है)। बेशक, I / O किसी अन्य मेमोरी तक पहुंच जाता है, इसलिए हम कभी-कभी इसे I / O नहीं मानते हैं। लेकिन यह निश्चित रूप से एक वर्चुअल मेमोरी मैपिंग नहीं है।
बेन वोइगट

1

आप जो कह रहे हैं वह पूरी तरह सच या गलत नहीं है। इसके लिए अलग-अलग परिदृश्य हैं।

यह निर्भर करता है कि आप कच्चे हार्डवेयर पर प्रोग्रामिंग कर रहे हैं या ओएस के साथ स्थापित हार्डवेयर पर।

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

अब जब आप माइक्रो कंट्रोलर पर काम कर रहे होते हैं, तो यह पूरी तरह से आप पर निर्भर करता है कि आप चिप पर अपना डेटा कहां पाते हैं। यदि डेटा स्थिर है, तो आप इसे कोड मेमोरी पर ढूंढना चाहते हैं जो आपके रैम को बचाएगा जो कोड मेमोरी की तुलना में बहुत छोटा है। सी भाषा में जब आप स्थैतिक या कुछ संकलक का उपयोग करके डेटाटाइप को इनिशियलाइज़ करते हैं तो प्रीफ़िक्स डेटा को कोड मेमोरी पर स्टोर किया जाएगा या फिर रैम में स्टोर किया जाएगा। और विधानसभा में आप विशेष स्थान पर डेटा को इनिशियलाइज़ करने के लिए DB (Define Byte in Basic 8051) का सीधे उपयोग करते हैं। अब PIC ARM जैसे कुछ कंट्रोलर में भी आप रन टाइम में ROM लिख सकते हैं लेकिन डेटा लाने में ज्यादा समय लगेगा।

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

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