¿Por qué ejecutar código desde RAM?

27

Acabo de encontrar algunas macros para que mi compilador de microcontroladores fuerce (o sugiera) que una función se ejecute desde la RAM.

https://siliconlabs.github.io/Gecko_SDK_Doc/efr32mg1/html/group__RAMFUNC.html#gac6abbc7f869eec9fb47e57427587c556

http://processors.wiki.ti.com/index.php/Placing_functions_in_RAM

https://www.iar.com/support/tech-notes/linker/controlling-placement-of-the-section-where-__ramfunc-functions-reside-ewarm-5.x--6.x/

https://community.nxp.com/thread/389099

¿En qué casos es esto valioso? ¿Por qué no siempre debería ejecutar desde RAM si el beneficio es solo una mayor velocidad? ¿Esto generalmente causa un mayor consumo de corriente?

tarabyte
fuente
13
Ejecutar código de RAM consume menos corriente (no estoy seguro de si es cierto para todas las CPU / SoC). Una vez hice un proyecto donde pusimos la mayor parte del código en RAM porque era un dispositivo de batería y queríamos que viviera el mayor tiempo posible. Si puede ejecutar código solo desde la RAM, incluso puede apagar los bloques de flash en algunos SoCs y ahorrar aún más energía.
Al Bundy
44
@pipe: me imagino que la razón para que sea un comentario en lugar de una respuesta es que no responde a la pregunta real, razón por la cual no querría usar siempre RAM para ejecutar su código.
Jules
1
@Jules Sí, me imagino que se entiende como una "anécdota útil". Las cosas que Stack Exchange está diseñado para evitar, por muy buenas razones.
tubería
1
Porque no tienes suficientes registros para ejecutar desde el registro. (Tengo ese chip.)
Joshua
Además de todo: la ejecución de código desde RAM dinámica específicamente podría ser parte de un elaborado truco de software para perpetrar la actualización de DRAM. :)
Kaz

Respuestas:

32

Además de la velocidad y otras características que otros ya han mencionado, la ejecución de código desde la RAM puede ser útil en los cargadores de arranque donde necesita reprogramar el flash de su micro: no puede ejecutar el código desde el flash que está a punto de borrar. reprogramación

brhans
fuente
44
depende de cuántos bloques flash tenga y cuáles permita que su gestor de arranque se modifique, la cantidad de ram que le queda para organizar los datos para el siguiente bloque, etc., pero fiel al trampolín fuera del flash para que pueda modificar el ram ram. bueno para eso ...
old_timer
1
Esto solo parece responder la mitad de la pregunta (la parte titular). OP también preguntó "¿Por qué no siempre ejecutaría desde RAM si el beneficio es solo una mayor velocidad?", Y esta respuesta no explica por qué uno no querría ejecutar desde RAM.
Doktor J
2
Hasta ahora todo bien, pero ¿qué sucede si pierde energía (y, por lo tanto, RAM) en medio de la reescritura de flash? Esto se puede resolver, pero al igual que cualquier otro diseño para un gestor de arranque, debe considerarse.
AaronD
19

No miré la hoja de datos de ese micro. Sin embargo, a menudo es el caso en esta situación que la recuperación desde RAM es más rápida que la recuperación desde la memoria flash desde la que se implementa la memoria del programa.

La ventaja de flash es que grandes cantidades pueden ser relativamente baratas. Por lo tanto, los fabricantes de microcontroladores a veces colocan una gran cantidad de flash en un chip y luego proporcionan un espacio RAM más limitado desde el que se puede ejecutar el código. Esto permite copiar rutinas de tiempo crítico en la RAM y luego ejecutarlas desde allí.

El conmutador del compilador al que hace referencia probablemente funciona con el enlazador y marca esa sección de flash que el código de tiempo de ejecución del compilador que se ejecuta desde el reinicio copiará en la RAM. Las diferentes implementaciones variarán en los detalles.

Olin Lathrop
fuente
17

Cuando desea ejecutar en RAM porque es más rápido, generalmente es porque esa RAM es SRAM en chip. Este es un recurso escaso, que probablemente querrá para los datos que requieren acceso de lectura / escritura.

Usarlo para el código cuando ya tiene el código en ROM / flash significa que necesita X cantidad de flash y X cantidad adicional de RAM.

También requiere una etapa de copia adicional en el arranque o cuando desea ejecutarlo, aunque en su mayoría es insignificante.

Tradicionalmente, esto se resuelve con un caché de instrucciones, pero en un microcontrolador puede tener más sentido mantener el genérico SRAM interno, porque no utiliza un microcontrolador porque desea la velocidad de ejecución más rápida.

También hay un problema de confiabilidad: el código que se ejecuta en la ROM real es difícil de modificar mediante un código defectuoso.

tubo
fuente
14

Además de todas las buenas respuestas:

¿Por qué no siempre debería ejecutar desde RAM si el beneficio es solo una mayor velocidad?

Porque en un sistema embebido, generalmente no tiene la cantidad de RAM requerida. Por ejemplo, un STM32 que tiene 32kB o RAM y 512kB de EEPROM. Para poder ejecutar todo el programa en RAM, necesitaría un tamaño de RAM mayor que EEPROM.

Marko Buršič
fuente
55
"Debido a que en un sistema embebido, por lo general usted no tiene la cantidad necesaria de memoria RAM." - y porque si lo tiene suficiente memoria RAM para hacer esto, es casi seguro que puede reducir los costos por el cambio a una MCU más barato con menos RAM. Porque si está haciendo la pregunta, siempre hay una MCU más barata con menos RAM (las MCU más pequeñas y baratas usan la arquitectura Harvard, por lo que no pueden ejecutarse desde RAM)
Jules
13

Otras respuestas no parecen haber discutido mucho sobre el consumo de energía, sobre lo que usted preguntó específicamente.

La respuesta es que depende algo del microcontrolador, pero a menudo la ejecución desde la RAM puede reducir el consumo de energía porque requiere menos energía para leer las instrucciones desde la RAM que desde la memoria flash.

Un uso típico sería ejecutar una función de "suspensión" de baja potencia desde la RAM, con la memoria flash apagada. No solo se reduce el consumo de energía, sino que si el microcontrolador necesita reactivarse rápidamente (por ejemplo, en respuesta a una interrupción externa) no hay demora mientras la memoria flash se vuelve a encender.

Algunas partes, como algunas de la gama Atmel SAM, tienen una RAM especial de potencia extra baja que se puede utilizar para este propósito. Esto permite que se cargue una pequeña cantidad de código en la RAM especial, mientras que la mayor parte de la RAM disponible y todas las demás memorias se apagan y el microcontrolador entra en un modo de suspensión profunda.

usuario
fuente
7

Además de los posibles beneficios de velocidad mencionados por otros, el código RAM también es dinámico y puede modificarse sobre la marcha mediante algún código de adaptación en el FLASH según sea necesario.

Esto podría ser tan simple como cambiar algunos parámetros o podrían ser rutinas de controlador completas cargadas de forma remota.

Trevor_G
fuente
O el código en la RAM se puede cargar desde el disco (por ejemplo, SD) o la red
teambob
4

Ejecutar código desde la RAM es significativamente más rápido que ejecutarlo desde la memoria flash. La mayoría de las CPU están muy optimizadas para el acceso a RAM más rápido posible, e incluso la memoria flash más rápida solo alcanza una fracción de la velocidad de RAM.

Sin embargo, tenga en cuenta que mover el código de flash a RAM también lleva tiempo. Si el código se ejecuta solo una vez, solo necesita leerlo una vez y, por lo tanto, realmente perderá tiempo para copiarlo primero en la RAM en lugar de ejecutarlo directamente. Si el código se ejecuta ocasionalmente (por lo que copiarlo en la RAM aumentaría la ejecución la segunda vez que se llama), pero el sistema generalmente está inactivo, entonces ejecutaría ese código más rápido copiándolo en la RAM, pero a nadie le importa, porque al sistema Tiene suficiente tiempo para gastar.

Por lo tanto, estas optimizaciones solo valen la pena si el código se ejecuta con frecuencia y usted lo ha medido como un punto de estrangulamiento del sistema.

Por otro lado, la RAM necesita mantener activamente los datos almacenados, mientras que la memoria flash no lo hace, por lo que el consumo de energía total aumenta, si la RAM necesita mantenerse activa. Sin embargo, esto solo es relevante si la RAM no se usa de otra manera, pero la mayoría de los sistemas modernos, de una forma u otra, ya usarán la RAM disponible y, por lo tanto, ya la mantendrán activa.

TwoThe
fuente
4

Hay dos razones muy comunes para ejecutar código desde la RAM:

  1. Algunos microprocesadores no pueden ejecutarse desde flash durante la programación flash, aunque muchos pueden hacerlo siempre que el código esté en un bloque diferente del flash que se está escribiendo. Las escrituras de Flash pueden estar reprogramando la aplicación (caso del cargador de arranque), o cuando se usa flash para almacenar información de programa no volátil (configuración, calibración, etc.)

  2. En muchos microprocesadores, la RAM es mucho más rápida que la memoria flash. Para estos dispositivos, se pueden ejecutar pequeñas rutinas de velocidad crítica desde la RAM, aunque generalmente la RAM es mucho más corta que la memoria flash.

Dave Nadler
fuente
2

Otro caso de uso para la seguridad de ejecución de RAM solamente contra bitflips aleatorios. Usamos este modelo en nuestro pequeño cubesat porque la placa de la computadora principal tiene un ram ECC que tolera los bits debido a la radiación. Todo el sistema operativo se carga en el ram cuando un ramdisk en el inicio se ejecuta completamente en un entorno ECC.

El flash no está protegido con ECC (tarjetas micro SD estándar), sin embargo, tenemos otros métodos para verificar si hay corrupción (varias imágenes, sumas de verificación, etc.)

Tejas Kale
fuente
Habría asumido que algo como EEPROM o flash sería mucho "más difícil" de bitflip por radiación, es decir, requeriría más energía.
tubería
De hecho, es así, pero dado que solo usamos flash estándar sin características especiales de ECC, usar ram es mucho mejor para este propósito.
Tejas Kale