दिलचस्प पोस्ट
AppBarLayout के साथ स्क्रॉलिंग दृश्य ओवरलैप करें मैं UITableView चयन हाइलाइटिंग को अक्षम कैसे कर सकता हूं? एक सामान्य शब्दकोश कुंजी के रूप में एक वस्तु का उपयोग करना मैं सेंकम आउटपुट को कैसे 'बिन' डायर में बनाऊं? AngularJS एनजी-दोहरा में दोहराए गए तत्वों की गणना की गई क्या स्प्रिंगएमवीसी को सभी अनुरोधों को संसाधित करने के लिए कॉन्फ़िगर किया जा सकता है, लेकिन क्या स्थिर सामग्री निर्देशिका को बाहर किया जा सकता है? वॉली अनुरोध में कस्टम हेडर कैसे सेट करें नियमित अभिव्यक्ति का उपयोग करते हुए एक अस्थायी बिंदु संख्या का पता लगाने के लिए ATTACH के साथ खोले गए SQLite डेटाबेस फ़ाइल में तालिकाओं की सूची कैसे करें? एक स्ट्रिंग में उसका नाम दिया गया एक चर का मान कैसे प्राप्त करें? आईओएस – एक दृश्य के माध्यम से सभी को छूते हैं # कैसे <bits / stdc ++। H> को शामिल करता है> सी ++ में काम करता है? जावा स्ट्रिंग शाब्दिक पूल और स्ट्रिंग के संयोजन के बारे में एक भ्रम एक जावा कार्यक्रम में एक और जार निष्पादित करें जावास्क्रिप्ट इंजन को एनआईटी में एम्बेड करना

अधिकतम स्टैक उपयोग का निर्धारण कैसे करें?

एम्बेडेड / स्मृति विवश सिस्टम के लिए इष्टतम स्टैक आकार निर्धारित करने के लिए कौन सी विधियां उपलब्ध हैं? यदि यह बहुत बड़ा है तो मेमोरी बर्बाद हो जाती है जिसका उपयोग कहीं और किया जा सकता है। हालांकि, यदि यह बहुत छोटा है तो हमें इस वेबसाइट के नाम मिलते हैं …

चीजों को शुरू करने की कोशिश करने के लिए: जैक गैन्सल ने आर्ट ऑफ डिजाइनिंग एंबेडेड सिस्टम्स में कहा, "अनुभव के साथ, एक स्टैक के लिए उचित आकार की गणना करने के लिए मानक, वैज्ञानिक तरीके सीखता है: यादृच्छिक और आशा पर एक आकार चुनें।" क्या कोई उस से बेहतर कर सकता है?

एक अधिक विशिष्ट उदाहरण का अनुरोध किया गया था। तो, एक ऑपरेटिंग सिस्टम के बिना आईएआर एंबेडेड वर्कबैच टूलचैन का उपयोग करके 2 केबी रैम के साथ एमएसपी 430 एमसीयू को लक्षित करने वाला सी कार्यक्रम कैसा है? JTAG डीबगर का उपयोग करते समय यह आईडीई स्टैक सामग्री और उपयोग को प्रदर्शित कर सकता है

वेब के समाधान से एकत्रित समाधान "अधिकतम स्टैक उपयोग का निर्धारण कैसे करें?"

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

यह ठीक है कि आईएआर आईडीई कैसे उपयोग की जाने वाली स्टैक की मात्रा निर्धारित करता है।

आपने अपने प्रश्न को स्थिर-विश्लेषण के साथ टैग किया है, लेकिन यह एक ऐसी समस्या है जो स्थिर-विश्लेषण के माध्यम से हल करना कठिन है। स्टैक उपयोग प्रोग्राम की रनटाइम प्रोफ़ाइल पर निर्भर करता है, खासकर यदि आप पुनरावर्ती या आलोक का उपयोग कर रहे हैं यह देखते हुए कि यह एक एम्बेडेड प्लेटफ़ॉर्म है, मुझे लगता है कि ps या ऊपर की तरह कुछ को चलाने के लिए भी मुश्किल है और देखें कि आपका एप्लिकेशन कितना स्टैक उपयोग कर रहा है।

एक दिलचस्प दृष्टिकोण यह निर्धारित करने के लिए कि कितने स्टैक उपयोग किया जाता है, वर्तमान स्टैक फ्रेम के पते का उपयोग करना है आप किसी फ़ंक्शन के तर्क या स्थानीय चर का पता लेकर यह कर सकते हैं। मुख्य फ़ंक्शन के लिए और ऐसा कार्य जो आपको लगता है कि अधिकांश स्टैक का उपयोग कर रहे हैं। अंतर आपको बताएगा कि आपके आवेदन की आवश्यकता के अनुसार स्टैक की मात्रा। यहां एक उदाहरण है (प्रथागत उच्च-से-निम्न स्टैक विकास मानते हुए)

char *stack_top, stack_bottom; int main(int argc, char *argv[]) { stack_top = (char *)&argc; // ... printf("Stack usage: %d\n", stack_top - stack_bottom); } void deeply_nested_function(void) { int a; stack_bottom = (char *)&a; // ... } 

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

 void stack_measurement_function(void) { int a; stack_bottom = min(stack_bottom, (char *)&a); // ... } 

मैंने इन चार्ट्स को जेनरेट करने के लिए वर्णित के समान एक दृष्टिकोण का उपयोग किया

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

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

डीएमएस सॉफ्टवेयर रीनजिनिअरिंग टूलकिट सी कार्यक्रमों के लिए इन सभी आवश्यकताओं को पूरा करती है। देखें http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html आपको कॉल ग्राफ को क्रॉल करके और विभिन्न आकार अनुमानों का उपयोग करके स्टैक की मांग को मापने के लिए अभी भी उसे कॉन्फ़िगर करना होगा।

यदि आप एक तेज उत्तर चाहते हैं, तो स्टैक-भर चाल का उपयोग करें। यदि आप एक उत्तर चाहते हैं कि आप प्रत्येक स्रोत कोड परिवर्तन के बाद दोबारा जोड़ सकते हैं तो आपको स्थैतिक विश्लेषण दृष्टिकोण की आवश्यकता होगी।

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

हालांकि, कुछ प्राप्तियां जटिलता से कुछ राहत देते हैं:

(1) एक उच्च-स्तरीय भाषा कंपाइलर का उपयोग करते समय, प्रत्येक कथन / लाइन-ऑफ-कोड के निष्पादन के अंत में स्टैकपॉइन्टर उसी स्थान पर होना चाहिए, जैसा कि शुरुआत में था (कम से कम यह अन्यथा पालन करने के लिए एक अच्छा नियम होगा, आपको समस्याएं होने वाली हैं!)

(2) प्रत्येक फ़ंक्शन या सब-रूटिन कॉल से लौटने के बाद स्टैकपॉइंटर को समान होना चाहिए क्योंकि यह प्री-कॉल था। इसलिए प्रत्येक स्टेटमेंट में पहुंचने वाले अधिकतम स्टैक आकार की अधिकतम स्टैक साइज़ अधिकतम, कार्यक्रम के सभी बयानों से अधिक है (कम से कम यह अन्यथा पालन करने के लिए एक अच्छा नियम होगा, आपको समस्याएं होने वाली हैं!)

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

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

भाग्यशाली बात ये है कि, पुनरावर्ती दिनचर्या के अलावा, अधिकतम संभव स्टैक्सइज़ आवश्यकता कार्यक्रम के प्रवाह पर निर्भर नहीं करती है, हालांकि एक विशिष्ट प्रवाह (जो डेटा निर्भर है) में यह अधिकतम संभव ढेर हो सकता है कभी नहीं पहुंचा जा सकता है।

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

मुझे ओएस स्टैक पर रुकावटों को अपने स्टैकस्पेस को देना चाहिए, अगर उन्हें किसी की ज़रूरत होती है, तो वे रिवर्स-इन-इंटरप्ट एड्रेस के अलावा प्रोग्राम स्टैक आवश्यकताओं में नहीं जोड़ते हैं

  • कभी भी पुनरावर्ती या पुनरावर्ती एल्गोरिदम का उपयोग करें। (रेगेक्स पुस्तकालयों से सावधान रहें)
  • सरणियों का उपयोग करें, हमेशा malloc () का उपयोग करें।
  • एलोका () का उपयोग करें, कुछ कम्पाइलर भी इस फ़ंक्शन में कीड़े हैं।

तब कोड के हिस्से को हाथ से जांचकर देखें, जहां स्टैक उपयोग की संभावना सबसे अधिक है (याद रखें मैंने कोई एरे नहीं कहा था)

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