¿Por qué vemos un espacio de direcciones de memoria unificado en los MCU basados ​​en el núcleo ARM Cortex-M a pesar de que tienen arquitectura Harvard?

La mayoría de los MCU basados ​​en el núcleo ARM Cortex-M tienen arquitectura Harvard (excepto Cortex-M0 y M0+).

Lo que no entiendo es por qué vemos solo un espacio de direcciones de memoria. Por ejemplo, en tge STM32F4 vemos solo un espacio de direcciones de memoria unificado:

ingrese la descripción de la imagen aquí

Si los MCU basados ​​en ARM Cortex-M tienen arquitectura Harvard (en la mayoría de los casos), ¿por qué no vemos dos espacios de direcciones de memoria separados, uno para datos y otro para instrucciones de código, en lugar de uno?

¿estás seguro de que es Harvard real y no Harvard modificado?
parece un Harvard modificado; lo llaman "autobús de Harvard": community.arm.com/support-forums/f/…
si, gracias por la aclaración, no fui lo suficientemente preciso, es Harvard modificado
Ahí tienes, entonces. "Harvard modificado" generalmente solo significa una optimización del rendimiento en un espacio de direcciones unificado, por ejemplo, caché L1d/i dividido y/o buses divididos para RAM y Flash. (Como señala en.wikipedia.org/wiki/…, tener espacios de direcciones divididos significaría que necesitaría una instrucción de memoria de programa de carga si desea acceder a ella como datos y, por lo tanto, seguir siendo "harvard modificado", que ARM no tiene, pero AVR sí. Sin eso, con espacios de direcciones divididos sería verdadero Harvard).
Creo que el término "arquitectura de Harvard" está un poco obsoleto en esta década, ya que casi ninguna arquitectura es tan simple.

Respuestas (3)

Cuando elige un chip STM32F4 al azar y mira la hoja de datos , en la sección 2.2 vemos un diagrama de bloques del chip.

Vemos que la CPU tiene tres (!) buses, etiquetados como I-BUS, D-BUS y S-BUS. Todos van a la "matriz de bus AHB" y el D-BUS también va a alguna "RAM de datos CCM".

Busqué "Cortex-M4 S-bus" y encontré esta página de ARM que describe los buses que describen la diferencia entre los buses: para direcciones inferiores a 0x20000000, el D-Bus se usa para el acceso a datos y el I-Bus se usa para accesos de instrucción. Para las direcciones 0x20000000 o superiores, el S-Bus se utiliza tanto para acceso a instrucciones como a datos.

Entonces, el procesador actúa como una arquitectura de Harvard por debajo de 0x20000000 y von Neumann por encima de eso.

Sin embargo, si volvemos a la hoja de datos del chip, en la sección 2.2.7 (después del salto de página) vemos un diagrama de la matriz de bus AHB que interconecta los diferentes buses a diferentes componentes de memoria en el chip. Vemos que I-Bus y D-Bus tienen acceso a los mismos componentes de memoria: memoria Flash (a través de ACCEL), SRAM1 y FSMC Static MemCtl. Entonces, al tomar una arquitectura de Harvard y luego conectar los buses I y D a la misma memoria, la convertimos en lo que bien podría llamarse una arquitectura de von Neumann. Podemos suponer que cada región de memoria tiene la misma dirección en todos los buses a los que se puede acceder, porque de lo contrario la hoja de datos diría lo contrario. Es conveniente que cada pieza de memoria solo tenga una dirección. Sería posible conectar el procesador para que la instrucción en 0x00000000 sea diferente de los datos en 0x00000000,pero los diseñadores del STM32F405xx no hicieron eso .

Hay una pequeña diferencia: la memoria de "datos CCM" no se puede usar para instrucciones, ya que solo está conectada al D-bus. Su mapa de memoria no muestra "CCM de datos" por debajo de 0x20000000, así que supongo que en su chip esta diferencia no existe. Sin embargo, puede haber otras diferencias entre el I-bus y el D-bus.

¡Gracias por tu respuesta detallada! Solo una cosa más: si la instrucción en 0x00000000 fuera diferente de los datos en 0x00000000, eso significaría que en el diseño de la memoria estaríamos viendo dos espacios de direcciones de memoria, ¿verdad?
@gvg sí, pero no creo que el chip esté haciendo eso. Tenga en cuenta que el espacio de direcciones sería el mismo en 0x20000000 y hacia arriba, porque usa el mismo bus.
sí, quise decir esta última pregunta en general, no en el caso específico que describiste anteriormente. Muchas gracias por su ayuda y respuestas de nuevo!
Algunos modelos STM32 tienen instrucción CCM, que también tiene restricciones de acceso. Pero incluso entonces, las direcciones no se utilizan para otros fines en el bus principal. Con 4 GB de espacio de direcciones para un chip con menos de 1 MB de memoria, no hay necesidad de doble uso.
Sí, incluso si los buses estuvieran conectados a secciones de memoria completamente separadas, sería una buena idea que el diseñador del chip les diera direcciones diferentes para ayudar a detectar errores de programación.

Las partes de ARM Cortex se anuncian como "Arquitectura de Harvard", pero en realidad son arquitectura de Harvard modificada .

Específicamente, usan cachés de datos e instrucciones separados y (si no recuerdo mal) algunas áreas de memoria no pueden usarse como memoria de instrucciones. Pero todo el espacio de la memoria está disponible como datos, aunque al menos una parte está disponible como instrucciones.

La mayoría de las máquinas actuales que se llaman a sí mismas "Arquitectura de Harvard" no tienen espacios de memoria completamente separados y, por lo tanto, son una forma de Harvard modificada.

¿Y cómo debo imaginar esto? Quiero decir, hay 1 memoria, adjunta a los buses D e I separados (es por eso que Harvard, o más precisamente Harvard modificado en nuestro caso, como explicaste antes) y la memoria puede resolver que nos puede dar datos e instrucciones en ¿al mismo tiempo? Quiero decir, por alguna razón, me parece extraño que sea solo una memoria / espacio de memoria, pero aún así puede proporcionar datos e instrucciones a la vez.
@gvg Dos posibilidades: o hay una memoria de instrucciones y una memoria de datos separadas, pero puede acceder a la incorrecta con una penalización de velocidad (ya que hay algún tipo de bus cruzado), o solo hay un conjunto de memoria pero dos cachés separados. En realidad, dado que es un sistema integrado, el primero no es improbable.
@ user253751 ok, y luego volvemos al comienzo de mi problema nuevamente ... así que supongamos la primera posibilidad que mencionó para que haya instrucciones separadas y memoria de datos. Pero en este caso, ¿no deberíamos ver también dos espacios de memoria separados en el diseño de la memoria?
@gvg no, el chip lograría enrutar la solicitud a la unidad de memoria correcta dependiendo de la dirección, pero habría una penalización de velocidad si el chip tuviera que obtener instrucciones y datos de la misma unidad de memoria porque no podía hacer ambos en el mismo ciclo de reloj. Si el chip funcionara de esta manera. No sé si funciona de esta manera.
@gvg La memoria de su PC se compone de al menos 16 y, a veces, más de 128 DRAM individuales. El controlador de memoria maneja la combinación de estos en un espacio de memoria unificado porque tener una memoria no unificada es molesto desde la perspectiva del software. Las MCU suelen funcionar de la misma manera, con toneladas de memoria de cosas diferentes asignadas en un solo espacio de direcciones.
@ user253751 ok, en el fondo hay / podría haber más unidades de memoria, pero están ocultas para nosotros, y se resuelve que aparecen como un único espacio de direcciones de memoria unificado. ¿Lo entiendo correctamente?
@gvg Harvard no solo tiene una memoria de instrucciones y una memoria de datos separadas. Esa es una buena simplificación. Pero no transmite con precisión los detalles específicos de la delineación, que es la arquitectura interna de la CPU en sí. ... Lo que sucede afuera es entonces una cuestión de equilibrar una amplia variedad de preocupaciones de ingeniería . Y es aquí donde encontrará variaciones sobre los temas. Si TIm no amplía su respuesta, y si encuentro tiempo para escribir algo, puedo agregar algo para ayudar a aclarar. Pero tenga en cuenta que este es un diseño de CPU de béisbol interno, que define solo algunos detalles necesarios. +1 en tu Q.
@user253751: Esta pregunta es sobre los microcontroladores Cortex-M; la mayoría de ellos no tienen caché y generalmente se usan con instrucciones (y datos constantes) provenientes de Flash. Entonces, supongo que el bus dividido es normalmente RAM vs. Flash, no dos rutas a la misma RAM.
@PeterCordes según mi investigación (ver mi respuesta) en el chip que miré, había dos rutas separadas a la misma RAM. También había una unidad de caché ("acelerador de memoria adaptable en tiempo real") que podía servir a ambos buses simultáneamente.
@user253751: Ah, ya veo, un punto interesante sobre una MCU potencialmente de Harvard conectada en una configuración de Von Neumann por el proveedor de la placa. Gracias.
@jonk, tal como lo veo, "von Neumann" significa un autobús, "Harvard" significa dos autobuses completamente separados, y todo lo que hay en el medio es "Harvard modificado" (por alguna razón, nunca "modificado von Neumann")
@ user253751 ¡Resumió con precisión las diferentes arquitecturas de bus! Por favor, no me olviden dentro de 10 años, cuando ganen sus miles de millones con el concepto de "arquitectura von Neumann modificada" ;-)
@gvg es lo mismo que Harvard modificado pero con un nombre diferente en la caja
@ user253751 El término ha sufrido muchos cambios a lo largo de mi vida, desde una definición temprana que ya no se usa mucho hasta otras más nuevas en las que es simplemente una cuestión de almacenamiento en caché entre I y D. Para mí, altera la forma en que enfoco el diseño de la CPU. (Hace tres décadas, aprendí estos términos directamente de Patterson, y durante unos días de tiempo personal 1: 1 con el Dr. Hennessey cuando visité MIPS en varias ocasiones 1985/1986). Si me molesto en escribir algún tipo de respuesta, escribiré más De lo contrario, simplemente lo dejo que tengo una perspectiva personal y lo dejo allí.

Muchos programas necesitan la capacidad de usar constantes codificadas dentro de ellos. Por ejemplo, para realizar una operación como "x=12345" (en casi cualquier idioma común), se necesita un medio para introducir el número 12345 en un registro. Hay al menos cuatro enfoques mediante los cuales esto se puede lograr:

  1. Algunas arquitecturas, como las versiones anteriores del PIC, tienen instrucciones que son más grandes que el valor inmediato más grande que uno podría querer cargar y, por lo tanto, permiten que se incluyan los valores deseados como parte de la instrucción sin necesidad de ningún medio para tratar el espacio de código como datos.

  2. Algunas arquitecturas como MIPS y algunas variantes ARM más nuevas tienen instrucciones que pueden cargar la mitad de un registro, y que se pueden usar junto con un "O inmediato" siguiente para cargar la otra mitad, nuevamente sin necesidad de ningún medio para tratar el espacio del código como datos. .

  3. Algunas arquitecturas, como las versiones anteriores de ARM, incluyen una instrucción para obtener un valor arbitrario de una dirección que está cerca del código que se está ejecutando actualmente. Si bien el ARM tiene funciones para expresar algunos números como constantes inmediatas, se espera que el código que necesita usar valores más grandes tenga los números requeridos colocados en el espacio de código cerca del código que los necesita, para que puedan obtenerse con la función "cargar valor cercano". " instrucción. Este enfoque requiere la capacidad de tratar el código y el espacio de datos de manera intercambiable.

  4. Sería posible que una arquitectura use constantes almacenadas en algún área de solo lectura o preiniciada del espacio de datos. Este enfoque no requeriría la capacidad de tratar el código y el espacio de datos de manera intercambiable, pero si se aplica a un microcontrolador podría requerir una partición cableada entre el código y el almacenamiento de datos (por ejemplo, 12 K de código y 4 K de datos). No conozco ningún diseño actual que use este enfoque, pero no me sorprendería que algunas de las primeras computadoras hicieran esto. Si un conjunto de instrucciones incluyera una instrucción para cargar un valor desde una de las primeras 1024 ubicaciones designadas, un compilador y un enlazador podrían organizar las cosas de modo que si dos unidades de compilación necesitaran el valor 0x08675309, solo sería necesario almacenarlo una vez dentro de ese mesa.diferentes constantes, pero requeriría que las constantes que son usadas por diferentes funciones sean duplicadas en cada función donde son usadas.

Si bien la mayoría de estos enfoques funcionaría bien con código no relacionado y espacios de direcciones de datos, ARM fue diseñado con el enfoque n.º 3 que requiere la capacidad de colocar y cargar constantes arbitrarias en direcciones que se encuentran entre las direcciones donde se colocará y ejecutará el código.