¿Se copia el código del programa a SRAM desde flash en el microcontrolador?

En la PC, el ejecutable del programa se lee desde el disco duro y se carga en la RAM para ejecutarlo. En el microcontrolador, el programa se almacena en flash.

  1. ¿Está cargado en SRAM cuando se inicia el microcontrolador?
  2. En caso afirmativo, el documento STM32F103 dice que la memoria flash es de 64 KiB y la SRAM de 20 KiB. El programa no encaja en SRAM. (Lo mismo para otros microcontroladores también).
  3. Si dice que no todo el contenido flash se carga en SRAM, ¿para qué sirven los datos restantes en flash? Todas las operaciones se realizan en SRAM ya en códigos de programa.
Depende del programa. Si se copia a sí mismo en SRAM (por ejemplo, como parte de su código de inicio), entonces sí. Como notas, a veces no tendría sentido hacerlo...

Respuestas (4)

La mayoría de los microcontroladores de 8, 16 y 32 bits ejecutan el programa directamente desde la memoria flash. Este es el caso de la gama STM32F103. La mayoría de los microcontroladores son capaces de ejecutar el programa desde la RAM, pero solo los programas relativamente especializados lo hacen. Por esta razón, la mayoría de los microcontroladores tienen mucha más memoria flash que RAM.

Hay algunos microcontroladores que tienen mucha RAM y poco o nada de flash. Incluso puede ser posible obtener un STM32 como este. Estas partes se basan en el almacenamiento del programa fuera del chip en un chip flash serie físicamente pequeño y económico, como un Micron MT25Q.

Los verdaderos microprocesadores (donde la RAM y la memoria flash están en circuitos integrados separados, como el ARM 7 y partes similares) pueden copiar, y con frecuencia lo hacen, el programa de la memoria flash a la RAM y ejecutarlo desde la RAM. La razón principal de esto es que el acceso a la RAM suele ser mucho más rápido en comparación con el flash, por lo que el programa se ejecutará más rápido. Los procesadores rápidos a menudo ejecutan el sistema operativo Linux, que generalmente funciona de esta manera. También le da a Linux la capacidad de almacenar el programa en otros tipos de memoria de almacenamiento, como tarjetas SD y flash de interfaz serial (flash serial).

Se puede hacer que Linux ejecute el programa directamente desde flash (se denomina Ejecutar en el lugar), pero esto generalmente sufre una penalización de rendimiento.

Todos los microcontroladores STM32 que conozco tienen un gran flash incorporado: generalmente, alrededor de 3 veces más flash que SRAM, a veces incluso más.

Eso depende. Algunas memorias FLASH son XIP (eXecute In Place), concretamente las NOR, ya que son direccionables por palabras. Algunos no lo son, como NAND FLASH. Los programas que se ejecutan directamente desde FLASH (o cualquier otra ROM) deben escribirse/compilarse en una imagen denominada "ROMable". La principal diferencia de un programa de este tipo con el que se ejecuta desde la RAM es que primero "reubica" todas sus variables en la RAM y las inicializa, porque no puede cambiarlas en la memoria de solo lectura.

Pero a veces el programa se copia felizmente a la RAM y se ejecuta desde allí. Si no hay suficiente RAM para que quepa todo el FLASH, se utilizan cargadores de arranque de varios niveles. Primero, el cargador de arranque L0 se carga en la RAM, ejecuta algunas inicializaciones de bajo nivel y luego carga el cargador de arranque L1, a veces sobrescribiéndose a sí mismo. Puede ser el binario final en lugar de L1, por supuesto. Pero también puede subir de nivel. de esta manera, el código que ya no se necesita simplemente no se guarda en la RAM, lo que reduce su uso.

Entonces, la memoria FLASH adicional se puede usar para almacenar diferentes archivos binarios cargados uno por uno. O simplemente almacene algunos datos adicionales a los que el programa pueda acceder en tiempo de ejecución (al igual que el disco duro de una computadora).

Copiar un programa en la memoria antes de ejecutarlo es una función del sistema operativo. En MCU, generalmente solo ejecuta el programa desde FLASH. Hay excepciones notables, como los cargadores de arranque, pero generalmente se ejecuta desde FLASH. Incluso en una PC o algo con un sistema operativo, podría ejecutar un programa desde un disco y no desde la memoria, pero debe recordar los días de la unidad de cinta cuando IO era lento.

La mayoría de los microcontroladores utilizan la arquitectura Harvard, que tiene áreas separadas de memoria de programa y de datos. Con este arreglo, el procesador no puede ejecutar código desde la RAM, ya que la RAM es estrictamente memoria de datos. La memoria FLASH contiene el código del programa y el procesador obtiene las instrucciones directamente de FLASH.

Eso no es cierto para los microcontroladores ARM (como el STM32 mencionado en la pregunta), que son cada vez más comunes en la actualidad.