¿Cómo carga y ejecuta un microcontrolador un cargador de arranque?

5

Sé que para una PC normal, el BIOS ejecuta su controlador de interrupción 0x19 para buscar un dispositivo de inicio y, si se encuentra un dispositivo, los primeros 512 bytes se cargan a 0x7c00 y el BIOS comienza a ejecutarse desde esa dirección. 0x19 y 0x7c00 , aunque son estándar, están definidos por la fabricación del BIOS.

Dado que el microcontrolador no usa un dispositivo externo como un disco duro para arrancar pero usa su memoria flash, ¿cómo puedo saber dónde se va a cargar y ejecutar el código del cargador de arranque en la memoria flash? ¿Y usando qué interrupción? ¿Hay algún documento, es decir, tengo un microcontrolador TM4C123, qué documentos relevantes debo examinar para escribir un cargador de arranque?

    
pregunta Tu Do

4 respuestas

10

Un microcontrolador, al igual que cualquier otra CPU, comienza a ejecutar código desde una dirección fija. Esa dirección a menudo se conoce como el "vector de restablecimiento".

La dirección estará en la hoja de datos del microcontrolador.

Incluso en una PC funciona así. El "arranque" de un disco duro es el número 10347 en su lista de cosas que hacer cuando se inicia: el primero es ejecutar el código desde la ROM, como lo hace un microcontrolador de Flash.

    
respondido por el Majenko
7

Puede haber cierta confusión en torno al término "gestor de arranque", que se utiliza de manera muy diferente en el contexto de los sistemas integrados frente a los sistemas de "escritorio".

En primer lugar, el código que ejecuta cualquier procesador después de un restablecimiento ya debe estar en la memoria, en una dirección fija determinada que está determinada por el procesador específico que se está utilizando. En un sistema integrado, este código será el código de la aplicación real, colocado allí previamente mediante la programación de la memoria no volátil, posiblemente utilizando un cargador de arranque (sentido 1).

En un sistema de escritorio, el sistema operativo y cualquier código de aplicación generalmente se cargan desde algún tipo de almacenamiento secundario (es decir, el almacenamiento desde el cual el procesador no puede ejecutar directamente el código) en la RAM volátil. En este tipo de sistema, el código que se ejecuta después de un restablecimiento es el código BIOS, ubicado en una ROM de algún tipo en la placa base. Una de las funciones de la BIOS es cargar (detectar 2) el sistema operativo. El BIOS contiene suficiente código para poder acceder a las diversas formas de almacenamiento secundario, encontrar el archivo que contiene el kernel del sistema operativo, copiarlo en la RAM y luego saltar a él. Lo que sucede después de eso depende del núcleo. Todo este proceso ocurre cada vez que se enciende el sistema o se reinicia el hardware.

Volviendo a la detección 1 del cargador de arranque, este es un código que forma parte de lo que ya está cargado en el almacenamiento no volátil del procesador integrado, y está diseñado específicamente para aceptar un nuevo código de aplicación de una fuente externa y copiarlo en la memoria no volátil del procesador . Este proceso solo tiene que ocurrir cuando se desea cambiar el código de la aplicación por alguna razón. De lo contrario, el mismo código de aplicación se ejecuta cada vez que se enciende o reinicia el procesador.

    
respondido por el Dave Tweed
4

Los cargadores de arranque en sistemas embebidos pueden ser ligeramente diferentes de las computadoras de propósito general en que puede configurar el procesador (en un espacio aparte de la memoria de código, a menudo "fusibles") para comenzar la ejecución desde una dirección de memoria diferente . Lo que esto permite es una inyección de código (el gestor de arranque) que puede observar una señal especial para hacer algo diferente (normalmente para reprogramar el dispositivo). Si no se ve la señal, el cargador de arranque normalmente redirige a la dirección de inicio tradicional y las cosas continúan normalmente.

Lo que permite la ubicación de inicio ajustable es un binario único y fijo para trabajar con y sin un cargador de arranque, siempre que cuando se compile el programa principal no se superponga con la memoria utilizada para el cargador de arranque. Entonces, al programar el dispositivo, hay dos opciones aproximadas:

  1. Programe el dispositivo solo con el programa principal y deje solo el fusible del cargador de arranque. Al reiniciarse, el procesador comienza la ejecución del programa principal en la ubicación normal.
  2. Programe el dispositivo con el programa principal (no modificado) y el cargador de arranque, y configure el fusible del cargador de arranque según corresponda. Al reiniciar, el procesador comienza a ejecutarse en el gestor de arranque, que puede hacer algo (por ejemplo, reprogramación) o nada (pasar el control a la ubicación normal).

Si el procesador no tiene un fusible del cargador de arranque y usted desea un cargador de arranque, es un poco más complicado, pero aún así es posible (por ejemplo, un cargador de arranque ATtiny).

En cualquier caso, los sistemas integrados no necesitan un cargador de arranque como las computadoras. Cuando el procesador se enciende o, de lo contrario, se reinicia, se activa una interrupción de reinicio que (debería) reinicializar la memoria y los periféricos al estado especificado en la hoja de datos. En un AVR, el contador del programa solo se establece en 0, por lo que el procesador toma lo que está allí y se va. Si está utilizando cualquier interrupción, normalmente el primer grupo de direcciones de memoria son todas JMP xxxx , que sirve como tabla vectorial, pero si no tiene interrupciones, la lógica de su programa puede comenzar ahí y allí.

    
respondido por el Nick T
2

Eso es un microcontrolador ARM Cortex M4 de TI. Tiene un gestor de arranque en ROM. Consulte los capítulos 1.3.2.3 y 5.2.2.1 de la hoja de datos: enlace

Puede usar el cargador de arranque ROM para cargar el software de su aplicación o deshabilitar el cargador de arranque ROM escribiendo en el registro BOOTCFG. Si anula el cargador de arranque ROM, puede especificar un vector de restablecimiento y un valor de puntero de pila inicial en la memoria flash. Luego puede poner cualquier código en el flash, el microcontrolador lo ejecutará cuando se encienda.

El cargador de arranque de ROM de TivaWare y la biblioteca de controladores periféricos de TivaWare en la ROM pueden facilitar la escritura de programas en C para este microcontrolador en particular. Parece que también hay algunas demostraciones de inicio disponibles, consulte: enlace

    
respondido por el PkP

Lea otras preguntas en las etiquetas