树莓派Pico C/C++ OpenOCD调试环境搭建(Windows)
参考资料和背景
从上次树莓派Pico C/C++ 开发环境搭建(一键完成版)后,一直想找个合适调试器,最后测试了多种方案,还是使用另一块树莓派pico作为picoprobe 来调试比较方便,其中参考的博客有以下两篇
使用picoprobe调试树莓派PICO(附调试包) - 知乎
Raspberry Pi Debug Probe - Waveshare Wiki
不过完全按照上面两个博客来搭建,可能有bug,至少在我的电脑上行不通😂,所以才有了这篇博客。
openocd调试原理
这里需要说明下 openocd到底是个什么东西,和gdb、cmsis-dap、dap-link之间的关系。
- openocd: 通常情况下,我们都是使用openocd server,启动openocd作为服务,用于连接通用的调试器gdb和我们插入电脑的硬件调试器(各种link)。
- gdb:这个应该不用说,C语言常用的调试器,功能强大。
- cmsis-dap:是arm推出的标准调试接口,支持SWD协议和JTAG协议,可以认为cmsis-dap是一个库,用于写调试器的库。使用这个库最通用的硬件就是dap-link。
只是我们平时使用的ide将openocd和gdb这两个东西结合在一起了。像keil,我们只需要直接在在debug窗口看看有没有我们的调试插入,选择调试的ID就可以了。
所以,使用openocd调试的过程,大概就是
- 将调试器接入(这里使用的是picoprobe),并安装对应的驱动。
- 启动openocd,他会监听loaclhost:3333这个端口,这个端口用于给调试器访问,如gdb。
- 启动gdb给我们要调试的目标开发板(这里是pico)刷写入elf文件,并开始调试。
搭建openocd调试教程
首先第一步插入硬件调试器
我们需要有一个硬件调试器,所以我们需要制作一个picoprobe,只需要连接上一个树莓派pico,将下面的uf2文件拖入即可。
uf2文件可以从树莓派pico-debug-probe的仓库中获取(这里尽量不要使用最新的release版本,据我测试,最新的release版本插入电脑作为cmsis-dapv2设备),而使用较低的版本会显示pico-probe,显示为cmsis-dap设备会对openocd的版本要求比较高。如果不确定用那个,也可以直接下载我文末的压缩包(免积分!!!)里面有一个uf2文件。
注意,如果电脑没有显示上图的Picoprobe设备的话,而是在设备上有个⚠的话,需要先安装下驱动,在文末压缩包里的drivers文件下有一个 zadig-2.7.exe文件,运行安装就可以。
启动openocd server
因为是在windows下的环境,所以自然需要windos下的openocd,但一个尴尬的情况是,在linux下基本上找不到的软件就直接下载源码进行编译了,但windows下编译很麻烦,所以,这里提供一个网站可以直接下载编译好能够在windows下运行的openocd软件。
Download OpenOCD for Windows
我这里直接下载最新版了,不想下载的文末的压缩包也有。
之前那篇博客一键安装好的环境中有openocd文件,但那个应该不是window下可运行的openocd,至少我试着运行失败了😭。
而关于,需不需要将openocd文件夹添加到环境变量,这个就因人而异了,我对于这些可能用到多个版本的软件,我自己更习惯在命令行中使用时直接指定绝对路径(我一般也会在下载时把它放在一个比较短的路径中,方便使用)。
在下载的openocd压缩包解压后的文件中打开powershell,运行以下命令
.\bin\openocd.exe -f .\share\openocd\scripts\interface\picoprobe.cfg -f .\share\openocd\scripts\target\rp2040.cfg -c "adapter speed 5000"
出现上图就说明openocd已经成功连接到我们插入电脑的picoprobe了,并且在监听3333端口。
这里说下上面命令啥意思吧
.\bin\openocd.exe
指定运行的软件路径
-f .\share\openocd\scripts\interface\picoprobe.cfg
指定使用的调试器的配置文件,这里使用picoprobe
-f .\share\openocd\scripts\target\rp2040.cfg
指定我们调试的目标板,这里我们调试rp2040,也就是pico
-c "adapter speed 5000"
指定通信速率
启动gdb开始调试
在上次搭建好的环境下找到build文件夹,运行微雪电子博客中命令,大概可以看到以下输出
同样解释下命令吧
arm-none-eabi-gdb .\ProjectTest.elf
启动gdb调试器,需要注意,后面跟的这个文件必须在该文件夹下有,所以一般就是上次搭建环境中的build文件夹打开powershell就可以了。GDB启动后的命令
target remote localhost:3333
调试目标不是本机,连接到openocd server
load
加载(刷写)elf文件进pico板子
monitor reset init
重启两个核到debug
continue
这个就是调试中的continue,执行到下一个断点处,但我没打断点,所以代码会一直运行,板子上的灯会开始闪烁。
联合VSCode
上面这样调试还有有些麻烦的,需要先在命令行中启动openocd Server,然后找到elf文件所在的文件夹启动gdb,还需要熟悉gdb的调试指令。通常这个时候就需要搬出“宇宙最强IDE”——VScode🤣🤣
首先,我们要使用Vscode帮助我们完成上面的工作。
原理
运行GDB这个工作需要用插件 Cortex-Debug
来帮我们完成,通过在launch.json中配置调试器type为Cortex-Debug就可以了(当然要先安装这个插件🧐)。
然后,我们还需要一个在启动调试前,先启动openocd server。这里我使用一个tasks.json,并在launch.json中引用它,实现这个功能。
具体操作步骤
-
安装Cortex-Debug这个插件,在vscode打开树莓派pico工程目录,打开.vscode目录下的
luanch.json
没有的话,就新建一个,写入如下{"version": "0.2.0","configurations": [{"name": "Pico Debug","type": "cortex-debug","preLaunchTask": "Start OpenOCD Server", // 引用tasks.json中的任务"cwd": "${workspaceRoot}","executable": "${command:cmake.launchTargetPath}","request": "launch","servertype": "external","gdbPath": "arm-none-eabi-gdb","gdbTarget": "localhost:3333","svdFile": "${env:PICO_SDK_PATH}/src/rp2040/hardware_regs/rp2040.svd","runToMain": true,"postRestartCommands": ["break main","continue"]}] }
-
在.vscode下打开
task.json
文件,没有的话,也是新建一个就可以,写入如下:(注意下自己openocd的路径){"version": "2.0.0","tasks": [{"label": "Start OpenOCD Server","type": "shell","command": "D:\\OpenOCD\\OpenOCD20240916\\bin\\openocd.exe","args": [ //自己不喜欢加环境变量,所以都使用绝对路径,更换成自己的openocd路径就可以"-f", "D:\\OpenOCD\\OpenOCD20240916\\share\\openocd\\scripts\\interface\\picoprobe.cfg","-f", "D:\\OpenOCD\\OpenOCD20240916\\share\\openocd\\scripts\\target\\rp2040.cfg","-c", "adapter speed 5000"],"isBackground": true,// 移除或简化problemMatcher(避免语法冲突)"problemMatcher": [] // 留空或直接删除该字段}] }
可能出现的警告
如上图,openocd server已经成功启动了,但终端退出要执行gdb时出现的一个警告,选择Debug Anyway
就可以。
可以看到调试器成功启动了,而且信息很丰富,可以开始愉快的玩耍了😉
调试压缩包链接:https://download.csdn.net/download/weixin_51915497/90604382