Una confusión en el mapa de memoria flash de un microcontrolador AVR

1

Estoy intentando averiguar el mapa de memoria flash de ATmega328P :

A continuación se encuentra en la hoja de datos:

El mapa de memoria del programa para ATmega328P se proporciona como 32KB: 32Kbytes = 32K * bytes

0x0000 significa 16 bits de ancho (para cada línea de memoria hay 2 bytes)

que es 16K * 16bit

Lo que entiendo de esto, la memoria flash se compone de 16K líneas de registros de 16 bits de ancho. Por lo tanto, para una instrucción en la memoria flash, el número máximo de dirección es 16K.

¿Es este 16K 2 ^ 16 o 16000?

Los últimos tres registros X X de propósito general que se utilizan para mantener las direcciones (punteros) son de 16 bits que pueden almacenar hasta 2 ^ 16 = 65536 direcciones. Así que supongo que 16K significa 65536 aquí?

Pero si es así, en la figura anterior se muestra la última línea de memoria como 0x3FFF que corresponde a 16383.

¿Qué estoy sabiendo mal aquí?

    
pregunta user16307

2 respuestas

1

Lo que sabes mal es un par de cosas.

No todos los dispositivos AVR tienen la misma cantidad de memoria de programa en chip disponible real. Algunos pueden tener 8K bytes, 16K bytes, 32K bytes o incluso 64K bytes. Sucede que el suyo tiene los 32K bytes anunciados.

Los registros X, Y y Z tienen un ancho de 16 bits. Estos están diseñados genéricamente para admitir un mapa de memoria de datos de hasta 64K bytes. Una vez más, el tamaño de la memoria de datos disponible puede variar de un dispositivo a otro, por lo que la capacidad de direccionamiento de 64 K bytes no se puede usar en todos los dispositivos.

Los registros X, Y y Z están indicados genéricamente en la descripción de la hoja de datos que se utilizará para acceder a la memoria de datos. La memoria de datos no debe confundirse con la memoria del programa. El registro Z se puede usar, junto con ciertos códigos de operación específicos, para acceder a las tablas en la memoria del programa (la Z aún tiene 16 bits para admitir hasta 64K bytes genéricos, aunque la memoria del programa disponible puede ser menor).

    
respondido por el Michael Karas
1
  

¿Es este 16K 2 ^ 16 o 16000?

... Ninguno.

Es 16 * 1024 = 16384.

    
respondido por el Ignacio Vazquez-Abrams

Lea otras preguntas en las etiquetas