Depuração de saída via printf em uma CPU Cortex-M3, paralisa na instrução BKPT + confusão sobre portas JTAG e sw

Eu tenho uma caixa de emulador Keil ULINK2 USB conectada aoJTAG conector na minha placa, que está funcionando bem com a CPU Cortex-M3 integrada (série TI / Stellaris / LuminaryMicro LM3S). Parece que as portas JTAG e SWJ-DP compartilham os mesmos pinos (e, portanto, o conector na sua placa) nessas CPUs. Um parece não ter capacidade ITM (printf), o outro possui.

As pessoas de firmware anteriores sempre usavam stdio para UART (porta serial), mas eu preciso que a porta serial seja liberada para que as mensagens de depuração não interfiram com outros dados enviados / recebidos de / para a porta serial, portanto, preciso rastrear mensagens ir para outro lugar. Infelizmente, só tenho uma porta serial nesta placa. Eu pensei que o recurso ITM (Trace) nesta CPU significava que eu poderia enviar mensagens de debug printf diretamente para meu depurador / IDE (Keil uVision). A documentação da CPU da TI / Stellaris chama esse recurso de 'Porta de depuração JTAG de fio serial (SWJ-DP)', suporte para o qual, eu li, é definitivamente um recurso implementado no Keil uVision IDE.

Adicionar uma mensagem printf ao meu código faz com que meu código seja bloqueado quando inicio a depuração. O bloqueio parece estar aqui nas bibliotecas RTL que estão vinculadas ao meu aplicativo, na função _sys_open, na instrução 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}

O texto acima parece fazer parte do código chamado por__rt_lib_init_stdio_1.

O que está acontecendo? Não sei o que o BKPT faz. Suponho que gera um ponto de interrupção de software que deve ser tratado pelo depurador? O software e o hardware Keil / ARM ULINK2 não devem estar configurados para isso? Existe algum truque para fazer o debug printf funcionar com portas Keil JTAG / sw?

Não tenho certeza qual é a diferença entre uma porta sw e JTAG. sw significa exatamente o que, acredito, refere-se a um dos dois modos possíveis para o conector físico JTAG em uma placa, onde JTAG é um modo clássico, porém mais limitado, sem suporte a rastreios, e o modo sw adiciona suporte a rastreios sem adicionar pinos ao JTAG layout do conector? Mas isso é sistemas embarcados, onde ser enigmático é a norma. Eu sou novo no desenvolvimento do Cortex-M3, e muitas dessas coisas são novas para mim desde os velhos tempos do ARM7TDMI. Mas o Keil uVision imprime esta mensagem: "O ITM funciona apenas com porta SW, não com JTAG". O SW é uma porta física diferente que você precisa projetar na sua placa? (Estou usando uma placa de aplicativo projetada, não uma placa de iniciação ao desenvolvimento.)

[Pesquisando ao redor me permite entender que_sys_open e algum pragma__use_no_semihosting_swi e algo mais está intimamente envolvido nesse quebra-cabeça, as instruções BRKPT na ROM podem ser uma variante ARM da instrução ARM SWI ('interrupção de software').]

questionAnswers(4)

yourAnswerToTheQuestion