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').]