用openocd显示Cortex-M4 SWO日志

时间:2018-04-28 09:39:23

标签: arm cortex-m openocd

我正在使用ubuntu,openocd和stlink来开发stm32f407-discovery, 我正在学习通过SWO引脚使用ITM模块从芯片获取日志。最后,我发现了openocd命令

tpiu config internal /tmp/swo.out uart off 168000000

从临时文件中获取日志是完美的,但无论如何都要直接在openocd控制台上显示日志,例如半主机日志。感谢

3 个答案:

答案 0 :(得分:1)

我使用Orbuculum作为辅助程序来工作。

要使输出在与GDB相同的终端中可见,并轻松地同时启动所有内容,请按以下方式启动GDB:

arm-none-eabi-gdb \
       -iex 'target extended | openocd -f interface/stlink.cfg -f target/stm32f3x.cfg -c "gdb_port pipe"' \
       -iex 'mon halt' \
       -iex 'mon tpiu config internal swo.log uart false 2000000' \
       -iex 'shell bash -m -c "orbuculum -f swo.log &"' \
       -iex 'shell bash -m -c "orbcat -c 0,%c &"' \
       firmware.elf

-iex参数告诉g​​db启动时立即执行命令。这是命令的作用:

  1. target extended ...启动openocd并使用管道在它与gdb之间进行通信。
  2. mon halt告诉OpenOCD停止任何正在执行的程序。
  3. mon tpiu ...配置OpenOCD接收跟踪输出并将其写入swo.log文件。
  4. shell bash -m "orbuculum ...启动Orbuculum服务器,并告诉它从swo.log中读取。 &使其在后台运行,而bash -m在单独的进程组中运行,以便GDB中的ctrl-c不会意外停止它。
  5. shell bash -m "orbcat ...启动Orbuculum工具以读取ITM端口0的任何输出并将其作为字符写入终端。

这是它的样子:

GNU gdb (GNU Tools for Arm Embedded Processors 8-2018-q4-major) 8.2.50.20181213-git
....
Reading symbols from firmware.elf...
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: firmware.elf 
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x0800011c msp: 0x10001000
Boot
ADC ch 1 val -100
ADC ch 3 val 0
ADC ch 4 val 3
ADC ch 1 val 4091
.....

Orbuculum套件中还有其他有用的工具。例如orbtop -e firmware.elf显示执行时间所花费的位置。

答案 1 :(得分:1)

实际上,您非常接近实现理想的结果。 首先,您不必指定输出流,默认是在openocd的控制台上公开的命名管道。我的意思是,您可以简单地进行更改:

tpiu config internal /tmp/swo.out uart off 168000000

具有:

tpiu config internal - uart off 168000000

尽管随后发生的问题是,您需要一个解析器来读取swo原始字节,但是幸运的是,这个非常未知但非常有用的存储库仅使用一个python脚本即可完成此操作: swo_parser

因此,当我从jtag调试f1时总结一下我的配置(因为uart被用于其他目的)是

  1. 打开两个终端
  2. 在第一个终端运行openocd -f debug.cfg
  3. 在第二个终端运行python3 swo_parser.py

debug.cfg仅包含:

source [find interface/stlink-v2.cfg]
source [find target/stm32f1x.cfg]
init
tpiu config internal - uart off 72000000
itm ports on

我也忘了提到你必须像这样做一个_write函数 ITM_SEND_CHAR definition

答案 2 :(得分:0)

搜索几天后,我没有直接在控制台中找到有关openocd打印的任何信息。

您可以做的是将其重定向到UART(需要更多的硬件来设置),并使用另一个程序(例如st link实用程序)查看输出,但是只执行“ cat / tmp / swo”比较容易。退出”。