malloc()
en microcontroladores generalmente se considera una "cosa mala". Pero, si lo necesita absolutamente, entonces 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 avance el puntero por el tamaño de bloque solicitado.
He utilizado con éxito este enfoque antes de portar bibliotecas de PC a microcontroladores.
A continuación, configuraría el asignador con my_malloc_init()
y asignaría 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 que esto funcione, necesitará medir el requisito de memoria del peor de los casos de su código (haga esto en una PC si es posible) y luego configúrelo en HEAP_SIZE
consecuencia. Antes de ingresar a la parte de su biblioteca que requiere memoria dinámica, llame my_malloc_init()
. Antes de volver a usar, asegúrese de que nada apunte todaví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
en 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 Lista Libre , aunque esto puede no permitirle asignar bloques de tamaño variable.