问题描述
我尝试使用带有openocd
版本0.10.0+dev-00512-gfd044600
和gdb-multiarch
的SWO引脚获得一些调试输出.
I try to get some debug output using the SWO pin with openocd
version 0.10.0+dev-00512-gfd044600
and gdb-multiarch
.
我用带有标志--specs=nosys.specs --specs=nano.specs --specs=rdimon.specs
的ARMToolchain_8-2018-q4
编译了固件,并将函数调用initialise_monitor_handles();
放在main()
中.我的.gdbinit
看起来像这样:
I compiled the firmware with the ARMToolchain_8-2018-q4
with the flags --specs=nosys.specs --specs=nano.specs --specs=rdimon.specs
, put the function call initialise_monitor_handles();
in the main()
. My .gdbinit
looks like that:
target extended-remote localhost:3333
monitor reset halt
monitor arm semihosting enable
monitor tpiu config internal ../bin/swo.log
load
break main
我像这样在_putchar()
函数中安装了对ITM_SendChar()
的调用:
I installed the call to ITM_SendChar()
in the _putchar()
function like that:
void _putchar(char c) { ITM_SendChar(c) };
芯片为STM32L432KC,openocd命令为:
The chip is STM32L432KC and the openocd command is:
openocd -f board/stm32l4discovery.cfg
当我打印"Test \ r \ n"字符串时,在swo.log
文件中(从xxd -b swo.log
输出的)我得到了一些额外的字符:
When I print "Test\r\n" string I get some extra characters in the swo.log
file (output from xxd -b swo.log
):
000032e8: 00000001 01010100 00000001 01100101 00000001 01110011 .T.e.s
000032ee: 00000001 01110100 00000001 00001101 00000001 00001010 .t....
字符串"Test \ r \ n"在那里,但有一些多余的垃圾.我该如何摆脱呢?
The string "Test\r\n" is there but with some extra rubbish. How can I get rid of that?
我现在的解决方法是使用以下方法剪切不可打印的字符:
My workaround now is to cut the nonprintable characters with:
tail -f ../bin/swo.log | tr -cd '\11\12\15\40-\176'
推荐答案
ITM通道可以处理8位,16位和32位数据.
ITM channel can handle 8-, 16- and 32-bit data.
ITM_SendChar()
使用8位(1字节)流,因此每隔一个字节就有1
作为后续数据部分的长度.
ITM_SendChar()
uses 8-bit (1-byte) stream so you have 1
in every other byte as length of subsequent data portion.
对于swo.log
解码,可以使用这篇文章中的perl脚本.
For swo.log
decoding one can use perl script from this post.
这篇关于使用openocd和gdb在STM32L4芯片上通过半主机获取额外的字节的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!