STDOUT 与 GDB、OopenOCD 和半主机的结合在哪里?

ite*_*ter 6 gdb arm openocd semihosting

我试图找出 ARM (STM32042) 上的 semihostong。printf如果我openocd直接从命令行运行并gdb通过 TCP连接到它,我可以看到输出。但是如果我openocd从内部启动gdb,输出会在天空中出现一些大的 /dev/null 。

如果我openocd

$ openocd -f interface/stlink-v2-1.cfg -f target/stm32f0x.cfg
Run Code Online (Sandbox Code Playgroud)

gdb像这样连接到它

(gdb) target remote localhost:3333
Run Code Online (Sandbox Code Playgroud)

printfopeocd终端看到输出。但是,如果我按照此链接的建议openocd从内部启动,gdb

(gdb) target remote | openocd -f interface/stlink-v2-1.cfg -f target/stm32f0x.cfg -c "gdb_port pipe"
Run Code Online (Sandbox Code Playgroud)

我看到了所有openocd调试消息(例如,xPSR: 0xc1000000 pc: 0x08001648 msp: 0x20001800, semihosting),但没有看到我的printfs。

ite*_*ter 1

结果比我想要的稍微复杂一些。显然,不可能在管道中启动 GDB 和 OpenOCD;他们需要通过套接字进行双向通信。因为它需要两个单独的命令调用,并且因为 GDB 的配置不仅仅是一行,所以我将其放入它自己的一个小存储库中:

https://github.com/arikrupnik/semihosting-ut

该存储库具有将标准输出路由到控制台的代码,但它的作用远不止于此。我已经广泛使用它对http://www.dish.tc的 ARM 目标进行单元测试,并且发现它非常有用。我很高兴回答有关它的问题。