Combinando un cargador de arranque y un programa de usuario en un único binario capaz de flashear

1

Quiero actualizar los cargadores de arranque UF2 para SAMD21 junto con un binario compilado de un programa de usuario en una SAMD21 MCU .

Por lo que entiendo cómo funciona cualquier gestor de arranque, el gestor de arranque se encuentra en un espacio de direcciones específico en la memoria flash (en el caso de UF2 parece ser 0x0-0x00002000) y luego, después de ese espacio de direcciones, el gestor de arranque mostrará el programa de usuario y ejecutalo.

Ahora sería genial si puedo programar mi placa con el cargador de arranque y el programa de usuario predeterminado una sola vez sin necesidad de actualizar el cargador de arranque con el programador y luego conectar la placa a través de USB para actualizar el programa del usuario.

¿Puedo resolver los binarios de alguna manera para que el programador pueda actualizar todo a la vez en una sola operación?

Planeé usar enlace con un Teesny para flashear. Esto funciona muy bien usando solo el binario del cargador de arranque.

    
pregunta PTS

3 respuestas

1

Ha especificado incorrectamente la dirección del gestor de arranque, y eso es importante.

Si las regiones que ocuparían el cargador de arranque y los programas de aplicación son contiguos con un poco de relleno para permitir el crecimiento de futuras versiones del cargador de arranque, simplemente puede concatenar los archivos binarios (con relleno) y producir un único binario plano. Si ambos van al mismo banco flash de usuario, ese sería el caso. Pero si las regiones son distcontinuas, entonces necesitarías un formato como un Intel Hex o un archivo de registro s o un .elf que pueda acomodar saltos a varias direcciones.

Con una cadena de herramientas de estilo GCC (como los propios Atmel ahora ofrecen para sus piezas ARM), normalmente puede utilizar el arm-none-eabi-objcopy (la identificación del medio puede variar) para manipular y combinar archivos binarios .elf, hexadecimales y planos. Para casos simples, también puede combinar archivos binarios planos con cat (si no se necesita relleno) o dd (si lo es), y combinar archivos .hex con cat o un editor de texto con secuencias de comandos, posiblemente después de eliminar cualquier Metadatos de archivo completo.

Para un programa típico que incluye el gestor de arranque que está viendo, encontrará las asignaciones de memoria reales en el archivo de script de vinculador (.ld), y puede encontrar el uso de objcopy para producir un binario plano en el proyecto Makefile.

Tenga en cuenta que generalmente desea compilar y vincular cada uno de los cargadores de arranque y el programa de aplicación como proyectos independientes; no desea que el vinculador intente compartir nada entre ellos, excepto posiblemente por cosas que define en direcciones de envío fijas; de lo contrario, se vuelve casi imposible cambiar uno sin requerir una reconstrucción del otro, lo que en gran parte anula el propósito de tener un cargador de arranque. Cuando hago cargadores de arranque para sistemas basados en ARM, normalmente el analizador de arranque analiza la tabla de vectores al inicio del programa de aplicación, imitando lo que hace el hardware en el inicio; eso también hace posible simplemente copiar la tabla de vectores del programa de la aplicación a la dirección de inicio del hardware y hacer que el chip se inicie directamente en la aplicación sin un cargador de arranque, lo que puede simplificar la depuración.

    
respondido por el Chris Stratton
1

1)

Dependiendo de su cadena de herramientas, es posible que pueda tomar el binario del firmware de la aplicación que obtiene después de compilar, y usar el archivo de vinculador de cargadores de arranque para vincularlo en el archivo binario de aplicaciones al rango de direcciones correcto.

2)

Puede utilizar una herramienta SRecord como enlace . Existen herramientas de línea de comandos para manipular archivos srec y convertir a binarios y viceversa.

Sugiero crear un archivo por lotes para que no tenga que hacer esto manualmente cada vez que compile y pruebe.

3)

Este es el tiempo más lento para implementar. Pero si haces muchos cargadores de arranque y tienes MCU y plataformas diferentes, esto podría automatizar mucho y ahorrarte tiempo.

Puede crear su propia aplicación para PC que toma archivos binarios o archivos srec y un archivo de configuración. Luego combinará el gestor de arranque con la aplicación y generará cualquier otro archivo que desee, como un archivo encriptado, inyecte una clave AES en la imagen, presione para probar, cree archivos de registro, etc. Pero puede que esta no sea la forma de hacerlo. la primera vez.

Notas:

Tenga en cuenta que supongo que ya ha editado la aplicación para que sea compatible con un cargador de arranque, como editar el archivo del vinculador para que comience en la dirección correcta que necesita para ir una vez que se combine con el cargador de arranque. También que ya tiene la aplicación reubicando la tabla de vectores de interrupción en otra ubicación, y que el cargador de arranque sabe dónde saltar a la aplicación y verificar la suma de comprobación de la aplicación antes de iniciarla.

Una vez hecho todo esto, puedes generar el archivo binario y combinarlo con el cargador de arranque.

    
respondido por el guitardenver
1

Eche un vistazo a SRecord : fue diseñado con este objetivo en mente. No solo maneja archivos binarios, sino también muchos otros formatos, como Intel HEX y Motorollla HEX.

    
respondido por el Jan Dorniak

Lea otras preguntas en las etiquetas