malloc()
nei microcontrollori è generalmente considerata una "cosa negativa". Ma, se ne hai assolutamente bisogno, ti consigliamo di trovare una versione di terze parti.
Se sei fortunato, il codice che stai trasferendo potrebbe non fare affidamento sul riutilizzo di blocchi di memoria. In questo caso, è possibile scrivere un semplice allocatore che restituisce un puntatore in un buffer RAM, quindi fa avanzare il puntatore in base alla dimensione del blocco richiesta.
Ho usato con successo questo approccio prima di eseguire il porting delle librerie PC su microcontrollori.
Di seguito, dovresti impostare l'allocatore con my_malloc_init()
e allocare memoria con my_malloc()
. my_free()
è lì per soddisfare la dipendenza ma in realtà non farà nulla. Alla fine rimarrai senza spazio, ovviamente.
Per far funzionare tutto ciò, dovrai misurare il requisito di memoria peggiore del tuo codice (fallo su un PC se possibile), quindi imposta di HEAP_SIZE
conseguenza. Prima di accedere alla parte della libreria che richiede memoria dinamica, chiamare my_malloc_init()
. Prima di riutilizzarlo, assicurarsi che nulla punti ancora 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
}
(nota: nel mondo reale, potrebbe essere necessario considerare l'allineamento del puntatore, ovvero arrotondare per eccesso heap_ptr
di 2 o 4 byte)
Un'altra opzione è quella di utilizzare una struttura di allocazione più semplice di quella malloc()
normalmente fornita, come una FreeList , sebbene ciò non consenta di allocare blocchi di dimensioni variabili.