malloc()
w mikrokontrolerach jest ogólnie uważany za „złą rzecz”. Ale jeśli jest to absolutnie potrzebne, będziesz chciał znaleźć wersję innej firmy.
Jeśli masz szczęście, przenoszony kod może nie polegać na ponownym wykorzystaniu bloków pamięci. W takim przypadku możesz napisać prosty alokator, który zwraca wskaźnik do bufora pamięci RAM, a następnie przesuwa wskaźnik o żądany rozmiar bloku.
Z powodzeniem stosowałem to podejście już wcześniej przy przenoszeniu bibliotek PC na mikrokontrolery.
Poniżej skonfigurujesz alokator za pomocą my_malloc_init()
i przydzielisz pamięć za pomocą my_malloc()
. my_free()
ma na celu zaspokojenie zależności, ale tak naprawdę nic nie zrobi. Ostatecznie oczywiście zabraknie Ci miejsca.
Aby to zadziałało, musisz zmierzyć najgorsze wymagania dotyczące pamięci w kodzie (zrób to na komputerze, jeśli to możliwe), a następnie odpowiednio skonfiguruj HEAP_SIZE
. Przed wejściem do części biblioteki wymagającej pamięci dynamicznej zadzwoń my_malloc_init()
. Przed ponownym użyciem upewnij się, że nic nie wskazuje 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
}
(uwaga: w prawdziwym świecie może być konieczne rozważenie wyrównania wskaźnika, tj. zaokrąglenia w górę heap_ptr
o 2 lub 4 bajty)
Inną opcją jest użycie prostszej struktury alokacji, niż malloc()
zwykle, na przykład FreeList , chociaż może to nie pozwolić na alokację bloków o zmiennej wielkości.