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.