malloc()
माइक्रोकंट्रोलर्स में आमतौर पर एक "बुरी चीज" मानी जाती है। लेकिन, अगर आपको इसकी पूरी जरूरत है तो आप थर्ड पार्टी वर्जन ढूंढना चाहेंगे।
यदि आप भाग्यशाली हैं, तो आप जिस कोड को पोर्ट कर रहे हैं, वह मेमोरी के पुन: उपयोग करने वाले ब्लॉकों पर भरोसा नहीं कर सकता है। यदि यह मामला है, तो आप एक सरल आवंटनकर्ता लिख सकते हैं जो एक सूचक को एक रैम बफर में लौटाता है, फिर अनुरोधित ब्लॉक आकार से सूचक को आगे बढ़ाता है।
मैंने पीसी पुस्तकालयों को माइक्रोकंट्रोलर में पोर्ट करने से पहले इस दृष्टिकोण का सफलतापूर्वक उपयोग किया है।
नीचे, आप आवंटनकर्ता के साथ सेटअप करेंगे my_malloc_init()
और मेमोरी को आवंटित करेंगे my_malloc()
। my_free()
वहाँ निर्भरता को संतुष्ट करने के लिए है, लेकिन वास्तव में कुछ भी नहीं होगा। अंततः आप निश्चित रूप से अंतरिक्ष से बाहर भाग जाएंगे।
इस काम को करने के लिए, आपको अपने कोड की सबसे खराब स्थिति की आवश्यकता को मापने की आवश्यकता होगी (यदि संभव हो तो पीसी पर ऐसा करें) तो HEAP_SIZE
तदनुसार सेट करें । डायनामिक मेमोरी की आवश्यकता के लिए अपने पुस्तकालय के भाग में प्रवेश करने से पहले, कॉल करें my_malloc_init()
। पुन: उपयोग करने से पहले, सुनिश्चित करें कि कुछ भी नहीं अभी भी अंक heap
।
uint8_t heap[HEAP_SIZE];
uint8_t *heap_ptr;
void my_malloc_init(void)
{
heap_ptr = heap;
}
void *my_malloc(size_t len)
{
uint8_t *p = heap_ptr;
heap_ptr += len;
if (heap_ptr >= heap + HEAP_SIZE)
return NULL;
else
return p;
}
void my_free(void)
{
// do nothing
}
(ध्यान दें: वास्तविक दुनिया में, आपको सूचक संरेखण पर विचार करने की आवश्यकता हो सकती है, अर्थात heap_ptr
2 या 4 बाइट्स तक गोलाई )
एक और विकल्प malloc()
एक फ्रीलास्ट की तरह, आमतौर पर प्रदान की तुलना में एक सरल आवंटन संरचना का उपयोग करना है , हालांकि यह आपको चर आकार के ब्लॉक आवंटित करने की अनुमति नहीं दे सकता है।