¿Se obtienen las instrucciones de RAM o ROM en un microcontrolador ARM?

6

En muchos tutoriales relacionados con los registros de CPU ARM, el registro de instrucciones se menciona de esta manera: "El registro R15 en el microcontrolador ARM es el contador del programa y apunta a la siguiente instrucción que se recuperará de la memoria".

Pero también leí que en la arquitectura de Harvard, hay memoria de instrucciones y memoria de datos. Lo que entendí o entendí mal de esto fue que los códigos de instrucciones se almacenan en la ROM flash, y los datos se almacenan en la RAM.

Pero cuando leo más al respecto, me da la impresión de que las instrucciones también se obtienen de la RAM en lugar de la ROM.

¿La ROM no tiene nada que ver con toda la operación además del almacenamiento del código de máquina?

editar: la pregunta no asume ningún sistema operativo, solo un microcontrolador ARM independiente.

    
pregunta user16307

4 respuestas

17
Los

núcleos ARM son en realidad lo que se llama arquitectura de Harvard modificada . En este caso, la ROM y la RAM se encuentran en el mismo espacio de direcciones, por lo que un procesador ARM puede ejecutar código desde cualquiera de los dos o acceder a ellos como datos. En la arquitectura de Harvard modificada, el núcleo de procesamiento está conectado directamente a dos cachés de datos e instrucciones independientes. Esto permite un alto rendimiento debido a la posibilidad de acceder a instrucciones y datos simultáneamente. En un nivel alto, el espacio de direcciones combinado hace que todo el sistema actúe como una arquitectura de Von Neumann.

La estructura del espacio de direcciones está determinada por las conexiones físicas entre el núcleo de procesamiento y las memorias y periféricos. En su mayor parte, el diseño del espacio de direcciones se corregirá con rangos particulares correspondientes a periféricos asignados en memoria, ROM de máscara, Flash, RAM, etc. Sin embargo, puede haber cierta capacidad para reasignar ciertas secciones del espacio de direcciones o configurar periféricos o memorias externas para sentarse en regiones específicas del espacio de direcciones.

    
respondido por el alex.forencich
10

La arquitectura ARM es una arquitectura de von Neumann , no una arquitectura de Harvard. Eso significa que utiliza un espacio de direcciones unificadas para las instrucciones y los datos. Si alguna dirección particular contiene RAM o ROM depende del diseñador del sistema. Las instrucciones se pueden obtener de cualquiera de los dos.

    
respondido por el Dave Tweed
2

Los microcontroladores ARM, los más nuevos Cortex-M, tienen modos para operar desde RAM o ROM. Verifique, por ejemplo, los bits BOOT0 y BOOT1 en Manual de referencia de STM32 . Esto prácticamente configura la dirección de inicio de la ejecución al en realidad aliasar las direcciones de memoria reales en un segmento de dirección de memoria fija ( 0x0000 0000 a 0x0007 FFFF ).

El núcleo de Cortex-M tiene cuatro tipos de "memoria": RAM, ROM (flash y memoria del sistema), FSMC y periféricos. RAM es, bueno, RAM estática interna. La ROM es un flash interno o el gestor de arranque incorporado no se puede escribir. FSMC permite usar memoria externa (tanto RAM como ROM, dependiendo de cuál sea el hardware externo). La memoria periférica es un registro específico que se asigna a funciones periféricas, como UART, ADC, etc. El hardware para acceder a ellas es independiente para ganar velocidad (estilo Harvard), especialmente porque el flash es más lento que la SRAM.

Sin embargo, todos ellos se unifican en un único espacio de direcciones (estilo Von Neumann), lo que simplifica el acceso a ellos desde la perspectiva de un programador. Difieren solo por sus rangos de direcciones (dependientes de la implementación). Los pines BOOT permiten la configuración entre tres direcciones de inicio: una en la RAM, una en la ROM (cargador de arranque de solo lectura) y otra en la ROM (flash). Esto hace posible responder a su pregunta como "both" . Nunca lo intenté, pero parece que es posible saltar de un segmento a otro.

Sin embargo, tenga en cuenta que esos recuerdos aún no se pueden tratar por igual. No se puede escribir arbitrariamente a la ROM. Es flash, haciéndolos reescribibles, pero debe usar un procedimiento especial para escribirlos (generalmente se llama algo así como "usar flash como EEPROM" para almacenar los datos del programa, o "bootloader" cuando almacena el código del programa, generalmente al inicio). / p> Información curiosa:

Cuando uno se ejecuta desde flash (ROM), las instrucciones se recuperan directamente de la ROM. Por lo general, hay un código de inicio que copia los datos de la ROM a la RAM (variables globales inicializadas, generalmente almacenadas en la sección de datos ). El Manual de Referencia también lleva esta información

  

Al arrancar desde SRAM, en el código de inicialización de la aplicación,   tener que reubicar la tabla vectorial en SRAM usando la excepción NVIC   tabla y registro de desplazamiento.

que normalmente se lleva a cabo mediante el código de inicio.

    
respondido por el Ronan Paixão
0

Independientemente de la arquitectura, R15 mantendrá la dirección del contador del programa. La siguiente instrucción (ojalá sea válida) se buscará en esta dirección (ojalá sea válida). Tenga en cuenta que es posible que cualquiera de estos sea problemático.

1) códigos de operación no válidos. 2) No se puede instalar memoria de ningún tipo para la dirección.

Sí, es deseable que las áreas reservadas para datos no se ejecuten como código de programa. El espacio de direcciones del que hablamos está limitado (no es un espacio de direcciones con ventanas como el que se usa en PC, rango medio, mainframe, etc.) y puede contener RAM, ROM, puertos periféricos.

Ciertamente, debería ser posible obtener instrucciones de la RAM si tenemos RAM para las direcciones que consideramos válidas para las instrucciones, por lo que el código puede cargarse si lo deseamos, estilo de superposición. Incluso sin un sistema operativo.

    
respondido por el mckenzm

Lea otras preguntas en las etiquetas