工具链
构建
arm-none-eabi-gcc 编译器arm-none-eabi-binutils 工具包,包含了汇编器、链接器等工具arm-none-eabi-newlibs 基于嵌入式系统的标准库


调试
调试流程图:
$$\text{用户操作 (Code-OSS GUI)} \rightarrow \text{Cortex-Debug (GDB Front-end)} \rightarrow \text{GDB (Client)} \ \rightarrow\ \text{OpenOCD (Server)} \rightarrow \text{ST-Link/J-Link (Hardware)} \rightarrow \text{STM32 芯片}$$
OpenOCD
软件中间层,理论上只需要ocd不需要GDB就可以调试,但是GDB能够提供用户友好的调试命令。
OpenOCD提供了两种通信接口:GDB Server和Tcl(tcl可以理解为一种语言) 接口。前者是GDB的连接接口,后者可以用过telnet(telnet可以理解为一种TCP/IP服务的客户端)直连来操作。这两种通信接口都是基于 TCP/IP 协议栈的。但是在同一台电脑上,就只是一个端口向另一个端口的通信,IP都是本地IP:127.0.0.1或者等效地localhost。
使用OpenOCD:
1 | |
表示使用前面的硬件调试器,来与后面的芯片通信。也可以把这两个写到同一个.cfg文件中:
使用Find命令:
1 | |
使用绝对路径:
1 | |
这样使用时只调用这一个.cfg文件即可:
1 | |
这些配置文件官方一般已经给出,就在软件的安装目录下。Linux下的位置是:
1 | |
在这个 scripts 目录下,您会看到两个主要的子目录:
interface/: 存放各种调试器硬件的配置文件(如stlink.cfg,jlink.cfg,ftdi/目录下的文件等)。target/: 存放各种目标芯片(CPU 内核和 Flash)的配置文件(如stm32f4x.cfg,esp32.cfg,cortex_m.cfg等)。
用户只需要自己组合写一个组合的cfg文件即可。
GDB
软件应用层。使用步骤:
1. 启动 OpenOCD 服务端
首先,您需要让 OpenOCD 运行起来,以便它能够连接到您的 STM32 目标板,并监听 GDB 的连接请求(默认端口 3333)。
- 命令示例:
1 | |
状态: 终端会显示 OpenOCD 启动信息,确认它已连接到调试器,并开启了 GDB 远程调试端口 (
3333) 和 Telnet/Tcl 端口 (4444)。保持运行: 这个 OpenOCD 进程必须保持运行,不能关闭。您可能需要新开一个终端窗口来运行 GDB。
2. 启动 GDB 客户端
在新终端中,启动您的交叉编译 GDB 版本,并加载您编译好的程序文件。
- 加载程序文件: 启动 GDB,并指定您的
.elf格式的程序文件。这个文件包含了符号信息(变量名、函数名、行号等),这是 GDB 实现高级调试的关键。
1 | |
- GDB 提示符: GDB 启动后,您会看到
(gdb)提示符。
3. GDB 连接到 OpenOCD
这是最关键的一步。在 GDB 提示符下,您使用 target remote 命令连接到 OpenOCD 正在监听的端口。
- 连接命令:
1 | |
target remote: 告诉 GDB 连接一个远程目标。localhost: 因为 OpenOCD 和 GDB 运行在同一台电脑上,所以使用本地地址。3333: OpenOCD 默认的 GDB Server 端口。连接成功: OpenOCD 会响应 GDB 的连接,GDB 此时就可以开始向 OpenOCD 发送调试命令了。OpenOCD 会通过 ST-Link 将这些命令传递给 STM32 芯片。
4. 调试流程(GDB 常用命令)
连接成功后,您可以开始进行调试了。
| GDB 命令 | 功能描述 | 配合 OpenOCD 的效果 |
|---|---|---|
load |
将程序加载并烧录到芯片的 Flash 中。 | GDB 发送烧录命令,OpenOCD 执行 Tcl 脚本中的烧录操作。 |
break main |
在 main 函数设置断点。 |
GDB 发送断点设置命令,OpenOCD 在芯片上设置硬件/软件断点。 |
continue |
让程序从当前位置继续运行。 | OpenOCD 收到命令后,解除 CPU 停止状态。 |
step |
单步执行(进入函数内部)。 | GDB 协调 OpenOCD,执行一条指令后重新停止。 |
next |
单步跳过(不进入函数内部)。 | GDB 协调 OpenOCD,执行一条指令后重新停止。 |
info locals |
查看当前函数中的局部变量。 | GDB 从芯片内存中读取变量地址的值,并根据 .elf 符号表进行解析。 |
quit |
退出 GDB。 | 退出 GDB 客户端,但 OpenOCD 服务器可能仍在运行。 |
code 扩展
Code-OSS 上需要安装的所有扩展总结
C/C++ Extension Pack:这是一个扩展包,包含基础的 C/C++ 语言支持、智能感知、导航和调试支持。
Cortex-Debug:嵌入式调试的核心。它负责连接 GDB 和 OpenOCD,并提供可视化的调试界面(变量查看、断点设置等)。
Cortex-Debug需要在.vscode目录下提供一个launch.json文件:
(这个版本的配置文件很好,不需要自己写.cfg配置文件)
1 | |
CMake Tools:构建系统的核心。它负责管理您的
CMakeLists.txt,配置和执行您的make构建命令。DeviceTree(可选):如果您需要配置设备树文件,这个扩展提供语法高亮和支持。