¿Existen diferentes espacios de direcciones para RAM y ROM en un microcontrolador típico? [cerrado]

Si un microcontrolador tiene un espacio de direcciones de 16 bits de 0000H a FFFFH, ¿compartirán la RAM, los registros de E/S, la E/S mapeada en memoria y la ROM (Flash/EEPROM) el mismo espacio de direcciones linealmente, o habrá un espacio de direcciones separado para ROM solo (como otro 0000H a 1FFFH), o depende del fabricante?

Supongo que leí muchos documentos y me confundí con esto. Por favor ayuda.

Es mejor si selecciona un dispositivo específico, luego lee la hoja de datos y luego pregunta aquí si no está claro.
Por lo general, habrá diferentes espacios no contiguos debido a las limitaciones de descodificación de direcciones y las discrepancias en el tamaño del dispositivo.
Esto depende completamente del dispositivo. Para PIC, sí; BRAZO, No. Etcétera.
Cuestionaría la existencia de un microcontrolador típico
@ pjc50 no puede mapear tres dispositivos de diferente tamaño continuamente incluso si tiene un ARM. Tal vez la aplicación verá direcciones continuas debido a la MMU, pero las direcciones HW no pueden ser continuas para diff. tamaños
@ClaudioAviChami Si el decodificador de direcciones realiza una resta completa en lugar de solo verificar los bits de orden superior de la dirección, puede hacerlo. Pero incluso sin esto, puede, por ejemplo: 128kByte a 0x00000, 64k a 0x20000, 16k a 0x30000.
@ClaudioAviChami: tener un espacio de direcciones común no requiere tener uno contiguo. Esencialmente, lo que significa es que se pueden usar algunos de los mismos métodos de acceso a nivel de software (como mínimo, una lectura).
Sus primeras 12 palabras definen una situación en la que todo debe asignarse a la memoria en el mismo espacio de direcciones de 16 bits. Cuán finamente se divide, es simplemente una cuestión de cuánta lógica quieres poner. El Apple II dividió su espacio bastante bien, a pesar de su famosa baja cantidad de chips, por lo que pudo obtener 48K de RAM (incluida la pantalla de 1-9K búfer), E/S de 2K, memoria de tarjeta financiable de 2K y ROM de 12K.

Respuestas (2)

De hecho, esa es la diferencia clave entre las arquitecturas "von Neumann" y "Harvard". El primero usa un solo espacio de direcciones para todo, mientras que el segundo tiene espacios de direcciones separados para instrucciones (generalmente ROM) y datos (generalmente RAM).

Puede obtener microcontroladores con cualquier arquitectura. Algunos implementan un híbrido de los dos.

¡Ese fue un punto llamativo! Pero, ¿cómo sería exactamente un híbrido de los dos? Un poco más de información por favor..?
Algunas arquitecturas (sobre todo 8080 y sus derivados) usan espacios de direcciones separados para E/S
Por ejemplo, la 8051 es una máquina de Harvard, pero tiene instrucciones que permiten mover datos desde el espacio de instrucciones. Además, si le conecta una memoria externa, es fácil "doblar" los espacios de direcciones uno encima del otro, ya sea parcial o totalmente.
Las partes de ARM Cortex-M tienen un solo espacio de direcciones, pero como una optimización de la velocidad, existen distintos mecanismos de implementación y rutas de datos internas para los diferentes tipos de almacenamiento. Se podría argumentar que lo mismo es cierto para cualquier sistema grande moderno con instrucciones distintas y cachés de datos.
Un ejemplo de una arquitectura Harvard 'híbrida' es PIC24. Tiene una función "PSV" (Visibilidad del espacio del programa) que permite que la memoria del programa se asigne parcialmente a la región superior de 32K de SRAM. A continuación, se puede utilizar como una ROM. Sin embargo, el bus SRAM solo tiene 16 bits de ancho, pero dado el tamaño típico de RAM de estos dispositivos, eso no representa un problema.
Creo que la forma más sencilla de describir una arquitectura híbrida sería decir que existe un área de memoria de código con un bus rápido que lo conecta a la lógica de procesamiento de instrucciones, y otra área de memoria de datos con un bus rápido que lo conecta a los datos. lógica de procesamiento, pero hay otras rutas de comunicación, posiblemente más lentas, que permiten que los datos viajen de otras maneras (por lo general, entre la memoria de código y la unidad de procesamiento de datos o, en algunos escenarios de almacenamiento en caché, desde la memoria de datos a un código). Memoria caché).

Dave ya ha mencionado las diferencias entre las arquitecturas Harvard y von Neumann .

Un ejemplo de una arquitectura de von Neumann, donde solo hay un espacio de direcciones para RAM, Flash, E/S y EEPROM, es la familia HCS08 de Freescale. Aquí está el mapa de memoria de uno de sus microcontroladores que tiene 128K de Flash y 4K de RAM:

ingrese la descripción de la imagen aquí

Tenga en cuenta que en esta figura, la dirección de memoria 0 está en la parte superior. Tampoco está a escala; la dirección 0x8000 (límite de 32K) debe estar exactamente en el medio.

Este microcontrolador tiene una página directa (a veces llamada página 0), es decir, 256 direcciones a las que se puede acceder con solo una dirección de 8 bits (lo que reduce el tamaño de la instrucción en un byte). Las primeras 128 ubicaciones, 0x0000 a 0x007F, se utilizan para asignar registros de E/S. A esto le siguen los 5K de RAM, desde la dirección 0x0080 hasta la 0x17FF. Al hacer esto, los primeros 128 bytes de RAM también se ubican en la página 0. A esto le siguen 256 direcciones adicionales reservadas para registros de E/S adicionales en 0x1800 a 0x18FF, luego más RAM, luego el primer segmento de Flash, luego 2K de EEPROM .

Luego páginas adicionales de Flash. Tenga en cuenta que también tienen números de página (PÁGINA). ¿Recuerdas que dije que este microcontrolador tiene 128K de Flash? ¿Cómo encajas eso en 64K de espacio de direcciones? Mediante el direccionamiento paginado. Hay una "ventana de paginación" de 0x8000 a 0xBFFF (16K) donde se puede asignar una de las ocho páginas de 16K de Flash (128K en total). Cuál está controlado por un registro de paginación. Cuando el compilador genera saltos o llamadas a subrutinas, sabe actualizar el registro de paginación según sea necesario.

Algunas de las páginas también se pueden direccionar directamente (PÁGINAS 0, 1 y 3) sin usar el registro de paginación. Esto es necesario para cosas como controladores de interrupciones, que pueden ocurrir en cualquier momento. Las subrutinas comunes, como la biblioteca C, también son buenas candidatas para estas páginas.

No se muestran los vectores de reinicio e interrupción, que comienzan y la parte superior de la memoria (0xFFFF) y descienden.

Las máquinas con arquitectura Harvard pura tienen esquemas mucho más simples, hay un espacio de direcciones para Flash que comienza en 0x0000, otro para RAM que también comienza en 0x0000 y otro para puertos de E/S que comienzan en 0x0000 (a veces, RAM y E/S se juntan en el mismo espacio, conocido como E/S mapeada en memoria). Si se utilizan puertos de E/S, se accede a ellos a través de instrucciones especiales como IN y OUT.

Debido a que son espacios separados, pueden tener diferentes anchos. El microcontrolador PIC16 de Microchip, por ejemplo, tiene un ancho de instrucción de 14 bits y buses de E/S y RAM de 8 bits.

¿Cuál es la ventaja de cada uno? Bueno, con una arquitectura Harvard, puede tener 64 K de espacio de programa, 64 K de espacio de RAM y 64 K de espacio de E/S, todo usando direcciones de 16 bits. Así que es bueno para microcontroladores de 8 y 16 bits. Debido a que el programa está en Flash, no se puede modificar.

Con las arquitecturas de von Neumann, puede ejecutar programas desde Flash (o ROM) y RAM. Así es como funcionan las PC: cuando se inician por primera vez, se inician utilizando una ROM BIOS (Sistema básico de entrada/salida), que lee el sistema operativo de un disco duro y lo carga en la RAM. A partir de ese momento, los programas se ejecutan fuera de la memoria RAM.

También existen procesadores de " arquitectura Harvard modificada ", que permiten visualizar parte del espacio de instrucciones como si fuera RAM de "solo lectura". Esto generalmente se hace usando una ventana de paginación similar a la del diagrama HCS08 anterior. En el PIC24, esta función se denomina Visibilidad del espacio del programa (PSV).

Aunque siento que es un poco difícil entender el espaciado de direcciones descrito en la primera parte, respondió a la mayoría de mis dudas sobre este tema.