El fin de bootloader es:

El fin de bootloader es:

El fin de bootloader es:

El cargador de arranque personalizado stm32 salta a la aplicación

El gestor de arranque actualmente comprueba el puntero de pila y el contador de programa de la aplicación principal antes de decidir si saltar. Sin embargo, si la aplicación principal está corrupta, se producirán dos problemas:

Tengo una estructura SharedData que me permite compartir datos (a través de una ubicación de RAM fija) entre el cargador de arranque y la aplicación. He considerado añadir un rebootCounter a esta estructura que se incrementaría al activarse el HardFaultInterrupt en la aplicación principal.

Durante la fase de programación del bootloader, el firmware se programa y valida byte a byte para asegurar que no hay corrupción durante la transferencia de datos. Si se produce una corrupción durante esta fase (un paquete erróneo debido a un problema con el concentrador USB, por ejemplo), el cargador de arranque seguirá aceptando comandos de reprogramación.

Primero te recomiendo que añadas algún retardo en tu gestor de arranque que espere un indicador de inicio del proceso de actualización del firmware. Yo desarrollé algo similar; la aplicación de escritorio envía un byte de inicio periódicamente y cuando conectas tu dispositivo, entra en el modo bootloader y espera cinco segundos más para obtener la información del nuevo firmware; así que no es importante si hay una aplicación principal válida en la flash o no.

Cargador de arranque en el sistema embebido

Cuando un ordenador se apaga, su software -incluidos los sistemas operativos, el código de las aplicaciones y los datos- permanece almacenado en la memoria no volátil. Cuando el ordenador se enciende, no suele tener un sistema operativo o su cargador en la memoria de acceso aleatorio (RAM). El ordenador ejecuta primero un programa relativamente pequeño almacenado en la memoria de sólo lectura (ROM, y más tarde EEPROM, NOR flash) junto con algunos datos necesarios, para inicializar la RAM (especialmente en los sistemas x86), para acceder al dispositivo no volátil (normalmente un dispositivo de bloque, por ejemplo, NAND flash) o a los dispositivos desde los que se pueden cargar los programas del sistema operativo y los datos en la RAM.

Algunos sistemas informáticos anteriores, al recibir una señal de arranque de un operador humano o de un dispositivo periférico, pueden cargar un número muy pequeño de instrucciones fijas en la memoria en una ubicación específica, inicializar al menos una CPU y, a continuación, apuntar la CPU a las instrucciones y comenzar su ejecución. Estas instrucciones suelen iniciar una operación de entrada desde algún dispositivo periférico (que puede ser seleccionable por el operador). Otros sistemas pueden enviar comandos de hardware directamente a los dispositivos periféricos o a los controladores de E/S que hacen que se lleve a cabo una operación de entrada extremadamente simple (como «leer el sector cero del dispositivo del sistema en la memoria comenzando en la ubicación 1000»), cargando efectivamente un pequeño número de instrucciones del cargador de arranque en la memoria; una señal de finalización del dispositivo de E/S puede utilizarse entonces para iniciar la ejecución de las instrucciones por la CPU.

Comandos del gestor de arranque stm32

Dado que normalmente un gestor de arranque se ejecuta al reiniciarse, el método más sencillo es forzar un reinicio del procesador. Un gestor de arranque puede asumir razonablemente que se está ejecutando en un sistema no inicializado en estado de reset y puede realizar una inicialización que no es válida en un sistema ya inicializado, por lo que forzar un reset es el método más seguro.

Su procesador puede tener una instrucción de reinicio o un controlador de reinicio que puede realizar esto directamente. En su defecto, puede tener un temporizador de vigilancia que puede generar un reinicio. Inicie el temporizador de vigilancia con un tiempo de espera convenientemente corto y déjelo funcionar sin repararlo.

Tutorial de programación del bootloader

Tengo entendido que Mike está tratando de construir una pila para su gestor de arranque. El inicio del programa está en 07C0h en la memoria. Lo que no entiendo es la siguiente línea ‘add ax, 288 ; (4096 + 512) / 16 bytes por párrafo’. ¿Por qué está tomando la cantidad total de la pila y el sector de arranque, y luego lo divide por los registros de 16 bits para el inicio del segmento de la pila? ¿No debería el segmento de pila comenzar en 20h, justo después del sector de arranque? Por último, ¿no debería el puntero de la pila establecerse al final de (512 + 4096)? Gracias

Tienes razón. Con la implementación actual, el código dejará un hueco de 4k. La forma de resolverlo es lo que has dicho, que es poner ss al final del bootsector / 16 y cargar sp con 4k (no 4k + 512). De ahí que la implementación correcta sería.

Aparte, de la pregunta, también me gustaría mencionar que este tipo de gestores de arranque ya no funcionan en máquinas reales y deberías centrarte en estándares como UEFI para construir un gestor de arranque. También se encarga de otras tareas como cambiar los modos de la cpu.

Acerca del autor

admin

Ver todos los artículos