Uso de memoria de datos informado por AtmelStudio para ATtiny85

2

Estoy usando AtmelStudio para programar un ATtiny85 , que tiene 512 bytes de memoria de datos SRAM.

Mi código incluye una gran tabla de búsqueda (matriz) que tiene 512 bytes:

const uint16_t lut[256] = { ... };

El proyecto no tiene otros datos globales o estáticos, así que cuando lo compilo, AtmelStudio informa:

"C:\Atmel\Studio.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-size.exe" "mcp4821_attiny85.elf"
           text    data     bss     dec     hex filename
            242     512       0     754     2f2 mcp4821_attiny85.elf
    Done executing task "RunCompilerTask".
    Using "RunOutputFileVerifyTask" task from assembly "C:\Atmel\Studio.0\Extensions\Application\AvrGCC.dll".
    Task "RunOutputFileVerifyTask"
                Program Memory Usage    :   754 bytes   9.2 % Full
                Data Memory Usage       :   512 bytes   100.0 % Full
    Done executing task "RunOutputFileVerifyTask".

Como se muestra, AtmelStudio informa que he llenado exactamente el espacio disponible en mi memoria de datos. Si hago que la matriz lut sea un elemento más grande, el compilador me alerta del desbordamiento de memoria. A la inversa, si hago que la matriz sea más pequeña, el compilador informa que tengo espacio para respirar (de dos bytes).

Sin embargo , cuando utilicé el código para programar el chip, descubrí que efectivamente había un daño en la memoria y recibí datos erróneos al leer los últimos 16 bytes de la matriz.

Para las pruebas, la LUT es solo una onda sinusoidal, y el microcontrolador está escribiendo la LUT en un DAC. Las fallas en la imagen de abajo revelan los datos erróneos de los accesos de mala memoria (perdón por la mala calidad de la imagen):

Resolvíesteproblemasiguiendolosexcelentesconsejosqueseencuentranaquí: Problemas de administración de memoria con ATTiny85

Cambiando

const uint16_t lut[256] = { ... };

a

#include <avr/pgmspace.h>
const PROGMEM uint16_t lut[256] = { ... };

y usando

pgm_read_word()

para acceder a los elementos de la matriz. Pero no estoy seguro de por qué esto es necesario.

Mis preguntas son:

  • ¿por qué la matriz no encaja en la memoria de datos, aunque AtmelStudio no informa de ningún error?
  • y lo más importante, ¿por qué AtmelStudio no informa de ningún error?

Sospecho que la respuesta a ambos está relacionada con el espacio de pila, pero no estoy seguro. Gracias.

    
pregunta Blair Fonville

1 respuesta

2

Incluso si define sus variables como const, el compilador las pondrá en la memoria RAM del AVR. Solo si define sus variables con el atributo PROGMEM mantendrá las variables solo en flash y las leerá desde allí.

Su matriz encaja perfectamente en la RAM, llenándola completamente. Pero como ya sospechó, ejecutar su función principal u otras funciones utilizará parte de la RAM para la pila, probablemente sobrescribiendo su LUT. Esto se denomina colisión de pila y no puede ser predicho por AtmelStudio, ya que no tiene forma de saber a qué funciones llamará y con qué frecuencia.

Si realmente necesita todos los 512 bytes de RAM y no desea cargar desde flash, puede escribir el código para conducir el DAC desde la LUT en el código del ensamblador sin usar una pila.

Para ilustración

gráfico tomado de aquí

    
respondido por el Marco Zollinger

Lea otras preguntas en las etiquetas