एम्बेडेड सिस्टम के लिए ऑप्टिमाइज़ेशन निम्न-स्तरीय प्रोग्रामिंग सामान्य प्रयोजन के उपकरणों, जैसे कंप्यूटर और सेल फोन के लिए प्रोग्रामिंग से काफी अलग है। दक्षता (गति और स्थान के संदर्भ में) कहीं अधिक महत्वपूर्ण है क्योंकि संसाधन एक प्रीमियम पर हैं। इसका मतलब है कि अगर आप अंतरिक्ष से बाहर जाते हैं तो सबसे पहली बात यह है कि आप अपने कोड के किन हिस्सों को देख सकते हैं।
प्रोग्राम स्पेस (फ्लैश) के उपयोग को कम करने के संदर्भ में, कोड आकार को अनुकूलित करना काफी मुश्किल हो सकता है यदि आप अनुभवहीन हैं, या यदि आप डेस्कटॉप कंप्यूटर के लिए प्रोग्रामिंग के लिए अधिक उपयोग किए जाते हैं जो उस कौशल की आवश्यकता नहीं है। दुर्भाग्य से, कोई 'मैजिक बुलेट' दृष्टिकोण नहीं है जो सभी स्थितियों के लिए काम करेगा, हालांकि यह मदद करता है यदि आप गंभीरता से विचार करते हैं कि आपके स्केच को वास्तव में क्या करने की आवश्यकता है। यदि किसी सुविधा की आवश्यकता नहीं है, तो उसे निकाल लें।
कभी-कभी यह पहचानना भी मददगार होता है कि आपके कोड के कई हिस्से समान (या बहुत समान) कहां हैं। आप उन्हें पुन: प्रयोज्य कार्यों में सम्मिलित करने में सक्षम हो सकते हैं जिन्हें कई स्थानों से बुलाया जा सकता है। हालांकि, ध्यान रखें कि कभी कभी कोड बनाने के लिए कोशिश कर रहा हो भी पुन: प्रयोज्य वास्तव में इसे और अधिक वर्बोज़ बनाने समाप्त होता है। यह एक मुश्किल संतुलन है जो हड़ताल करता है जो अभ्यास के साथ आता है। कुछ समय यह देखते हुए कि कोड परिवर्तन कैसे प्रभावित करते हैं संकलक आउटपुट मदद कर सकता है।
रनटाइम डेटा (SRAM) ऑप्टिमाइज़ेशन का उपयोग थोड़ा आसान हो जाता है जब आप इसका उपयोग करते हैं। शुरुआती प्रोग्रामर के लिए एक बहुत ही सामान्य नुकसान बहुत अधिक वैश्विक डेटा का उपयोग कर रहा है। वैश्विक दायरे में घोषित कुछ भी स्केच के पूरे जीवनकाल के लिए मौजूद रहेगा, और यह हमेशा आवश्यक नहीं है। यदि एक चर का उपयोग केवल एक फ़ंक्शन के अंदर किया जाता है, और इसे कॉल के बीच बने रहने की आवश्यकता नहीं है, तो इसे एक स्थानीय चर बनाएं। यदि मान को फ़ंक्शन के बीच साझा करने की आवश्यकता है, तो विचार करें कि क्या आप इसे वैश्विक बनाने के बजाय एक पैरामीटर के रूप में पास कर सकते हैं। इस तरह से आप केवल SRAM का उपयोग उन चरों के लिए करेंगे जब आपको वास्तव में इसकी आवश्यकता होगी।
SRAM उपयोग के लिए एक अन्य हत्यारा पाठ प्रसंस्करण है (जैसे String
कक्षा का उपयोग करके )। आम तौर पर, यदि संभव हो तो आपको स्ट्रिंग संचालन करने से बचना चाहिए। वे बड़े पैमाने पर मेमोरी हॉग हैं। उदाहरण के लिए, यदि आप धारावाहिक के लिए बहुत सारे पाठ का उत्पादन कर रहे हैं, तो Serial.print()
स्ट्रिंग संयोजन का उपयोग करने के बजाय कई कॉल का उपयोग करें। यदि संभव हो तो अपने कोड में स्ट्रिंग शाब्दिकों की संख्या को कम करने का प्रयास करें।
यदि संभव हो तो पुनरावृत्ति से बचें। हर बार एक पुनरावर्ती कॉल किया जाता है, यह स्टैक को एक गहरे स्तर पर ले जाता है। इसके बजाय पुनरावर्ती होने के लिए अपने पुनरावर्ती कार्यों को प्रतिबिंबित करें।
EEPROM का उपयोग करें EEPROM का उपयोग उन चीजों के दीर्घकालिक भंडारण के लिए किया जाता है जो केवल कभी-कभी बदलते हैं। यदि आपको निश्चित डेटा की बड़ी सूचियों या लुक-अप तालिकाओं का उपयोग करने की आवश्यकता है, तो इसे EEPROM में अग्रिम रूप से संग्रहीत करने पर विचार करें, और केवल आवश्यक होने पर आपको जो भी आवश्यक हो, उसे बाहर निकालना चाहिए।
जाहिर है कि EEPROM आकार और गति में काफी सीमित है, और इसमें सीमित संख्या में लेखन चक्र हैं। यह डेटा सीमाओं का एक बड़ा समाधान नहीं है, लेकिन यह फ़्लैश या SRAM पर बोझ को कम करने के लिए पर्याप्त हो सकता है। एसडी कार्ड जैसे समान बाह्य भंडारण के साथ इंटरफेस करना भी काफी संभव है।
विस्तार
यदि आपने अन्य सभी विकल्पों को समाप्त कर दिया है, तो विस्तार एक संभावना हो सकती है। दुर्भाग्य से, प्रोग्राम स्पेस बढ़ाने के लिए फ्लैश मेमोरी का विस्तार करना संभव नहीं है। हालांकि, यह है SRAM विस्तार करने के लिए संभव। इसका मतलब है कि आप बढ़ते डेटा आकार की कीमत पर कोड के आकार को कम करने के लिए अपने स्केच को फिर से बनाने में सक्षम हो सकते हैं।
अधिक SRAM प्राप्त करना वास्तव में काफी सीधा है। एक विकल्प एक या एक से अधिक 23K256 चिप्स का उपयोग करना है। वे एसपीआई के माध्यम से एक्सेस किए जाते हैं, और आपको उनका उपयोग करने में मदद करने के लिए स्पिरम लाइब्रेरी है। बस सावधान रहना कि वे 3.3V पर नहीं 5V संचालित !
यदि आप मेगा का उपयोग कर रहे हैं, तो आप वैकल्पिक रूप से Lagrangian Point या बीहड़ सर्किट से SRAM विस्तार ढाल प्राप्त कर सकते हैं ।