2010-10-13 11 views
5

क्या ऐसा कोई सरणी बनाना संभव है जो 256 बाइट सीमा पार न करे? यह अलग-अलग सरणी वस्तुओं के पते केवल निचले बाइट में भिन्न होते हैं। सरणी को 256 बाइट्स के साथ गठबंधन रखने की तुलना में यह कमजोर आवश्यकता है। एकमात्र समाधान जिसे मैं सोच सकता था next_power_of_two(sizeof(array)) पर संरेखित कर रहा था, लेकिन मुझे इस तरह के अंतराल के बारे में निश्चित नहीं है।ऐरे 256 बाइट सीमा पार नहीं कर रहा

यह एवीआर माइक्रोकंट्रोलर के लिए लाइब्रेरी के लिए है, और यह मुझे एक इंटरप्ट हैंडलर में कुछ मूल्यवान निर्देशों को बचाएगा। इस संपत्ति के पास यह सार होना चाहिए जो कुल स्थिर स्मृति के लगभग 80 बाइट्स से 54 बाइट लंबा है पुस्तकालय। मैं ऐसे तरीके की तलाश में हूं जो स्मृति आवश्यकताओं को बढ़ाएगा।

मैं avr-gnu assembler और avr-ld लिंकर के रूप में उपयोग कर रहा हूं।

उदाहरण: यदि सरणी 0x00f0 पते पर शुरू होती है, तो सरणी को घुमाने के दौरान उच्च शब्द 0x00 से 0x01 में बदल जाएगा।

मुझे सच में परवाह नहीं है कि यह पता 0x0100 या 0x0101 पर शुरू होता है जब तक यह सीमा पार नहीं करता है।

+0

आपको सरणी के पते को गठबंधन करने की आवश्यकता है? यह आपके निर्देश गणना को कैसे कम करता है क्योंकि आप पहले ही जानते हैं कि सरणी <= 256 तत्व है? – MSN

+0

मुझे इसे गठबंधन रखने की आवश्यकता नहीं है। मैंने जो उदाहरण जोड़ा है उसे देखें। – cube

+1

नोट हालांकि कि सरणी को ** ** ** ** बाइट सीमा से गठबंधन करना आपकी आवश्यकताओं को पूरा करेगा - आपका लिंकर * इन आवंटन को सॉर्ट करने में सक्षम होना चाहिए ताकि आपको बर्बाद स्मृति न मिल सके। –

उत्तर

1

इस आवश्यकता को पूरा करने के लिए आपको केवल 64 बाइट संरेखण की आवश्यकता है, उदाहरण के लिए यह काम करना चाहिए:

uint8_t a[54] __attribute__ ((aligned(64))); 
+1

यह मेमोरी पदचिह्न को बढ़ा सकता है क्योंकि मुझे नहीं लगता कि लिंकर उपभोक्ता स्मृति –

0

मैं AVR माइक्रोकंट्रोलर्स बारे में कुछ पता नहीं है, लेकिन, आम तौर पर बोल रहा है, स्थैतिक चर आमतौर पर निष्पादन के डेटा अनुभाग में रखा जाता है, और, के बाद से अपने स्थिर स्मृति आवश्यकताओं कम कर रहे हैं, सभी आपको यह सुनिश्चित करने की आवश्यकता है कि डेटा अनुभाग 256 बाइट गठबंधन है। (जो डिफ़ॉल्ट रूप से हो सकता है। X86 पर, यह आमतौर पर होता है।) लिंकर विकल्प जांचें ...

+1

पर .bs प्रविष्टियों को पुन: व्यवस्थित करने के लिए पर्याप्त स्मार्ट है और क्या होता है जब मेरी लाइब्रेरी के विरुद्ध जुड़ा हुआ कोई अन्य कोड अधिक स्थिर स्मृति आवंटित करता है? यह सब .bss पर जाता है और मेरा छोटा सरणी पूरे खंड में कहीं भी स्थानांतरित हो जाता है, है ना? – cube

+0

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

संबंधित मुद्दे