malloc()
en microcontroladores generalmente se considera una "cosa mala". Pero, si es absolutamente necesario, querrá encontrar una versión de terceros.
Si tiene suerte, el código que está transfiriendo puede no depender de la reutilización de bloques de memoria. Si este es el caso, puede escribir un asignador simple que devuelva un puntero a un búfer de RAM, luego avanza el puntero en el tamaño de bloque solicitado.
He utilizado con éxito este enfoque antes de trasladar bibliotecas de PC a microcontroladores.
A continuación, configuraría el asignador con my_malloc_init()
y asignaría la memoria con my_malloc()
. my_free()
está ahí para satisfacer la dependencia, pero en realidad no hará nada. Eventualmente, te quedarás sin espacio, por supuesto.
Para hacer que esto funcione, deberá medir el requisito de memoria del caso más desfavorable de su código (haga esto en una PC si es posible) y luego configure HEAP_SIZE
en consecuencia. Antes de ingresar a la parte de su biblioteca que requiere memoria dinámica, llame a my_malloc_init()
. Antes de volver a usar, asegúrese de que nada siga apuntando a 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: en el mundo real, es posible que deba considerar la alineación del puntero, es decir, redondear heap_ptr
por 2 o 4 bytes)
Otra opción es usar una estructura de asignación más simple que la que malloc()
generalmente proporciona, como una FreeList , aunque esto puede no le permite asignar bloques de tamaño variable.