रैम से कोड क्यों निष्पादित करें?


27

मैं अपने माइक्रोकंट्रोलर कंपाइलर के लिए कुछ मैक्रोज़ भर आया हूँ, ताकि RAM से किसी फंक्शन को अंजाम दिया जा सके।

https://siliconlabs.github.io/Gecko_SDK_Doc/efr32mg1/html/group__RAMFUNC.html#gac6abbc7f869eec9fb47e57427587c556

http://processors.wiki.ti.com/index.php/Placing_functions_in_RAM

https://www.iar.com/support/tech-notes/linker/controlling-placement-of-the-section-where-__ramfunc-functions-reside-ewarm-5.x--6.x/

https://community.nxp.com/thread/389099

किन मामलों में यह मूल्यवान है? अगर लाभ केवल गति में वृद्धि होती है तो मैं हमेशा RAM से निष्पादन क्यों नहीं करूंगा? क्या यह आम तौर पर उच्च वर्तमान ड्रा का कारण बनता है?


13
RAM से निष्पादन कोड कम धारा खींचता है (मुझे यकीन नहीं है कि यह सभी CPU / SoCs के लिए सही है)। मैंने एक बार एक परियोजना बनाई है, जहां हम अधिकांश कोड रैम में डालते हैं क्योंकि यह बैटरी डिवाइस था और हम चाहते थे कि यह यथासंभव लंबे समय तक जीवित रहे। यदि आप केवल RAM से कोड निष्पादित कर सकते हैं, तो आप कुछ SoCs पर फ़्लैश ब्लॉक भी बंद कर सकते हैं और इससे भी अधिक बिजली बचा सकते हैं।
अल बंडी

4
@ पिप - मुझे लगता है कि यह एक जवाब के बजाय एक टिप्पणी करने का कारण है कि यह वास्तविक प्रश्न का उत्तर नहीं देता है, यही कारण है कि आप अपने कोड को निष्पादित करने के लिए हमेशा रैम का उपयोग नहीं करना चाहेंगे ।
जूल्स

1
@ जूल्स हां, मुझे लगता है कि यह "सहायक उपाख्यान" के रूप में है। स्टैक एक्सचेंज को बहुत अच्छे कारणों से रोकने के लिए डिज़ाइन किया गया है।
पाइप

1
क्योंकि आपके पास रजिस्टर से निष्पादित करने के लिए पर्याप्त रजिस्टर नहीं है। (मेरे पास वह चिप है।)
जोशुआ

सब कुछ के अलावा: डायनेमिक रैम से कोड निष्पादित करना विशेष रूप से DRAM रिफ्रेश करने के लिए एक विस्तृत सॉफ्टवेयर हैक का हिस्सा हो सकता है। :)
कज़

जवाबों:


32

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


4
इस बात पर निर्भर करता है कि आपके पास कितने फ़्लैश ब्लॉक हैं और आपके बूटलोडर को किस तरह से संशोधित करने की अनुमति है, आपने अगले ब्लॉक के लिए डेटा को चरणबद्ध करने के लिए कितना राम छोड़ा है, आदि, लेकिन फ्लैश से ट्रैम्पोलिन करने के लिए सही है ताकि आप फ्लैश रैम को संशोधित कर सकें। उसके लिए अच्छा है ...
old_timer

1
यह केवल आधे प्रश्न (दशांश भाग) का उत्तर देता है। ओपी भी पूछा, "क्यों मैं सिर्फ हमेशा रैम से अमल नहीं होता है, तो लाभ ही गति बढ़ जाती है?", और इस जवाब की व्याख्या नहीं करता क्यों एक हो सकता है नहीं रैम से निष्पादित करने के लिए चाहते हैं।
डॉकटोर जे

2
अब तक तो अच्छा है, लेकिन क्या होता है अगर आप फिर से लिखने के बीच में पावर (और इस तरह रैम) खो देते हैं? यह हल किया जा सकता है, लेकिन बूटलोडर के लिए किसी भी अन्य डिजाइन की तरह, इस पर विचार किया जाना चाहिए।
एरोनडी

19

मैंने उस माइक्रो के लिए डेटाशीट को नहीं देखा था। हालांकि, इस स्थिति में अक्सर ऐसा होता है कि जिस प्रोग्राम से मेमोरी को कार्यान्वित किया जाता है, उसमें फ्लैश से प्राप्त करने की तुलना में रैम से प्राप्त करना अधिक तेज़ होता है।

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

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


17

जब आप रैम को निष्पादित करना चाहते हैं क्योंकि यह तेज है, यह आमतौर पर है क्योंकि रैम ऑन-चिप SRAM है। यह एक दुर्लभ संसाधन है, जिसे आप संभवतः उस डेटा के लिए चाहेंगे जिसे पढ़ने / लिखने की पहुंच की आवश्यकता है।

कोड के लिए इसका उपयोग करना जब आपके पास पहले से ही ROM / फ्लैश में कोड है तो इसका मतलब है कि आपको X की मात्रा और एक अतिरिक्त X RAM की आवश्यकता है।

इसे बूट पर एक अतिरिक्त प्रतिलिपि चरण की आवश्यकता होती है या जब आप इसे चलाना चाहते हैं, हालांकि यह अधिक महत्वहीन है।

परंपरागत रूप से यह एक निर्देश कैश के साथ हल किया गया है, लेकिन एक माइक्रोकंट्रोलर में आंतरिक SRAM जेनेरिक रखने के लिए अधिक समझदारी हो सकती है, क्योंकि आप एक माइक्रोकंट्रोलर का उपयोग नहीं करते हैं क्योंकि आप सबसे तेज़ निष्पादन गति चाहते हैं।

एक विश्वसनीयता समस्या भी है - वास्तविक ROM में कोड निष्पादित बगगी कोड द्वारा संशोधित करना कठिन है।


14

सभी अच्छे उत्तरों के अलावा:

अगर लाभ केवल गति में वृद्धि होती है तो मैं हमेशा RAM से निष्पादन क्यों नहीं करूंगा?

क्योंकि एक एम्बेडेड सिस्टम में, आमतौर पर आपके पास रैम की आवश्यक मात्रा नहीं होती है। उदाहरण के लिए एक एसटीएम 32 जिसमें 32 केबी या रैम और ईईप्रॉम का 512kB है। रैम में पूरे प्रोग्राम को निष्पादित करने में सक्षम होने के लिए आपको EEPROM की तुलना में रैम आकार की आवश्यकता होगी।


5
"क्योंकि एक एम्बेडेड सिस्टम में, आमतौर पर आपके पास रैम की आवश्यक मात्रा नहीं होती है" - और क्योंकि यदि आपके पास ऐसा करने के लिए पर्याप्त रैम है, तो आप कम रैम के साथ एक सस्ता एमसीयू पर स्विच करके लागतों को लगभग कम कर सकते हैं। क्योंकि अगर आप सवाल पूछ रहे हैं, तो हमेशा कम रैम वाला एक सस्ता MCU होता है (सबसे छोटा और सबसे सस्ता MCUs हार्वर्ड आर्किटेक्चर का उपयोग करता है ताकि RAM से निष्पादित न हो सके)
Jules

13

अन्य उत्तरों से लगता नहीं है कि बिजली की खपत पर बहुत चर्चा हुई है, जिसके बारे में आपने विशेष रूप से पूछा है।

इसका उत्तर यह है कि यह कुछ हद तक माइक्रोकंट्रोलर पर निर्भर करता है, लेकिन अक्सर रैम से निष्पादन बिजली की खपत को कम कर सकता है क्योंकि इसे फ्लैश मेमोरी की तुलना में रैम से निर्देश पढ़ने के लिए कम ऊर्जा की आवश्यकता होती है।

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

कुछ भाग, जैसे कि कुछ Atmel SAM श्रेणी में, विशेष अतिरिक्त कम पॉवर RAM है जिसका उपयोग इस उद्देश्य के लिए किया जा सकता है। यह विशेष रैम में कोड की एक छोटी मात्रा को लोड करने की अनुमति देता है, जबकि उपलब्ध रैम और अन्य सभी यादों के थोक नीचे संचालित होते हैं और माइक्रोकंट्रोलर एक गहरी नींद मोड में प्रवेश करता है।


7

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

यह कुछ मापदंडों को बदलने के रूप में सरल हो सकता है या पूरे हैंडलर रूटीन को दूरस्थ रूप से अपलोड किया जा सकता है।


या RAM में कोड को डिस्क (जैसे SD) या नेटवर्क से लोड किया जा सकता है
teambob

4

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

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

इसलिए इस तरह के अनुकूलन केवल प्रयास के लायक हैं, यदि कोड को अक्सर निष्पादित किया जाता है, और आपने इसे सिस्टम का एक चोकिंग पॉइंट होने के लिए मापा है।

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


4

RAM से कोड निष्पादित करने के दो बहुत ही सामान्य कारण हैं:

  1. कुछ माइक्रोप्रोसेसर फ्लैश प्रोग्रामिंग के दौरान फ्लैश से निष्पादित नहीं कर सकते हैं - हालांकि कई ऐसा कर सकते हैं जब तक कोड फ्लैश लिखे जाने से अलग ब्लॉक में है। फ्लैश राइट्स एप्लिकेशन (बूट-लोडर केस) को फिर से शुरू कर सकता है, या जब फ्लैश का उपयोग गैर-वाष्पशील कार्यक्रम की जानकारी (कॉन्फ़िगरेशन, कैलिब्रेशन, आदि) को स्टोर करने के लिए किया जाता है।

  2. कई माइक्रोप्रोसेसरों पर, रैम फ्लैश की तुलना में बहुत तेज है। इन उपकरणों के लिए, रैम से छोटे गति-महत्वपूर्ण रूटीन निष्पादित किए जा सकते हैं, हालांकि आमतौर पर रैम फ्लैश की तुलना में बहुत कम आपूर्ति में होती है।


2

रैम के लिए एक और usecase यादृच्छिक बिटफ्लिप्स के खिलाफ केवल निष्पादन सुरक्षा है। हम अपने छोटे क्यूब्सैट पर इस मॉडल का उपयोग करते हैं क्योंकि मुख्य कंप्यूटर बोर्ड में एक ईसीसी रैम होता है जो विकिरण के कारण बिटफ्लिप्स को सहन करता है। पूरे ओएस को राम में लोड किया जाता है क्योंकि स्टार्टअप पर रैमडिस्क पूरी तरह से ईसीसी एनवायरनमेंट में चलता है।

फ्लैश ECC संरक्षित नहीं है (शेल्फ माइक्रो एसडी कार्ड से मानक) हालांकि हमारे पास भ्रष्टाचार (कई छवियां, चेकसम) आदि की जांच करने के लिए अन्य तरीके हैं।


मैंने यह मान लिया होगा कि EEPROM या फ़्लैश जैसी कोई चीज़ विकिरण द्वारा बिटफ्लिप करने के लिए बहुत "कठिन" होगी, अर्थात अधिक ऊर्जा की आवश्यकता होगी।
पाइप

वास्तव में ऐसा है, लेकिन चूंकि हम बिना किसी विशेष ईसीसी सुविधाओं के साथ मानक फ्लैश का उपयोग करते हैं, इसलिए इस उद्देश्य के लिए रैम का उपयोग करना बेहतर है।
तेजस काले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.