Ayúdeme a depurar: programación flash exitosa y verificada; el programa no se ejecuta

2

Estoy tratando de armar un gestor de arranque simple en el extremo superior del flash de un atmega8. El cargador se comunica con minicom a través del protocolo XMODEM, comprueba los errores, escribe las páginas flash correspondientes y las verifica. Todo esto está probado y funcionando.

Lo que no funciona es ejecutar la aplicación después de que se haya flasheado. Tengo 4 casos de prueba.

Si el archivo de entrada es 1kB de 0x00 o 0x01 bytes, después de un reinicio en frío, la ejecución del programa parece comenzar en el cargador de arranque, aunque el bit BOOTSEL está configurado para comenzar en la dirección flash 0x0000 y el cargador está en 0x1800.

Si el archivo de entrada es un archivo binario de un programa real, el chip se bloquea y no es posible la comunicación. Lo he intentado con aplicaciones muy simples y bastante complejas, y el resultado es el mismo.

avr-gcc app.c -o app.out
avr-objcopy -j .text -j .data -O binary app.out app.bin  # doesn't work
avr-objcopy -j .text -j .data -O ihex app.out app.hex  # works via an isp

Si bien se ha verificado que ambos programas funcionan al cargar el archivo .hex a través de un programador del sistema, la carga de los resuts de .bin biles en la secuencia explicada.

Por ejemplo, aquí están los primeros bytes de la aplicación muy simple:

00000000  12 c0 24 c0 23 c0 22 c0  21 c0 20 c0 1f c0 1e c0  |..$.#.".!. .....|

Esto es big-endian, se está convirtiendo a small-endian por el cargador de arranque. El opticode de un RJMP es 1100 kkkk kkkk kkkk donde k es un desplazamiento de hasta 2kB. Así, 12 c0 se convierte en c0 12 , que se convierte en 1100 0000 0001 0010 . Así que la tabla de vectores está ahí.

¿Qué podría estar mal? Se me acabaron las ideas. Y mis únicas ayudas de depuración son printf() sobre uart y parpadea un led - no hay JTAG disponible. ¿Dónde debo investigar para la solución?

    
pregunta Vorac

1 respuesta

1

En un entorno de recursos de depuración tan bajo, se debe utilizar cada herramienta. En mi caso, este era el programador de circuitos . Lo utilicé para descargar imágenes del flash.

 sudo avrdude -p atmega8 -c usbasp -U flash:r:file_name:r

Luego, al usar dhex cualquier diferencia de valor de byte se hizo evidente, lo que lleva a la conclusión de que las funciones de programación flash de avr-libc esperan caracteres sin firmar y estoy usando caracteres con signos.

Sí, mi primer gestor de arranque funciona.

    
respondido por el Vorac

Lea otras preguntas en las etiquetas