c एम्बेडेड सी में डायनामिक मेमोरी आवंटन




memory embedded (3)

क्या मैं फ़ंक्शन मॉलोक का उपयोग कर सकता हूं और एम्बेडेड सी में हटा सकता हूं? उदाहरण के लिए, मेरे पास एक फ़ंक्शन है, जहां फ़ंक्शन malloc के साथ संरचना पर पॉइंटर बनाया गया था। राम में यह फ़ंक्शन रिटर्न पता और मैं इसका उपयोग कर सकता हूं। मेरे समारोह से बाहर निकलने के बाद, जहां स्मृति आवंटित की गई थी, इस सूचक को हटा दिया जाएगा या इस मेमोरी को आरक्षित किया जाएगा, जबकि फ़ंक्शन डिलीट हो जाएगा?

Typedef struct {
  Char varA;
  Char varB 
} myStruct ;

Void myfunc ( void) 
{
  myStruct * ptrStruct = ( myStruct *) malloc ( sizeof (myStruct)) ;
  // Code here 
  //........

  return ;    
}

आम तौर पर, आप एम्बेडेड सिस्टम में malloc का उपयोग नहीं करना चाहिए, क्योंकि ऐसा करने से ऐसा कोई मतलब नहीं है जैसा समझाया गया है यहां । विशेष रूप से, यह किसी भी तरह का मतलब नहीं है कि यह कभी नंगे धातु प्रणालियों पर उपयोग करने के लिए है।

एकमात्र ऐसा स्थान जहां यह गतिशील स्मृति आवंटन का उपयोग करने के लिए समझ में आता है, वह बड़ी मेजबानी की जाती है, मल्टी-प्रोसेस सिस्टम जहां एकाधिक प्रोसेस समान रैम साझा करते हैं। यदि एक एम्बेडेड सिस्टम की आपकी परिभाषा एक एंड्रॉइड स्मार्ट फोन या पोर्टेबल पीसी है, तो हाँ, यह malloc का उपयोग करने के लिए ठीक है

यदि आप इसे कहीं और का उपयोग कर पाते हैं, तो इसका लगभग निश्चित रूप से मतलब है कि आपका प्रोग्राम डिज़ाइन मूलभूत रूप से दोषपूर्ण है और यह भी कि आप कैसे नहीं जानते कि ढेर कैसे काम करता है।

इसके अलावा, लगभग हर एम्बेडेड सिस्टम प्रोग्रामिंग मानक प्रतिबंध गतिशील स्मृति आवंटन।


हां, आप एम्बेडेड सी में malloc का उपयोग कर सकते हैं। कुछ एम्बेडेड सिस्टमों की अपनी इनकॉप्लेटेड मेमोरी आवंटन एपीआई है malloc () सी जीबी एपीआई है

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


एम्बेडेड सिस्टम के बारे में कुछ खास नहीं है जो डायनामिक मेमोरी के इस्तेमाल को रोकते हैं।

हालांकि आपको इसके लिए कई तरीकों से सहायता प्रदान करनी पड़ सकती है, उदाहरण के लिए:

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

हालांकि कई कारण हैं, लेकिन आप एम्बेडेड सिस्टम में डायनामिक स्मृति (या कम से कम मानक लाइब्रेरी कार्यान्वित डायनेमिक मेमोरी) का उपयोग क्यों न करें?

  • मानक आवंटन योजनाओं में हार्ड-रीयल-टाइम सिस्टम के लिए बिना नियत-निर्धारण संबंधी समय-निर्धारण होता है
  • आवंटन की विफलता की संभावना को हर आबंटन के लिए संभाल करने की आवश्यकता है। एक संभावित गैर-नियतात्मक रन-टाइम त्रुटि को सुरक्षित रूप से संभालना सुरक्षित रूप से अधिक जटिल है, बस कंपाइलर से कहना कि बिल्ड समय पर अपर्याप्त मेमोरी है।
  • आपको स्मृति लीक से बचाव की जरूरत है; किसी भी सिस्टम का सच है, लेकिन स्मृति थकावट का प्रबंधन करने के लिए कोई OS नहीं है और लीक की प्रक्रिया को मारने के लिए आपका सिस्टम कैसे व्यवहार करेगा?
  • मानक लायब्रेरी हीप प्रबंधन म्यूट एक्स स्टब या आवरण कार्यों के बिना थ्रेड-सुरक्षित नहीं हो सकता है।
  • ढेर भ्रष्ट होने वाली चीजें तुरंत निष्पादन को प्रभावित करने की संभावना नहीं होती हैं, अक्सर केवल एक हेपिंग विफलता उत्पन्न होती है जब कोई नया हेप ऑपरेशन किया जाता है, जिसके परिणामस्वरूप वास्तविक समय के लिए असंबंधित समय और स्थान पर गैर निर्धारक व्यवहार होता है - जिससे उन्हें निदान करने में बहुत मुश्किल होती है फिर यह किसी भी प्रणाली के लिए सही है, लेकिन एक क्रॉस-होस्टेड एंबेडेड सिस्टम में डीबग सुविधा अक्सर कम परिष्कृत होती है कि स्व-होस्टेड सिस्टम पर।




ram