5 votos

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

Sé que para un PC normal, la BIOS ejecuta su manejador de interrupción 0x19 para buscar un dispositivo de arranque y si se encuentra un dispositivo, los primeros 512 bytes se cargan en 0x7c00 y la BIOS comienza a ejecutarse desde esa dirección. 0x19 y 0x7c00 aunque son estándar, los define el fabricante de la BIOS.

Dado que el microcontrolador no utiliza un dispositivo externo como un disco duro para arrancar, sino que utiliza su memoria flash, ¿cómo puedo saber dónde va a cargar y ejecutar el código del cargador de arranque en la memoria flash? ¿Y mediante qué interrupción? ¿Existe algún documento, por ejemplo, tengo un microcontrolador TM4C123, qué documentos relevantes tengo que mirar para escribir un gestor de arranque?

10voto

user4245 Puntos 324

Un microcontrolador, como cualquier otra CPU, empieza a ejecutar código a partir de una dirección fija. Esa dirección suele conocerse como "vector de reinicio".

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

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

7voto

GSerg Puntos 33571

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

En primer lugar, el código que cualquier procesador ejecuta tras un reinicio debe estar ya en la memoria, en una dirección fija determinada por el procesador concreto que se utilice. En un sistema embebido, este código será el código de 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 sobremesa, el sistema operativo y cualquier código de aplicación suelen cargarse desde algún tipo de almacenamiento secundario (es decir, un almacenamiento desde el que el procesador no puede ejecutar código directamente) a la memoria RAM volátil. En este tipo de sistemas, el código que se ejecuta tras un reinicio es el código de la BIOS, ubicado en una ROM de algún tipo en la placa base. Una de las funciones de la BIOS es arrancar (sentido 2) el sistema operativo. La BIOS contiene suficiente código para poder acceder a las distintas formas de almacenamiento secundario, encontrar el archivo que contiene el núcleo del sistema operativo, copiarlo en la RAM y saltar a él. Lo que ocurra después depende del núcleo. Todo este proceso ocurre cada vez que se enciende el sistema o se reinicia el hardware.

Volviendo al sentido 1 de bootloader, se trata de código que forma parte de lo que ya está cargado en el almacenamiento no volátil del procesador embebido, y está específicamente diseñado para aceptar nuevo código de aplicación de una fuente externa y copiarlo en la memoria no volátil del procesador. Este proceso sólo tiene que producirse cuando se desea cambiar el código de la aplicación por algún motivo. De lo contrario, se ejecuta el mismo código de aplicación cada vez que se enciende o se reinicia el procesador.

4voto

Hrvoje Puntos 4248

Los cargadores de arranque en los sistemas embebidos pueden ser ligeramente diferentes de los ordenadores de propósito general en el sentido de que se puede configurar el procesador (en un espacio aparte de la memoria de código, a menudo "fusibles") para iniciar la ejecución desde una dirección de memoria diferente . Lo que esto permite es inyectar código (el cargador de arranque) que puede estar atento a una señal especial para hacer algo diferente (normalmente para reprogramar el dispositivo). Si no se ve la señal, el cargador de arranque suele redirigirse a la dirección de arranque tradicional y las cosas siguen su curso normal.

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

  1. Programe el dispositivo sólo con el programa principal y deje solo el fusible del cargador de arranque. Al reiniciar, el procesador comienza la ejecución del programa principal en la ubicación normal.
  2. Programa el dispositivo con el programa principal (sin modificar) y el cargador de arranque, y activa el fusible del cargador de arranque según corresponda. Al reiniciar, el procesador comienza la ejecución en el cargador de arranque, que puede hacer algo (por ejemplo, reprogramar) o nada (pasar el control a la ubicación normal).

Si el procesador no tiene un fusible de cargador de arranque y quieres un cargador de arranque, es un poco más complicado, pero aún es posible (por ejemplo, los cargadores de arranque ATtiny).

En cualquier caso, los sistemas embebidos no necesitan un gestor de arranque como los ordenadores. Cuando el procesador se enciende o 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 de programa se pone a 0, así que el procesador coge lo que hay y se va. Si estás usando alguna interrupción, normalmente el primer grupo de direcciones de memoria son todas JMP xxxx que sirve como tabla de vectores, pero si no tienes interrupciones, la lógica de tu programa puede empezar en ese momento.

2voto

Dror Puntos 745

Es un microcontrolador ARM Cortex M4 de TI. Tiene un cargador de arranque en ROM. Consulta los capítulos 1.3.2.3 y 5.2.2.1 de la hoja de datos: http://www.keil.com/dd/docs/datashts/ti/tm4c123/tm4c123gh6pm.pdf

Puedes utilizar el cargador de arranque de la ROM para cargar tu software de aplicación o desactivar el cargador de arranque de la ROM escribiendo en el registro BOOTCFG. Si anulas el cargador de arranque de la ROM, puedes especificar un vector de reinicio y un valor de puntero de pila inicial en la flash. Entonces puedes poner cualquier código en la flash, el microcontrolador lo ejecutará cuando se encienda.

El gestor de arranque TivaWare ROM y la librería de controladores periféricos TivaWare en ROM pueden facilitar la escritura de programas en C para este microcontrolador en particular. Parece que también hay algunas demos disponibles, ver: http://energia.nu/wordpress/wp-content/uploads/2014/07/Startup_Weekend_Bay_2014_TM4C123_Energia.pdf

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