Aumentar la memoria de un ATmega32

1

Compré un ATmega32 IC recientemente, pero ahora descubrí que el programa que escribí en Atmel Studio informa de un error debido a un exceso de memoria. Es el 134.1% sobre la memoria recomendada de este chip. ¿Existen alternativas que existen?

No quiero ir a comprar otro chip porque son bastante caros.

    
pregunta Joey

3 respuestas

3

Atmega32 es como un Atmega644x o Atmega1284P reducido. Cambie el chip para obtener mucha más memoria, más SRAM (hasta 16K bytes) y puertos serie de hardware duales.

    
respondido por el CrossRoads
9

Variables / tipos globales

  • Cambiar el tipo de variables globales (por ejemplo, usar uint8_t o un byte similar en lugar de largo), o usar bits para almacenar matrices booleanas.
  • Elimine las variables estáticas y reemplácelas por variables dinámicas (locales) si es posible. Pasarlos como argumentos podrían usarse para mantener el alcance por más tiempo.

Datos / tablas precalculadas

  • En caso de que ahora mantenga estructuras de datos (fijas) en su código (por ejemplo, para tablas precalculadas), colóquelas en Flash externo. El código ejecutable es difícil de colocar en Flash externo, pero las tablas / datos no lo son. Por supuesto, esto viene con una pérdida de rendimiento. Otra forma es calcularlo sobre la marcha (no se necesita ninguna tabla calculada).
  • En lugar de utilizar tablas de datos precalculados, calcúlelos; esto podría causar una pérdida de rendimiento.
  • En caso de que esté utilizando una gran cantidad de textos o datos almacenados, 'comprímalos' si es posible. El código de descompresión costará algo de Flash, pero si tiene mucho texto, podría valer la pena.

Código ejecutable

  • Usar para bucles en lugar de llamar a las funciones una por una.
  • Compruebe si hay códigos repetidos y cree funciones de ellos; use los parámetros para diferir entre pequeños cambios; Esto causará una (pequeña) pérdida de rendimiento.
  • Evita 'inline' o largas #define sentencias / código, estas son sustituidas (copiado) siempre que se utilice.

Logging/tracing

las cadenas de registro pueden consumir muchos bytes (por ejemplo, para una cadena de registro como: "La temperatura actual es:" cuesta 29 bytes). Tener muchas cadenas de registro puede sumar mucho. Para evitar esto puedes:

  • Use cadenas más cortas ("CurTemp:" solo tiene 9 bytes).
  • Imprima un entero (cuesta 1 o 2 bytes, dependiendo del tamaño int).
  • Envíe este número entero a otro microcontrolador que lo convierte en texto legible. Costó un poco de sobrecarga / sobrecarga periférica.
  • Al realizar la depuración, ponga todo el inicio de sesión en #ifdefs y guarde Flash al reducir la funcionalidad que no necesita para realizar pruebas. Cuando no se realiza la depuración, todas las declaraciones de registro no costarán ningún byte.

Libraries

  • Buscar bibliotecas alternativas que se implementan de manera diferente pero con la funcionalidad que necesita.

Opciones del compilador

  • Verifique las opciones del compilador para ver si el código se puede compilar de una manera diferente; En su mayoría, será una compensación contra el rendimiento.

Lo que NO debes hacer

  • Haga su código un poco más pequeño usando una implementación de código oscuro. Esto te morderá más adelante cuando mantengas tu aplicación.
  • La eliminación de funciones no utilizadas no ayuda (el compilador es lo suficientemente inteligente para hacer esto por usted).
respondido por el Michel Keijzers
5

Desafortunadamente, agregar este tipo de chip no suele ser posible agregar una memoria de programa externa. Posiblemente podría leer y ejecutar código desde una memoria flash externa, pero es probable que sea lento e inestable.

Es posible que pueda reducir el tamaño del código compilado, eliminando las variables estáticas y eliminando las bibliotecas no utilizadas.

Si no puede encontrar una manera de reducir el tamaño del código, puede consultar las MCU de la misma arquitectura aquí: enlace

    
respondido por el Tim Vrakas

Lea otras preguntas en las etiquetas