30 votos

¿Por qué ejecutar código desde la RAM?

Acabo de encontrar unas macros para que el compilador de mi microcontrolador 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 tiene valor? ¿Por qué no ejecutar siempre desde la RAM si el beneficio es sólo una mayor velocidad? ¿Causa esto generalmente un mayor consumo de corriente?

14 votos

Ejecutar código desde RAM consume menos corriente (no estoy seguro de si es cierto para todas las CPU/SoCs). Una vez hice un proyecto en el que 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 puedes ejecutar código sólo desde la RAM puedes incluso apagar los bloques flash en algunos SoCs y ahorrar aún más energía.

4 votos

@pipe - Me imagino que la razón de hacerlo un comentario en lugar de una respuesta es que no responde a la pregunta real, que es la razón por la que usted no querría siempre utilizar la RAM para ejecutar su código.

1 votos

@Jules Sí, imagino que como "anécdota útil". Las cosas Stack Exchange está diseñado para evitar, por muy buenas razones.

33voto

Tom Deloford Puntos 508

Además de la velocidad y otras características que otros ya han mencionado, ejecutar código desde la RAM puede ser útil en bootloaders donde necesitas reprogramar la flash de tu micro - no puedes ejecutar código desde la flash que estás en medio de borrar y reprogramar.

5 votos

Depende de cuantos bloques flash tengas y cuales permite modificar tu bootloader, cuanta ram te queda para escenificar los datos para el siguiente bloque, etc. pero cierto para trampolinar fuera de la flash para poder modificar la ram de la flash sirve para eso...

1 votos

Esto sólo parece responder a la mitad de la pregunta (la parte titular). OP también preguntó "¿Por qué no siempre ejecutar desde la RAM si el beneficio es sólo una mayor velocidad?", y esta respuesta no explica por qué uno podría no desea ejecutar desde la RAM.

3 votos

Hasta aquí todo bien, pero ¿qué pasa si te quedas sin corriente (y por tanto sin RAM) en mitad de la reescritura de la flash? Este puede solucionarse, pero al igual que cualquier otro diseño para un cargador de arranque, debe tenerse en cuenta.

19voto

RelaXNow Puntos 1164

No he mirado la hoja de datos de ese micro. Sin embargo, es a menudo el caso en esta situación que la obtención de la RAM es más rápido que la obtención de la flash de la memoria de programa se implementa a partir de.

La ventaja del flash es que las grandes cantidades pueden ser relativamente baratas. Por eso, los fabricantes de microcontroladores a veces ponen mucha memoria flash en un chip y luego ofrecen un espacio RAM más limitado desde el que se puede ejecutar el código. Esto permite copiar rutinas críticas en la RAM y ejecutarlas desde allí.

El interruptor del compilador al que te refieres probablemente funciona con el enlazador y marca esa sección de la flash para que sea copiada a la RAM por el código de ejecución del compilador que se ejecuta desde el reinicio. Las diferentes implementaciones variarán en los detalles.

18voto

pipe Puntos 314

Cuando se quiere ejecutar en RAM porque es más rápido, suele ser porque esa RAM es SRAM en chip. Se trata de un recurso escaso, que probablemente querrás para datos que requieran acceso de lectura/escritura.

Utilizarlo para el código cuando ya tienen el código en ROM/flash significa que necesitas X cantidad de flash y X cantidad adicional de RAM.

También requiere una etapa extra de copia en el arranque o cuando se quiere ejecutar, aunque en su mayor parte es insignificante.

Tradicionalmente esto se soluciona con una caché de instrucciones, pero en un microcontrolador puede tener más sentido mantener la SRAM interna genérica, porque no se utiliza un microcontrolador porque se quiera la mayor velocidad de ejecución.

También hay un problema de fiabilidad: el código que se ejecuta en la ROM real es difícil de modificar por código con errores.

14voto

Marko Buršič Puntos 1524

Además de todas las buenas respuestas:

¿Por qué no ejecutar siempre desde la RAM si el mayor velocidad?

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

6 votos

"Porque en un sistema embebido, normalmente no tienes la cantidad necesaria de RAM. " -- y porque si do tiene suficiente RAM para hacerlo, es casi seguro que puede reducir los costes cambiando a una MCU más barata con menos RAM. Porque si estás haciendo la pregunta, siempre hay una MCU más barata con menos RAM (las MCU más pequeñas y baratas utilizan arquitectura Harvard, por lo que no pueden ejecutarse desde la RAM).

13voto

Godisemo Puntos 204

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

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

Un uso típico sería ejecutar una función "dormir" de bajo consumo desde la RAM, con la memoria flash apagada. No sólo se reduce el consumo de energía, sino que si el microcontrolador necesita despertarse rápidamente (por ejemplo, en respuesta a una interrupción externa) no hay retraso mientras la memoria flash se alimenta de nuevo.

Algunas piezas, como algunas de la gama SAM de Atmel, tienen RAM especiales de muy bajo consumo que pueden utilizarse para este fin. Esto permite cargar 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 reposo profundo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X