¿Qué es más rápido, ejecutar un programa desde ROM o RAM?

La mayoría de nosotros que tenemos experiencia en electrónica sabemos que SRAM es más rápido que DRAM. Pero cuando se trata de comparar RAM con ROM, no estoy seguro.

Mi pregunta está relacionada con el microcontrolador: "Si un código se ejecuta directamente desde RAM/ROM, ¿de quién será mejor el rendimiento? 1) ejecución desde RAM o 2) ejecución desde ROM o 3) ambos tendrán el mismo rendimiento"

También considerando el hecho de que las ROM están diseñadas para tener velocidades de LECTURA más altas. mientras que para la RAM, hay un compromiso de velocidad de lectura por tener capacidades de escritura.

Leer la hoja de datos (completamente) es la mejor manera. A veces es más rápido ejecutar un programa desde la RAM que desde la memoria flash. Algunos micros no pueden ejecutar programas desde la RAM y otros pueden ejecutarse a la misma velocidad.
Todavía no puedo agregar un comentario, solo trato de ser útil. Depende de si la ROM es de hecho más rápida que la RAM que está usando. ¿Son de igual velocidad?
Muchas partes actuales de ARM Cortex-M son excelentes ejemplos de aquellas que pueden ejecutarse desde SRAM, pero son más lentas al hacerlo, ya que no se puede usar la ruta de instrucciones dedicada a flash. Por el contrario, el acceso a datos a flash puede ser más lento que a RAM
Pero con los chips ARM7 un poco más antiguos (mi experiencia fue con LPC2106 y LPC2148), la ejecución desde RAM suele ser MÁS RÁPIDA que desde FLASH. Lo cual, junto con la respuesta de Chris, prueba que lo único que podemos decir es "depende".
Si ya tiene el hardware, la forma más fácil es simplemente ejecutar los dos escenarios y compararlos. Si no, las hojas de datos son su mejor opción.

Respuestas (3)

La hoja de datos debe decirle cuánto tiempo toma cada instrucción y qué diferencias hay, si las hay, entre ejecutar desde RAM o ROM.

Para el microcontrolador que ofrece la opción de ejecutar desde la RAM, probablemente sea más rápido, y probablemente sea el punto principal de usar espacio RAM adicional para ejecutar el código. También puede haber algunos problemas de superposición de búsqueda. En algunos casos, puede ser más rápido ejecutar desde la ROM porque es una memoria separada y el acceso a la RAM puede realizarse simultáneamente.

Una vez más, la única forma de saber para cualquier micro en particular es LEER LA HOJA DE DATOS .

Es aún más rápido ejecutar desde el registro.
@Joshua ¿Tiene algún ejemplo de lo que podría hacer con un programa ejecutado desde registros? Parece perversamente inteligente, pero limitado a un tamaño de programa bastante pequeño. He oído hablar de demostraciones de gráficos de 64 kB, pero ¿una demostración de 16 registros? =)
@CortAmmon: tengo uno en mi escritorio con 512 registros, 400 de los cuales contienen código de programa. La RAM es 3 veces más lenta, y la ROM es tan lenta que se copia a la RAM en el inicio (lo que toma cientos de milisegundos). Tengo un inicializador/lector de tarjeta SD que cabe en 300 registros, sin soporte de hardware más allá de los pines GPIO. El escritor toma otros 100 o más registros, por lo que todo no encaja en el registro (esto no dejaría suficiente para hacer algo interesante), pero ya no necesito el inicializador, así que sobrescriba.

Depende completamente de la memoria y la arquitectura de la CPU. Como regla general, SRAM es más rápido que flash, particularmente en MCU de mayor velocidad (>100 MHz). Las celdas de bits SRAM producen una salida de nivel lógico (más o menos), mientras que la memoria flash tiene que pasar por un proceso de detección de corriente más lento.

Cuánto más rápido (si lo hay) depende nuevamente de la arquitectura: el tamaño de palabra de las memorias, la cantidad de estados de espera en cada uno, la presencia de almacenamiento en caché, el tamaño de las instrucciones de la CPU, etc. Si está ejecutando en un frecuencia lo suficientemente baja, podría tener cero estados de espera en flash y RAM, por lo que podrían ejecutarse a la misma velocidad.

El código también importa. Si su código es estrictamente lineal (sin bifurcaciones), el flash podría obtener instrucciones lo suficientemente rápido como para mantener la CPU saturada incluso a frecuencias más altas. Como dijo Olin, una CPU de arquitectura Harvard con rutas de lectura de datos y programas separadas podría funcionar de manera diferente cuando el código y los datos están en diferentes memorias.

Las ROM de metal (y otras memorias no volátiles como FRAM) tienen sus propias características y pueden o no ser tan rápidas como SRAM. La capacidad de escribir no necesariamente marca la diferencia; se trata más de las características de la salida de la celda de bits y los circuitos de detección.

La hoja de datos le dará una idea aproximada de la diferencia de velocidad, pero la única forma de saberlo con certeza es perfilar su código.

"Ejecutar un programa" requiere una CPU con un reloj síncrono. La memoria lenta se puede acomodar ejecutando todo el sistema a un reloj lo suficientemente lento o insertando wait states(ciclos de reloj adicionales que no hacen nada entre las fases de obtención y decodificación), activo solo para ciertos rangos de direcciones (ver el antiguo 8085 por ejemplo). La búsqueda de instrucciones de la CPU no sabe ni le importa exactamente cuándo los datos se asientan en su valor final, siempre y cuando no cambie durante el intervalo de configuración/retención.

Un microcontrolador generalmente tiene toda su memoria en el chip, por lo que, a menos que se indique lo contrario, asumiría que el sistema de memoria tiene un estado de espera cero. (pero lea la hoja de datos para confirmar). Los microcontroladores típicos están destinados a ser soluciones de un solo chip más simples en comparación con una computadora de escritorio, por lo que los estados de espera son poco probables en un microcontrolador. Por lo tanto, es poco probable que un microcontrolador tenga velocidades de memoria en el chip que no coincidan.

Una memoria más rápida generalmente cuesta una prima (mayor voltaje, menor capacitancia, más demanda). Un 80xx86 tiene una SRAM rápida en caché L2 y una SRAM aún más rápida en caché L1, y mucha DRAM fuera de chip más lenta conectada a un controlador de memoria. Este tipo de sistema es mucho más complicado que un microcontrolador y está más allá del alcance de la pregunta. (¡Pero de gran interés para un ingeniero informático!)

En realidad, un diseño perfectamente combinado no es posible sin restricciones. Un procesador segrega la memoria de instrucciones y de datos, infrautiliza la velocidad de la memoria en instrucciones que no son de datos de memoria, sufre estados de espera o utiliza memoria multipuerto.
Los estados de espera son bastante comunes en los microcontroladores de mayor rendimiento. El flash es lento.
@AdamHaun: Por otro lado, muchas matrices flash internas pueden leer muchas palabras a la vez; si el código salta a alguna ubicación arbitraria en flash, puede tomar un par de ciclos obtener la primera instrucción, pero una vez que se obtiene, las siguientes instrucciones pueden estar disponibles sin más demora. En muchos casos, acceder a algo cerca del final del búfer preparará el sistema para cargar el siguiente conjunto de palabras.