Una visión alternativa: los microcontroladores no se quedan sin memoria.
Al menos, no cuando está bien programado. Programar un microcontrolador no es exactamente como la programación de propósito general, para hacerlo correctamente hay que ser consciente de sus limitaciones y programar en consecuencia. Hay herramientas que ayudan a conseguirlo. Búscalas y apréndelas - al menos cómo leer los scripts del enlazador y las advertencias.
Sin embargo, como dicen Majenko y otros, un microcontrolador mal programado puede quedarse sin memoria y hacer cualquier cosa, incluso un bucle infinito (lo que al menos da al temporizador de vigilancia la oportunidad de reiniciarlo). Has habilitado el watchdog timer, ¿no?)
Las reglas de programación comunes para los microcontroladores evitan esto: por ejemplo, toda la memoria se asigna en la pila o se asigna estáticamente (globalmente); "new" o "malloc" están prohibidos. Lo mismo ocurre con la recursividad, para poder analizar la profundidad máxima del anidamiento de subrutinas y demostrar que cabe en la pila disponible.
Por lo tanto, el almacenamiento máximo requerido puede ser calculado cuando el programa es compilado o enlazado, y comparado con el tamaño de la memoria (a menudo codificado en el linker script) para el procesador específico al que se dirige.
Entonces el microcontrolador puede no quedarse sin memoria, pero su programa sí. Y en ese caso, se llega a
- reescribirlo, más pequeño, o
- elige un procesador más grande (suelen estar disponibles con diferentes tamaños de memoria).
Un conjunto de reglas comunes para la programación de microcontroladores es MISRA-C adoptada por la industria del motor.
En mi opinión, la mejor práctica es utilizar el SPARK-2014 subconjunto de Ada. En realidad, Ada se dirige a pequeños controladores como AVR, MSP430 y ARM Cortex razonablemente bien, e intrínsecamente proporciona un mejor modelo para la programación de microcontroladores que C. Pero SPARK añade anotaciones al programa, en forma de comentarios, que describen lo que el programa está haciendo.
Ahora las herramientas de SPARK analizarán el programa, incluyendo esas anotaciones, y demostrarán propiedades sobre él (o informarán de posibles errores). No tienes que perder tiempo o espacio de código tratando con accesos erróneos a la memoria o desbordamientos de enteros porque se ha demostrado que nunca ocurren.
Aunque SPARK conlleva más trabajo inicial, la experiencia demuestra que puede conseguir un producto más rápido y más barato, ya que no se pierde tiempo persiguiendo reinicios misteriosos y otros comportamientos extraños.
Comparación de MISRA-C y SPARK
8 votos
Algunos micros se reinician si intentas acceder a direcciones no válidas. Es una característica valiosa implementada en el hardware. Otras veces puede terminar saltando a algún lugar arbitrario (digamos que has estropeado la dirección de retorno de un ISR), tal vez ejecutando datos en lugar de código si la arquitectura lo permite, y tal vez quedando atrapado en un bucle del que el perro guardián lo saca.
2 votos
Un procesador no puede quedarse sin RAM, no hay ninguna instrucción que haga que se quede sin RAM. Quedarse sin RAM es un concepto totalmente de software.