size
कमांड का आउटपुट एक अच्छी शुरुआत स्थान है, लेकिन आपको आवश्यक सारी जानकारी नहीं देता है।
$ avr-size program.elf
text data bss dec hex filename
आपकी छवि का आकार आम तौर पर टेक्स्ट और डेटा अनुभागों के योग से थोड़ा अधिक होता है। बीएसएस अनुभाग अनिवार्य रूप से संपीड़ित है क्योंकि यह सभी 0 है। ऐसे अन्य अनुभाग हो सकते हैं जो प्रासंगिक हैं जो आकार के अनुसार सूचीबद्ध नहीं हैं।
यदि आपकी बिल्ड सिस्टम एवीआर माइक्रोकंट्रोलर के लिए पहले उपयोग की गई है तो आप एक * .elf फ़ाइल के साथ-साथ * .bin फ़ाइल, और संभवत: एक * .hex फ़ाइल के साथ समाप्त हो जाएंगे। * .bin फ़ाइल वास्तविक छवि है जो प्रोसेसर के प्रोग्राम फ्लैश में संग्रहीत की जाएगी, ताकि आप यह निर्धारित करने के लिए अपने आकार की जांच कर सकें कि जब आप इसे संपादित करते हैं तो आपका प्रोग्राम कैसा बढ़ रहा है। * .bin फ़ाइल * .elf फ़ाइल से objdump कमांड और कुछ झंडे से निकाली जाती है जिसे मैं अभी याद नहीं कर सकता।
यदि आप जानना चाहते हैं कि संकलित करते समय आपका सी या सी ++ कोड कितना उत्पादन करेगा, यह बहुत कठिन है। मैंने एक फ़ंक्शन में 10x ब्लाउप देखा है जब मैंने uint32_t की बजाय uint64_t का उपयोग करने का प्रयास किया था, जब मैं बस इतना कर रहा था कि यह बढ़ रहा था (यह लगभग 5 गुना अधिक कोड था जैसा मैंने सोचा था)। यह ज्यादातर जीसीसी के एवीआर ऑप्टिमाइज़ेशन के साथ सबसे अच्छा नहीं था, लेकिन कोड आकार में छोटे बदलाव स्पष्ट रूप से निर्दोष कोड से निकल सकते हैं।
यह संभवतः सी ++ के उपयोग के साथ बढ़ाया जाएगा, जो सी की तुलना में कोड में बदलने वाली और चीजों को छिपाने के लिए होता है। चीजों के बीच चीफ सी ++ छुपाएं विनाशक कॉल हैं और पॉइंटर डीरफ्रेंसिंग के बहुत सारे हैं जिन्हें ऑब्जेक्ट्स में this
पॉइंटर के साथ-साथ एक गुप्त सूचक के साथ भी करना है, कई ऑब्जेक्ट्स में उनके वर्चुअल फ़ंक्शन टेबल और क्लास स्थिर चर होते हैं।
एवीआर पर यह सभी सूचक सामग्री वास्तव में जोड़ने की संभावना है क्योंकि पॉइंटर्स रजिस्टरों के रूप में दोगुनी बड़ी हैं और लोड करने के लिए कई निर्देश लेते हैं। इसके अलावा एवीआर में केवल कुछ रजिस्टर जोड़े हैं जिन्हें पॉइंटर्स के रूप में उपयोग किया जा सकता है, जिसके परिणामस्वरूप उन रजिस्टरों में से कई चीजें चलती हैं।
AVR पर छोटे कार्यक्रमों के लिए कुछ युक्तियां:
उपयोग uint8_t
और int8_t
बजाय int
जब भी आप कर सकते हैं। यदि आप अपना कोड पोर्टेबल होना चाहते हैं तो आप और int_fast8_t
का भी उपयोग कर सकते हैं। इससे कई ऑपरेशन हो सकते हैं जो केवल आधा कोड लेते हैं, क्योंकि int
दो बाइट्स हैं।
स्ट्रिंग और स्ट्रक्चर स्थिरांक और शाब्दिक और कैसे/जहां वे संग्रहीत हैं, जैसी चीजों से अवगत रहें।
यदि आप इससे डरते नहीं हैं, तो एवीआर असेंबली मैनुअल पढ़ें।आप निर्देशों के प्रकारों का एक विचार प्राप्त कर सकते हैं, और उस प्रकार से सी कोड जो आसानी से उन निर्देशों को मानचित्र करता है। उस तरह के सी कोड का प्रयोग करें।
64k किसी के लिए पर्याप्त होना चाहिए! –
16kB "स्वचालित रूप से जुड़े हुए रनटाइम के लिए आवश्यक आकार के दसवें" से "लगभग एक हजार कथन" के लिए कहीं भी प्रतिनिधित्व करता है, बाद में संकलित बयान के लिए औसत 16 बाइट मानते हैं। –
सुनिश्चित करें कि किसी भी बड़े बफर को स्थिर रूप से आवंटित न करें। – Anon