malloc()
mikrodenetleyicilerde genellikle "kötü bir şey" olarak kabul edilir. Ancak, kesinlikle ihtiyacınız varsa, üçüncü taraf bir sürüm bulmak isteyeceksiniz.
Şanslıysanız, taşıdığınız kod bellek bloklarını yeniden kullanmaya dayanmayabilir. Bu durumda, bir RAM arabelleğine bir işaretçi döndüren ve daha sonra işaretçiyi istenen blok boyutuna göre ilerleten basit bir ayırıcı yazabilirsiniz.
Bu yaklaşımı daha önce PC kütüphanelerini mikrodenetleyicilere taşımak için başarıyla kullandım.
Aşağıda, ayırıcıyı ile kuracak my_malloc_init()
ve ile bellek ayıracaksınız my_malloc()
. my_free()
bağımlılığı tatmin etmek için var ama aslında hiçbir şey yapmayacak. Sonunda tabii ki alanınız bitecek.
Bunu yapmak için, kodunuzun en kötü durumda bellek gereksinimini ölçmeniz (mümkünse bunu bir PC'de yapın) ve HEAP_SIZE
buna göre ayarlayın . Kütüphanenizin dinamik bellek gerektiren kısmını girmeden önce arayınmy_malloc_init()
. Tekrar kullanmadan önce, hiçbir şeyin hala göstermediğinden emin olun 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
}
(not: gerçek dünyada işaretçi hizalamasını, yani heap_ptr
2 veya 4 bayt yuvarlamayı düşünmeniz gerekebilir )
Başka bir seçenek de, malloc()
genellikle bir FreeList gibi sağladığından daha basit bir ayırma yapısı kullanmaktır , ancak bu, değişken boyutlu blokları ayırmanıza izin vermeyebilir.