2016-01-13 7 views
5

मैं Ravenscar सबसेट का उपयोग कर एक एडी प्रोग्राम लिख रहा हूं (इस प्रकार, मैं निष्पादन समय पर चल रहे कार्यों की संख्या से अवगत हूं)। कोड -fstack-check स्विच सक्षम के साथ जीसीसी द्वारा संकलित किया गया है। यदि प्रोग्राम में से कोई भी कार्य उनके ढेर से अधिक हो तो प्रोग्राम रनटाइम पर STORAGE_ERROR बढ़ाएगा।Ravenscar प्रोग्राम में स्टैक उपयोग निर्धारित करने के लिए सर्वोत्तम अभ्यास

एडीए उन लोगों के लिए ऊपरी सीमा निर्धारित करने की अनुमति देता (कार्य-विशिष्ट) तो तरह-अपने कार्य के विनिर्देश के दौरान स्टैक्स:

pragma Storage_Size (Some_Value); 

अब मैं सोच रहा था क्या विकल्प मेरे पास Some_Value निर्धारित करने के लिए। मैंने अब तक जो सुना है:

  1. जंगली अनुमान तब तक करें जब तक कोई STORAGE_ERROR नहीं उठाया जाता है। यह ओपी सुझाव देता है कि here क्या है।
  2. वहां -fstack-usage के आउटपुट को फ़ीड करें।
  3. here के रूप में उल्लिखित कुछ gnat विशिष्ट एक्सटेंशन का उपयोग करें (यह तकनीकी रूप से आइटम # 2 से अलग कैसे है?)।
  4. gnatstack जैसे स्टैक विश्लेषक प्राप्त करें और इसे आपके लिए काम करने दें।

अगर मैं इस बात को समझ सही ढंग से सब से ऊपर की तकनीक है गतिशील (यानी वे काम करने के लिए चलाने के लिए कार्यक्रम की आवश्यकता होती है)। स्थिर दृष्टिकोण भी कल्पना योग्य हैं? जैसे कुछ एडा के उच्च अखंडता विकल्पों (जैसे No_Recursion, और क्या?) के माध्यम से खुद को प्रतिबंधित करके

शायद आप में से कोई भी इस समस्या से निपटने के लिए कुछ सर्वोत्तम प्रथाओं का नाम दे सकता है और/या मेरी (निश्चित रूप से अपूर्ण) सूची में विस्तार/टिप्पणी कर सकता है।

बोनस प्रश्न: उपर्युक्त प्रगति निर्दिष्ट नहीं होने पर कार्य के ढेर का डिफ़ॉल्ट आकार क्या होता है? जीसीसी का docs केवल यह मान देता है कि यह मान किसी भी ठोस संख्या के बिना रनटाइम पर निर्भर करता है।

+1

अच्छी पृष्ठभूमि अनुसंधान के साथ अच्छा सवाल! –

+0

डिफ़ॉल्ट स्टैक आकार 'System.Parameters.Default_Stack_Size' (फ़ाइल' s-parame.adb') में दिया गया है। –

+0

@ सिमॉन: क्या वह ढेर आकार पर्यावरण कार्य, घोषित कार्यों या सभी कार्यों से संबंधित है? मैं पूछता हूं क्योंकि मैं एक "सेट स्टैक आकार" विकल्प में आया था जो पर्यावरण कार्य को प्रभावित नहीं करता था - जो स्पष्ट रूप से उस विशिष्ट कंपाइलर रिलीज के साथ किसी भी माध्यम से सेटटेबल नहीं था, जिसने उलिमिट सेटिंग्स का भी उल्लंघन किया था। मैंने पूरे कार्यक्रम को एक नए कार्य में ले जाकर इसके आसपास काम किया ... –

उत्तर

1

आप आमतौर पर 'Storage_Size विशेषता (जो बिट्स में गिना जाता है) के साथ व्यक्तिगत प्रकारों द्वारा आवश्यक स्टैक स्पेस की जांच कर सकते हैं।

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

+0

क्या आप इसे मैन्युअल रूप से करने का सुझाव दे रहे हैं? यह एक कठिन प्रयास की तरह लगता है ... क्या इसके लिए शायद कोई उपकरण समर्थन है? – morido

+1

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

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