El programa solo se ejecuta al depurar en GDB - usando Open OCD y Olimex arm-usb-ocd-h jtag para programar at91sam3su

4

Estoy tratando de hacer que mi chip Atmel at91sam3u cortex-m3 haga que el LED parpadee. Tengo un programador jtag Olimex ARM-USB-OCD-H y estoy usando Open OCD en OS X para programar mi chip. Estoy usando los scripts de inicio de Open OCD proporcionados para el programador jtag y mi chip. No tengo problemas para compilar y vincular el programa, y parece que puedo cargar el programa correctamente en el chip. Sin embargo, el LED solo parpadea cuando ejecuto el programa a través de gdb. Funciona tanto si paso a través de él como si lo ejecuto continuamente.

Para hacer que funcione en gdb, primero ejecuto 'openocd' y luego en otra terminal (se omite la retroalimentación de gdb):

$ arm-none-eabi-gdb blinky/blinky.elf
(gdb) target remote :3333
(gdb) load
(gdb) cont

Esto funciona sin problemas y el LED parpadea. Por supuesto, cuando salgo de gdb, el programa se detiene y el LED se queda en el estado en que se encontraba en ese momento. Si hago clic en el botón de reinicio del chip, el LED pasa a un estado neutral (ligeramente encendido).

Para intentar simplemente programar el chip, ejecuto 'openocd' y luego en otra terminal:

$ telnet localhost 4444
> halt
target state: halted
target halted due to debug-request, current mod
xPSR: 0x81000000 pc: 0x00080107 msp: 0x20000598
> flash write_image blinky/blinky.elf
wrote 3044 bytes from file blinky/blinky.elf in 0.314594s (9.449 KiB/s)
> reset run
TAG tap: sam3.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)

No hay errores, pero el LED no parpadea, permanece en un estado neutral.

La secuencia de comandos del vinculador establece el programa (.text) para que se ponga en la memoria flash0. Por lo tanto, he intentado configurar gpnvm bit 1 ya que es el bit de selección de arranque sram vs flash de acuerdo con la hoja de datos at91sam3. Esto no ayudó, y parecía haber evitado que gdb se ejecutara correctamente.

¿Es posible que deba actualizar la placa con algún tipo de cargador de arranque que pueda cargar programas desde el banco flash0? Asumí que el chip vino con esto.

Todavía no he podido cargar el .text en sram en lugar de flash0, ya que tuve problemas para cambiar el script del vinculador. Tengo que hacer esto.

Nota: El chip at91sam3u está en un pcb personalizado diseñado como parte de un proyecto de diseño de un estudiante. Por lo tanto, es posible que se haya cometido un error durante el diseño de pcb ... sin embargo, creo que en ese caso tampoco se ejecutaría correctamente en gdb.

Gracias.

    
pregunta Stepan

3 respuestas

3
$ telnet localhost 4444
> halt
target state: halted
target halted due to debug-request, current mod
xPSR: 0x81000000 pc: 0x00080107 msp: 0x20000598
> flash write_image blinky/blinky.elf

Por lo general, necesita reset init antes de borrar / escribir, halt puede no ser suficiente. En gdb es monitor reset init .

El flash también debe borrarse antes de escribir: flash write_image erase unlock blinky/blinky.elf

    
respondido por el Turbo J
2

Dio una pista bastante grande cuando dijo que el LED estaba en un estado "neutral". No hay un estado "neutral" para una salida digital que funcione correctamente, por lo que probablemente quiso decir que el LED está débilmente iluminado. Y eso generalmente significa que el pin que enciende el LED se enciende y apaga tan rápido que no puede ver el parpadeo. No mostró su código, por lo que no podemos juzgar su retraso, y es posible que su depurador haya ralentizado la ejecución del código lo suficiente como para que funcione.

Otra cosa a considerar es que el depurador JTAG puede haber tomado el control de la entrada RESET. Si ese es el caso, necesitará desconectar el depurador para ver la operación "normal". Supongo que ha escrito los valores adecuados para el puntero de pila inicial y el valor de PC en las ubicaciones 0x0 y 0x4, por supuesto.

    
respondido por el Joe Hass
1

Aunque la sesión de depuración se ha detenido, puede suceder que su depurador de hardware aún tenga el control de señal RESET.

Una solución poco elegante es separar el depurador de su destino y aplicar un reinicio en frío (apagado y encendido de la fuente de alimentación).

    
respondido por el fjrg76

Lea otras preguntas en las etiquetas