2011-06-16 10 views
9

जब मैं किल कंपाइलर को "--callgraph" विकल्प देता हूं, यह स्थिर रूप से मेरे लिए सटीक "अधिकतम स्टैक उपयोग" की गणना करता है।एम्बेडेड सिस्टम में अधिकतम स्टैक उपयोग कैसे निर्धारित करें?

हां, आज यह मुझे "अधिकतम स्टैक उपयोग = 284 बाइट्स + अज्ञात (बिना ढेर के फ़ंक्शंस ...)" संदेश दे रहा है, "बिना स्टैक जानकारी वाले फ़ंक्शंस" की एक सूची के साथ।

निगेल जोन्स का कहना है कि प्रत्यावर्तन एम्बेडेड सिस्टम ("Computing your stack size" 2009) में एक बहुत बुरा विचार है, तो मैं इस कोड में किसी भी पारस्परिक रूप से पुनरावर्ती कार्यों बनाने के लिए नहीं सावधान किया गया है।

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

प्रत्यावर्तन या फिर से प्रवेशी बाधा संचालकों के बिना, यह सक्षम स्थिर अधिकतम ढेर उपयोग निर्धारित करने के लिए करना चाहिए। (और How to determine maximum stack usage? पर लागू होने वाले अधिकांश उत्तरों लागू नहीं होते हैं)। मेरे समझ है कि सॉफ्टवेयर है कि "--callgraph" विकल्प पहले संभालती प्रत्येक हैंडलर बीच में के लिए जब यह एक उच्च-प्राथमिकता व्यवधान से बाधित नहीं कर रहा है अधिकतम ढेर गहराई पाता है, और मुख्य() फ़ंक्शन जब की अधिकतम ढेर गहराई यह बाधित नहीं है। फिर यह कुल (सबसे खराब-केस) अधिकतम ढेर गहराई को खोजने के लिए उन्हें सभी जोड़ता है। ऐसा तब होता है जब मुख्य() पृष्ठभूमि कार्य इसकी अधिकतम गहराई पर होता है जब यह सबसे कम प्राथमिकता वाले बाधा से बाधित होता है, और अंतराल इसकी अधिकतम गहराई पर होता है जब यह अगली-निम्न-प्राथमिकता वाले बाधा से बाधित होता है, और इसी तरह ।

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

मैं LM3S1968 एआरएम कॉर्टेक्स-एम 3 के लिए कोड को संकलित करने के Keil uVision V4.20.03.0 उपयोग कर रहा हूँ।

तो "--callgraph" मैं "फ्रेम निर्देशों" का उपयोग सॉफ्टवेयर है कि संभालती है बताने के लिए है कितना इन कार्यों का उपयोग ढेर? या अधिकतम स्टैक उपयोग निर्धारित करने के लिए कुछ बेहतर तरीका है?

लिंकर विकल्प में (लगभग एक ही सवाल जीसीसी संकलक के लिए लक्षित के लिए How to determine maximum stack usage in embedded system with gcc? देखें।)

+2

शायद आप अपने असेंबली मॉड्यूल के डमी सी समकक्ष (स्टैक उपयोग के दृष्टिकोण से) कोड कर सकते हैं, और उन लोगों के साथ अपना विश्लेषण चलाएं। –

+0

मैंने 'केइल' टैग जोड़ा क्योंकि यह एक कंपाइलर-विशिष्ट प्रश्न है। उम्मीद है कि समस्या के लिए कुछ और विशेष आंखें आकर्षित करेंगे। – bta

+0

मुझे यकीन नहीं है कि क्या आप जीसीसी को इसी तरह के विश्लेषण करने के लिए या किल से "अज्ञात" संदेश से छुटकारा पाने के तरीके के बारे में पूछ रहे हैं (या शायद आप दोनों की तलाश कर रहे हैं, इस मामले में वहां होना चाहिए दो अलग प्रश्न)। चूंकि ऐसा प्रतीत होता है कि आपने यह निर्धारित किया है कि "अज्ञात" उन कार्यों से आता है जो शून्य स्टैक का उपयोग करते हैं, ऐसा लगता है कि आप इसे अनिवार्य रूप से अनदेखा कर सकते हैं। –

उत्तर

3

उपयोग --info = ढेर। मानचित्र फ़ाइल में बाहरी लिंकेज वाले सभी कार्यों के लिए एक स्टैक उपयोग शामिल होगा।

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

यह और Keil के लिए लागू और अधिक आम तौर पर वर्णित हैं यूटा विश्वविद्यालय के here

3

जॉन रीगहर http://www.embedded.com/design/prototyping-and-development/4025013/Say-no-to-stack-overflow पर एम्बेडेड सिस्टम में ढेर उपयोग को मापने का एक अच्छा चर्चा है अन्य तकनीकों, हालांकि टिप्पणी एफ़टीपी के लिए लिंक है कि। embedded.com पुराना है, और "इंटरप्ट अक्षम किए बिना" की एक घटना या तो पहले या आखिरी शब्द को अस्वीकार कर दिया जाना चाहिए। वाणिज्यिक दुनिया में, कवरिटी में एक कॉन्फ़िगर करने योग्य स्टैक ओवरफ़्लो चेकर है, और कोडवायरियर के कुछ संस्करणों में अर्ध-दस्तावेज चेतावनी_स्टैक_यूज प्रगामा है। (यह कंपाइलर प्रलेखन के मेरे संस्करण में उल्लेख नहीं है, लेकिन मेट्रोवर्क्स के "लक्ष्यीकरण पाम ओएस" दस्तावेज़ में है।)

+0

ग्रेट लिंक, और मुझे उम्मीद है कि कुछ फ्रीस्केल एचसीएस 08 काम के लिए उन तकनीकों का उपयोग करने की उम्मीद है (2 केबी रैम, इसलिए हर बाइट गिनती और आप अप्रयुक्त स्टैक पर बर्बाद नहीं करना चाहते हैं)। छोटी दुनिया: 90 के दशक में आपने न्यूटन के लिए कागी रजिस्टर ऐप बनाया, और मैंने order.kagi.com वेबसाइट बनाई। – tomlogic

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