我尝试使用带有openocd版本、0.10.0+dev-00512-gfd044600和gdb-multiarch的SWO引脚来获得一些调试输出。
我用带有--specs=nosys.specs --specs=nano.specs --specs=rdimon.specs标志的ARMToolchain_8-2018-q4编译了固件,将函数调用initialise_monitor_handles();放在main()中。我的.gdbinit是这样的:
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()的调用,如下所示:
void _putchar(char c) { ITM_SendChar(c) };芯片是STM32L432KC,openocd命令是:
openocd -f board/stm32l4discovery.cfg当我打印“测试\r\n”字符串时,我在swo.log文件(从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“在那里,但有一些额外的垃圾。我怎么才能摆脱它呢?
我现在的解决方法是使用以下命令来剪切不可打印的字符:
tail -f ../bin/swo.log | tr -cd '\11\12\15\40-\176'发布于 2019-03-22 00:03:49
ITM通道可以处理8位、16位和32位数据。
ITM_SendChar()使用8位(1字节)流,因此每隔一个字节使用1作为后续数据部分的长度。
对于swo.log解码,可以使用this post中的perl脚本。
发布于 2019-07-13 05:05:01
为了澄清,“半托管”和"SWO“是完全不同的概念。您描述的内容没有使用半托管,因此您可以跳过--specs=rdimon.specs、initialise_monitor_handles();和monitor arm semihosting enable,因为它们与您的问题无关。
半托管是一种让宿主系统实现一些系统调用的方法,通过让目标在内存中填充一些数据结构,然后执行断点。这将触发调试主机(OpenOCD),然后它将从目标内存读取参数,模拟系统调用,将结果写回内存,最后恢复目标。这可以用作stdout通道,也可以用于更多更多的功能(stdin、完整文件系统仿真等)。缺点是目标在系统调用期间会暂停,因此该方法非常具有侵入性。
另一方面,SWO是一个轻量级跟踪通道,它可以通过ITM块的32个通道中的任何一个输出任意数据。这对于非侵入式stdout通道很有用。还可以通过SWO输出收集其他类型的数据:时间戳、PC采样、变量访问的DWT跟踪、性能计数器等等。这种多路复用需要对每种数据类型进行分帧,这就是您在SWO日志文件中看到的额外字节。数据流可以由诸如Swodec之类的实用程序解码。
https://stackoverflow.com/questions/55104452
复制相似问题