malloc()
ในไมโครคอนโทรลเลอร์โดยทั่วไปถือว่าเป็น "สิ่งเลวร้าย" แต่ถ้าคุณต้องการมันอย่างแน่นอนคุณจะต้องหาบุคคลที่สาม
หากคุณโชคดีรหัสที่คุณย้ายระบบอาจไม่พึ่งพาการนำหน่วยความจำกลับมาใช้ซ้ำ หากเป็นกรณีนี้คุณสามารถเขียนตัวจัดสรรอย่างง่ายซึ่งส่งกลับตัวชี้ไปยังบัฟเฟอร์ RAM แล้วเลื่อนตัวชี้ไปตามขนาดบล็อกที่ร้องขอ
ฉันเคยใช้วิธีการนี้มาก่อนในการย้ายพอร์ตไลบรารีพีซีไปยังไมโครคอนโทรลเลอร์
ด้านล่างนี้คุณควรที่จะติดตั้งที่มีการจัดสรรและการจัดสรรหน่วยความจำ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()
ปกติที่มีให้เช่น FreeListถึงแม้ว่าสิ่งนี้อาจไม่อนุญาตให้คุณจัดสรรบล็อกขนาดตัวแปร