Depuración de salida a través de printf en una CPU Cortex-M3, paradas en la instrucción BKPT + confusión sobre JTAG y puertos sw

Tengo una caja de emulador USB Keil ULINK2 conectada alJTAG conector en mi placa, que funciona bien con la CPU Cortex-M3 incorporada (serie TI / Stellaris / LuminaryMicro LM3S). Parece que tanto un puerto JTAG como un puerto SWJ-DP comparten los mismos pines (y, por lo tanto, el conector de su placa) en estas CPU. Uno parece no tener capacidad ITM (printf), el otro sí.

Las personas de firmware anteriores siempre han usado stdio a UART (puerto serie), pero necesito liberar el puerto serie para que los mensajes de depuración no interfieran con otros datos que se envían / reciben desde / hacia el puerto serie, por lo que necesito mensajes de rastreo para ir a otro lado. Lamentablemente, solo tengo un puerto serie en esta placa. Pensé que la función ITM (Trace) en esta CPU significaba que podía enviar mensajes de depuración printf directamente a mi depurador / IDE (Keil uVision). La documentación de la CPU de TI / Stellaris llama a esta característica 'Puerto de depuración JTAG de cable serie (SWJ-DP)', soporte para el cual, he leído, es definitivamente una característica implementada en Keil uVision IDE.

Agregar un mensaje printf a mi código hace que mi código se bloquee cuando empiezo a depurar. El bloqueo parece estar aquí en las bibliotecas RTL que están vinculadas a mi aplicación, en la función _sys_open, en la instrucción BKPT:

                 _sys_open:
  0x00009D7A B50E      PUSH     {r1-r3,lr}
  0x00009D7C E9CD0100  STRD     r0,r1,[sp,#0]
  0x00009D80 F7FFFC0F  BL.W     strlen (0x000095A2)
  0x00009D84 9002      STR      r0,[sp,#0x08]
  0x00009D86 4669      MOV      r1,sp
  0x00009D88 2001      MOVS     r0,#0x01
>>0x00009D8A BEAB      BKPT     0xAB
  0x00009D8C BD0E      POP      {r1-r3,pc}

Lo anterior parece ser parte del código llamado por__rt_lib_init_stdio_1.

Que esta pasando? No sé lo que hace BKPT. Supongo que eleva un punto de interrupción de software que luego debe ser manejado por el depurador. ¿No debería el software y hardware Keil / ARM ULINK2 ya estar configurado para esto? ¿Hay algún truco para hacer que debug printf funcione con los puertos Keil JTAG / sw?

No estoy seguro de cuál es la diferencia entre un puerto sw y JTAG. sw significa exactamente qué, creo que se refiere a uno de los dos modos posibles para el conector físico JTAG en una placa, donde JTAG es un modo clásico pero más limitado sin soporte de rastreo, y el modo sw agrega soporte de rastreo sin agregar ningún pin al JTAG diseño del conector? Pero se trata de sistemas integrados, donde ser críptico es la norma. Soy nuevo en el desarrollo de Cortex-M3, y muchas de estas cosas son nuevas para mí desde los viejos tiempos de ARM7TDMI. Pero Keil uVision imprime este mensaje: "ITM funciona solo con el puerto SW, no con JTAG". ¿Es SW un puerto físico diferente que debe diseñar en su placa? (Estoy usando una placa de aplicación de diseño personalizado, no una placa de inicio de desarrollo).

[Buscar en Google me deja ver el hecho de que_sys_open y algo de pragma__use_no_semihosting_swi y algo más está íntimamente involucrado en este rompecabezas, las instrucciones BRKPT en ROM podrían ser alguna variante ARM en la instrucción ARM SWI ('interrupción de software').]

Respuestas a la pregunta(4)

Su respuesta a la pregunta