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()
মতো সাধারণত সরবরাহের চেয়ে সহজ বরাদ্দ কাঠামো ব্যবহার করা , যদিও এটি আপনাকে পরিবর্তনশীল আকারের ব্লকগুলি বরাদ্দ করতে দেয় না।