我正在使用ubuntu,openocd和stlink来开发stm32f407-discovery, 我正在学习通过SWO引脚使用ITM模块从芯片获取日志。最后,我发现了openocd命令
tpiu config internal /tmp/swo.out uart off 168000000
从临时文件中获取日志是完美的,但无论如何都要直接在openocd控制台上显示日志,例如半主机日志。感谢
答案 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
参数告诉gdb启动时立即执行命令。这是命令的作用:
target extended ...
启动openocd并使用管道在它与gdb之间进行通信。mon halt
告诉OpenOCD停止任何正在执行的程序。mon tpiu ...
配置OpenOCD接收跟踪输出并将其写入swo.log
文件。shell bash -m "orbuculum ...
启动Orbuculum服务器,并告诉它从swo.log
中读取。 &
使其在后台运行,而bash -m
在单独的进程组中运行,以便GDB中的ctrl-c
不会意外停止它。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被用于其他目的)是
openocd -f debug.cfg
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”比较容易。退出”。