estoy un poco tarde a la fiesta, pero sólo quiero compartir asignador de memoria muy eficiente para sistemas embebidos recientemente he encontrado y probado: https://github.com/dimonomid/umm_malloc
Esta es una biblioteca de gestión de memoria diseñada específicamente para trabajar con el ARM7, personalmente lo uso en un dispositivo PIC32, pero debería funcionar en cualquier dispositivo de 16 y 8 bits (tengo planes para probar el PIC24 de 16 bits, pero aún no lo he probado)
La fragmentación con el asignador predeterminado me golpeó seriamente: mi proyecto a menudo asigna bloques de varios tamaños, desde varios bytes hasta varios cientos de bytes, y algunas veces tuve que enfrentar el error de "falta de memoria". Mi dispositivo PIC32 tiene un total de 32K de RAM y 8192 bytes para el montón. En el momento particular, hay más de 5K de memoria libre, pero el asignador predeterminado tiene un bloque de memoria no fragmentado máximo de apenas 700 bytes, debido a la fragmentación. Esto es muy malo, así que decidí buscar una solución más eficiente.
Ya conocía algunas asignaciones, pero todas tienen algunas limitaciones (como el tamaño de bloque debería ser una potencia o 2, y comenzando no desde 2 sino desde, digamos, 128 bytes), o simplemente tenía errores. Cada vez antes, tuve que volver al asignador predeterminado.
Pero esta vez, tengo suerte: he encontrado este uno: Bloque http://hempeldesigngroup.com/embedded/stories/memorymanager/
Cuando probé este asignador de memoria, exactamente en la misma situación con 5K de memoria libre, que tiene más de 3800 bytes ! Fue tan increíble para mí (comparando con 700 bytes), y realicé una prueba dura: el dispositivo funcionó mucho más de 30 horas. No hay pérdidas de memoria, todo funciona como debería funcionar. También encontré este asignador en el repositorio FreeRTOS: http://svnmios.midibox.org/listing.php?repname=svn.mios32&path=%2Ftrunk%2FFreeRTOS%2FSource%2Fportable%2FMemMang%2F&rev=1041&peg=1041#, y este hecho es una evidencia adicional de la estabilidad de umm_malloc. Así que cambié completamente a umm_malloc, y estoy bastante contento con él.
Solo tuve que cambiarlo un poco: la configuración estaba un poco falsa cuando la macro UMM_TEST_MAIN no está definida, así que creé el repositorio github (el enlace está en la parte superior de esta publicación). Ahora, la configuración dependiente del usuario se almacena en un archivo separado umm_malloc_cfg.h
Todavía no he profundizado en los algoritmos aplicados en este asignador, pero tiene una explicación muy detallada de los algoritmos, por lo que cualquier persona que esté interesada puede ver la parte superior del archivo umm_malloc.c. Al menos, el enfoque "binning" debería dar un gran beneficio en menos fragmentación: http://g.oswego.edu/dl/html/malloc.html
Creo que cualquiera que necesite un asignador eficiente de memoria para microcontroladores, al menos debería intentarlo.
Usó Loki para este propósito, todo funcionó muy bien, y tomó muy poco tiempo –
Chris, ¿estaría dispuesto a compartir el código de la versión modificada de glibc malloc con los grupos de memoria? –