2010-08-02 10 views
6

मैं एक अजीब समस्या में भाग रहा हूं, मैं कुछ हद तक ट्रैक करने में सक्षम हूं लेकिन मुझे अभी भी कारण दिखाई नहीं दे रहा है। शायद यहां कोई व्यक्ति कुछ प्रकाश डाल सकता है?एम्बेडेड प्लेटफ़ॉर्म पर थ्रेड क्लास मेमोरी आवंटन विषमता

मैं VxWorks 5.5 के शीर्ष PPCgnu604 toolchain के साथ C++ के विकास पर पॉवर प्रोसेसर पर चल रहा हूँ।

मैं बहुत की तरह एक वर्ग है:

class MyClass 
{ 
    public: 
    void run(void); 
    private: 
    CommandMesssageClass command; 
    StatusMessageClass status; 
}; 

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

ध्यान दें कि यह कक्षा का एक कटा हुआ संस्करण है। ब्रेवटी के लिए कई अन्य विधियां और चर छोड़ दिए गए हैं।

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

अगर मैं एक या एक से रन समारोह में संदेश घोषणाओं के दोनों ले जाते हैं, यह कोई अतिरिक्त आवंटन के साथ ठीक काम करता है!

मैं सी ++ घोषणाओं और स्मृति आवंटन की मेरी समझ में कुछ मौलिक लापता होना चाहिए। मेरी समझ यह है कि एक वर्ग उदाहरण जिसे मैं गतिशील रूप से instansiate बनाया जाएगा पूरी तरह से ढेर (सभी सदस्य चर सहित) पर आवंटित किया जाएगा जब यह बनाया गया है। मैं यहां जो अंतर देखता हूं वह यह होगा कि संदेश की घोषणाओं को रन फ़ंक्शन में ले जाने के बजाय उन्हें स्टैक पर रखा जाता है। इस मामले में ढेर कक्षा के पूरे आकार को बढ़ाने के लिए काफी बड़ा है। ऐसा लगता है कि विशिष्ट हिस्सों का उपयोग तब तक पर्याप्त स्मृति आवंटित नहीं किया जा रहा है?

संदेश कक्षाएं स्वयं के गतिशील आवंटन नहीं करती हैं। (और यदि उन्होंने किया, तो मैं घोषणा करता हूं कि घोषणा इस मामले में व्यवहार को नहीं बदलेगी और मुझे अभी भी ढेर के आकार में बदलाव दिखाई देगा।)

स्मृति आवंटन की निगरानी करने के लिए मैं निम्नलिखित का उपयोग कर रहा हूं VxWorks memLib (या memPartLib) कॉल:

memPartInfoGet(memSysPartId, &partitionStatus); 
... 
bytesFree = partitionStatus.numBytesFree; 

संपादित करें:

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

मैं कर लिया है के रूप में मैं का वर्णन किया है वर्ग चर ले जाकर समस्या से छुटकारा पाने के।

+0

यह स्पष्ट रूप से स्पष्ट नहीं है कि आपकी समस्या क्या है, क्या आप सामान सदस्यों को स्टैक पर बनाम सामान के रूप में आवंटित करने वाली अधिक मेमोरी का उपयोग करते हैं, या यह है कि उपयोग की गई स्मृति किसी एक मामले में समय के साथ बदलती है? – nos

+1

क्या आप सार्वजनिक अनुभाग में सदस्यों को उठाते समय आकार (MyClass) बदलते हैं? और स्मृति आवंटन कितना बदलता है? –

+1

* आवंटन कब बदलता है? छोटे वर्ग वस्तुओं के ढेर पर एक मुक्त ब्लॉक में एक आसान समय फिटिंग है। –

उत्तर

2

मैं कुछ सी ++ घोषणाओं और स्मृति आवंटन की मेरी समझ में मौलिक लापता होना चाहिए।

मुझे ऐसा नहीं लगता है। सब कुछ जो आप कहते हैं कि आप ऊपर की उम्मीद करते हैं वह सही है - गेम प्रोग्रामर हर समय इस व्यवहार पर भारी निर्भर करते हैं।:-)

ऐसा क्यों है पर्याप्त स्मृति आवंटित करने के लिए नहीं है जब तक विशिष्ट भागों उपयोग किया जाता है प्रतीत होता है?

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

दूसरे शब्दों में, रनटाइम आवंटन दोनों मामलों में है, लेकिन माइक्लास के दो अलग-अलग आकारों का मतलब है कि मॉलोक पूल अलग-अलग होते हैं। आप ऑब्जेक्ट को रन() के अंदर स्टैक पर ले जाकर साबित कर सकते हैं, लेकिन MyClass को उसी आकार में पैडिंग कर सकते हैं। यदि आप अभी भी नि: शुल्क ज्ञापन ड्रॉप देखते हैं, तो उसके साथ यह करने के लिए कुछ भी नहीं है कि वे वस्तुएं ढेर या ढेर पर हैं ... यह एक द्वितीयक प्रभाव है जो MyClass के आकार के कारण हो रहा है।

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

मैं आपके टूलचैन से परिचित नहीं हूं, लेकिन एम्बेडेड सिस्टम पर अप्रत्याशित छोटे आवंटन के लिए सामान्य संदिग्धों में सीटीपी फ़ंक्शन (लोकेशंस), और दिनांक/समय कार्य (समय क्षेत्र) शामिल हैं।

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