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í:
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.