获取额外的字节与OpenOCD的和gdb上STM32L4芯片半主机(Getting extra by

2019-10-28 18:33发布

我尝试使用SWO引脚得到一些调试输出openocd版本0.10.0+dev-00512-gfd044600gdb-multiarch

我整理与固件ARMToolchain_8-2018-q4与标志--specs=nosys.specs --specs=nano.specs --specs=rdimon.specs ,把函数调用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

我安装了呼叫ITM_SendChar()_putchar()这样的功能:

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'

Answer 1:

ITM信道能够处理8位,16位和32位数据。

ITM_SendChar()使用8位(1字节)的流,以便你有1中的每个其他字节作为后续数据部分的长度。

对于swo.log解码一个可以使用perl脚本这个帖子 。



Answer 2:

只是为了澄清,“半主机”和“SWO”是完全不同的概念。 什么你描述不作任何使用半主机,那么可以跳过的--specs=rdimon.specsinitialise_monitor_handles();monitor arm semihosting enable ,因为他们无关您的问题。

半主机是一种让主系统实现一些系统调用中,具有在内存中的一些数据结构的目标填充,然后执行一个断点。 这会触发调试主机(OpenOCD的),然后将目标从内存中读取参数,模拟系统调用,将结果写回内存,并最终恢复目标。 这可以被用来作为一个stdout信道也用于很多很多( stdin ,全文件系统仿真,等等)。 不足之处是在系统调用期间的目标是停止这样的方法是非常侵入。

在另一方面SWO是除其他事项外的轻量级跟踪信道,其可以经由任何ITM块的32个信道的输出的任意数据。 这可以是作为一种非侵入有用stdout信道。 其他类型的数据也可以通过SWO输出漏斗状; 时间戳,PC-采样,可变访问,性能计数器和更多的DWT痕迹。 这种复用需要大约每个数据类型,成帧这就是你看到的如SWO日志文件中的额外的字节。 该数据流可通过实用程序,例如被解码Swodec 。



文章来源: Getting extra bytes with semihosting on STM32L4 chip with openocd and gdb