- 作者:老汪软件技巧
- 发表时间:2024-10-17 07:02
- 浏览量:
前言
大致原理是 RTT 在 MCU 的 RAM 中使用 SEGGER RTT 控制块结构管理数据读写。通俗地说,就是 SEGGER RTT 在 RAM 创建一个区域,MCU 将日志写入到这个区域,外部程序使用调试器,通过 SWD/JTAG 协议,访问 MCU 的 DAP,进而读取 RAM 中该区域的日志。
1 安装 SEGGER RTT
废弃原因:首先是我这里使用的 DAPLINK 而非 JLink,而且 DAPLink 的源码已经完整支持 SEGGER RTT,不再需要我们手动移植 SEGGER RTT 代码,所以可以不用安装 SEGGER RTT。其次,OpenOCD 源码中也包含了对 RTT 的支持,那么我们也就不需要 J-Link RTT Viewer 了(虽然它的 GUI 看着着实不错)。
2 OpenOCD 下的 rtt2.1 调试环境
(2)那么我们在 /records/hic_hal/stm32f103xb.yaml 文件中添加 DAPLINK_DEBUG 和 DAPLINK_DEBUG_RTT 两个宏定义。
(3)使用 __FILE__ 宏定义输出文件信息时,全路径太长,那么我们可以在该文件中这样修改:
使用 __FILENAME__ 宏定义来输出不携带路径信息的文件名。Keil 中可以使用 __MODULE__ 宏定义,而 CMake 中本来应该使用 cmake 内置函数在编译期处理的,但可能由于 DAPLINK 中的 cmake 模板问题,导致一直无法成功,只能在运行期解决,影响性能,不要使用在生产环境。
3)根据自已常用的 IDE 生成 stm32f103xb_bl 和 stm32f103xb_stm32f103rb_if 项目(我这里使用基于 cmake 的 CLion):
progen generate -t cmake -v -p stm32f103xb_bl
progen generate -t cmake -v -p stm32f103xb_stm32f103rb_if
4)下载或编译最新版本的 OpenOCD(见其它文章)。
openocd --version
Open On-Chip Debugger 0.12.0-00006-ga7204e9bf-dirty (2024-02-12-14:47)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
5)最后还要准备一个调试器,我这里使用的是 PWLINK。
2.2 输出日志
2)命令行运行如下命令:
openocd -d2 -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg -f rtt.cfg
3)然后,我们随便添加几行日志,编译并下载到开发板中:
4)最后,通过 telnet 127.0.0.1 8888 连接到 OpenOCD RTT Server 后,即可看到日志内容:
5)至此,学习 DAPLINK 源码的准备工作已经完成了。
3 关于日志中的文件名
4)然而,可能因为 DAPLINK 采用的 CMake 版本较老,其采用的 target_compile_definitions() 方法添加宏定义。我测试过无数种写法均无法成功,无奈只能选择 strrchr() 函数。
5)最终结果:
参考