¿Cuál es el trabajo del código de inicio después de finalizar main? Leí que hay un
trabajo para él después de que la aplicación se termine.
Su trabajo es garantizar que el microcontrolador continúe actuando de manera bien definida después de que finalice main()
. En un entorno independiente, el efecto de la terminación del programa es definido por la implementación , por lo tanto, lo que sucede depende del compilador particular y del entorno de compilación. En el caso de MPLab XC8, el manual del compilador dice esto: -
El compilador inserta un código especial al final de main () que es
ejecutado si esta función termina, es decir, una declaración de retorno dentro de main ()
se ejecuta, o la ejecución del código alcanza el derecho de terminación de main ()
abrazadera. Este código especial hace que la ejecución salte a la dirección 0, la
Restablecer vector para todos los dispositivos PIC de 8 bits. Esto esencialmente realiza un
reinicio del software .
Otros compiladores pueden actuar de manera diferente. AVR GCC simplemente deshabilita las interrupciones y las paradas, por lo que la MCU se congela hasta que se reinicia físicamente.
Estoy confundido entre bootloader y bootstrap.
' Bootstrapping ' es el proceso de carga de código desde el almacenamiento externo en el inicio. Se deriva de la frase "levantarse con los propios recursos". En una computadora típica, el sistema operativo es demasiado grande para caber en la ROM, por lo que se almacena en algunos medios que la CPU no puede ejecutar directamente. La ROM 'bootstrap' tiene el código suficiente para acceder a los medios y cargar el primer bit de código que ejecuta el sistema operativo.
En una MCU, el 'gestor de arranque' suele ser un código que se ejecuta en el inicio para 'grabar' un programa en la ROM Flash. Solo es necesario cuando desea instalar o actualizar el firmware sin tener que conectar la MCU a un programador externo.
Algunas MCU tienen un gestor de arranque incorporado que se activa cuando algunos pines se mantienen en niveles lógicos particulares. Otros tienen la opción de iniciar la ejecución desde un área de memoria reservada donde se coloca el código del cargador de arranque. El código de usuario puede colocarse en la misma ubicación que lo estaría en un sistema sin arranque.
Si la MCU no tiene una funcionalidad de cargador de arranque incorporada, aún puede hacerlo usando un programa escrito para hacer el trabajo, pero es posible que el código de usuario deba modificarse para que funcione con el cargador de arranque.
Creo que hay un código incorporado por el fabricante que es responsable
para subir mi archivo de imagen en mi controlador. ¿Qué es exactamente?
Un PIC16F877A en blanco no tiene ningún código de cargador de arranque instalado, pero puede ser agregado por el fabricante (a pedido) o por un proveedor. Si tiene que usar un programador como PICkit 2 para cargar su código, es probable que su PIC no tenga un cargador de arranque.
Lo que es exactamente depende del cargador de arranque en particular, pero en general es un código que se ejecuta al inicio que lee el código de usuario de, por ejemplo. el puerto serie de la MCU y lo graba en la ROM Flash, o si no llega nada dentro del tiempo de espera, simplemente salta al código de usuario previamente quemado. Aquí hay un ejemplo: -
PIC16BOOTLOAD: PIC16F87x / PIC16F87xA bootloader
Puede ver la fuente del lenguaje ensamblador para ver exactamente cuál es el código.