malloc()
dans les microcontrôleurs est généralement considéré comme une "mauvaise chose". Mais, si vous en avez absolument besoin, vous voudrez trouver une version tierce.
Si vous avez de la chance, le code que vous portez peut ne pas dépendre de la réutilisation de blocs de mémoire. Si tel est le cas, vous pouvez écrire un allocateur simple qui renvoie un pointeur dans un tampon RAM, puis avance le pointeur de la taille de bloc demandée.
J'ai déjà utilisé cette approche avec succès dans le portage de bibliothèques PC vers des microcontrôleurs.
Ci-dessous, vous devez configurer l'allocateur avec my_malloc_init()
et allouer de la mémoire avec my_malloc()
. my_free()
est là pour satisfaire la dépendance mais ne fait rien. Finalement, vous manquerez d'espace, bien sûr.
Pour que cela fonctionne, vous devrez mesurer la mémoire la plus défavorable de votre code (faites-le sur un PC si possible), puis configurez-la en HEAP_SIZE
conséquence. Avant d'entrer dans la partie de votre bibliothèque nécessitant une mémoire dynamique, appelez my_malloc_init()
. Avant de réutiliser, assurez-vous que rien ne pointe toujours 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
}
(Remarque: dans le monde réel, vous devrez peut-être envisager l'alignement du pointeur, c'est-à-dire arrondir à heap_ptr
2 ou 4 octets)
Une autre option consiste à utiliser une structure d'allocation plus simple que celle malloc()
fournie habituellement, comme une FreeList , bien que cela ne vous permette pas d'allouer des blocs de taille variable.