VSCode下 搭建 ARM Cortex-M 开发环境 -- Part 2 调试环境搭建

  • Part 0 开发工具安装
  • Part 1 编译环境搭建
  • Part 2 调试环境搭建

VSCode下 搭建 ARM Cortex-M 开发环境 -- Part 2 调试环境搭建

前言

本章旨在记录如何在VSCode搭建DEBUG环境,具体包含以下几个部分:

  1. 调试所需基础环境
  2. 运行OpenOCD
  3. 在VSCode下创建task运行OpenOCD(可选)
  4. 在VSCode下创建task编译工程(可选)
  5. 在VSCode下添加GDB配置
  6. 在VSCode下使用GDB调试程序

调试所需基础环境

  • 程序是如何被调试的?
    如下图所示,使用GDB调试目标系统需要满足以下条件:
    gdb-with-gdb-server.png
    1. PC端得运行GDB程序
      GDB程序可以在Termianl中运行,也可以在IDE中运行GDB。GDB程序运行以后,用户可以通过下GDB command去调试目标系统
    2. PC端还得运行GDB Server
      GDB Server起到承上启下的作用:
      1)通过TCP/IP Port与GDB程序通信,GDB Server接受来自GDB的命令
      2)GDB Server 通过USB控制Debugger,让Debugger执行GDB命令对应的动作
    3. 连接Debugger
      Debugger收到GDB的命令,通过JTAG去Access CPU的Debug uint
    4. CPU的Debug uint
      CPU中的Debug uint实现各种Debug event, 例如Instruction Breakpiont, Data Breakpoint,单步执行等
  • VSCode下debug架构
    VSCode下debug架构与上图中各个组件一一对应的话:
    • VSCode 对应着 IDE
    • GDB 对应着 arm-none-eabi-gdb
    • GDB Server 对应着 OpenOCD
    • Debug Probe 对应着 ST-Link
    • Microcontroller 对应着 STM32F429 chip

运行OpenOCD

运行OpenOCD是为了 在PC上有GDB server在运行。 有了GDB Server,arm-none-eabi-gdb才能够控制ST-Link

  1. 在Project的tools文件夹下创建openocd_settings文件夹
    创建openocd_settings文件夹.png
  2. 复制{OpenOCD PATH}\openocd-0.10.0\tcl 下的 mem_helper.tcl{Project PATH}\tools\openocd_settings
    mem_helper.tcl.png

    {Project PATH}\tools\openocd_settings下mem_helper.tcl.png
  3. 复制{OpenOCD PATH}\openocd-0.10.0\tcl\target 下的 swj-dp.tcl{Project PATH}\tools\openocd_settings
    swj-dp.tcl.png

    {Project PATH}\tools\openocd_settings\swj-dp.tcl.png
  4. 复制{OpenOCD PATH}\openocd-0.10.0\tcl\interface 下的 stlink-v2-1.cfg{Project PATH}\tools\openocd_settings
    stlink-v2-1.cfg.png

    tools\openocd_settings\stlink-v2-1.cfg.png
  5. 复制{OpenOCD PATH}\openocd-0.10.0\tcl\target 下的 stm32f4x.cfg{Project PATH}\tools\openocd_settings
    stm32f4x.cfg.png

    tools\openocd_settings\stm32f4x.cfg.png
  6. 按照下图修改{Project PATH}\tools\openocd_settings\stm32f4x.cfg
    source [find target/swj-dp.tcl] 替换为 source [find tools/openocd_settings/swj-dp.tcl]
    source [find mem_helper.tcl] 替换为 source [find tools/openocd_settings/mem_helper.tcl]
    修改stm32f4x.cfg.png
  7. 把开发板连上电脑,在VSCode的Terminal下执行如下命令, 即可发现openocd已经成功connect上ST-link了
openocd -f tools/openocd_settings/stlink-v2-1.cfg -f tools/openocd_settings/stm32f4x.cfg

openocd connect ST-link.png

至此,openocd已经成功运行,并且可以成功connect上ST-Link了

在VSCode下创建task运行OpenOCD

在每次debug之前首先得让openocd成功运行并且connect上板子。但是,每次都要在Termianl输入command实在太麻烦了,不如在创建个VSCode Task帮我们做这事:

  1. 在VSCode界面下,单击“任务”,选择“配置任务”
  2. 在task.json下 创建一个名为 "openocd" 的 task, 代码如下:
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "openocd",
            "type": "shell",
            "command": "openocd -f tools/openocd_settings/stlink-v2-1.cfg -f tools/openocd_settings/stm32f4x.cfg",
        }
    ],
}
  1. 按F1 显示命令, 输入 “Tasks: Run Task”,然后回车,选择“openocd”,然后一路回车。即可让VSCode 创建一个task去 运行openocd连接ST-Link了


    运行openocd task.png

在VSCode下创建task编译工程(可选)

在每次debug之前可能需要重新编译程序。但是,每次都要在Termianl输入make clean 和 make 实在太麻烦了,不如在创建个VSCode Task帮我们做这事:

  1. 在tools文件夹下创建build.py
import subprocess
import os

if __name__ == '__main__':
    # subprocess.run(["pwd"])
    subprocess.run(["echo", "building...."])
    subprocess.run(["make", "clean"])
    subprocess.run(["make"])
build.py.png
  1. 在VSCode界面下,单击“任务”,选择“配置任务”
  2. 在task.json下 创建一个名为 "build" 的 task, 代码如下:
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "openocd",
            "type": "shell",
            "command": "openocd -f tools/openocd_settings/stlink-v2-1.cfg -f tools/openocd_settings/stm32f4x.cfg",
        },
        {
            "label": "build",
            "type": "shell",
            "command": "python",
            "args": [
                "tools/build.py"
            ]            
        }
    ],
}
  1. 按F1 显示命令, 输入 “Tasks: Run Task”,然后回车,选择“build”,然后一路回车。即可让VSCode 创建一个task去 编译程序了


    运行build task.png

在VSCode下添加GDB配置

  1. 在VSCode界面下,单击“调试”,选择“添加配置”
  2. 在launch.json 添加 如下ARM Debug配置
{
    "version": "0.2.0",
    "configurations": [
        
        {
            "name": "ARM Debug",
            "type": "cppdbg",
            "request": "launch",
            "miDebuggerPath": "E:\\ARM\\gcc-arm-none-eabi\\bin\\arm-none-eabi-gdb.exe",
            "targetArchitecture": "arm",
            "program": "${workspaceRoot}\\out\\HAL_demo.elf",
            "setupCommands": [
                {
                    "text": "file 'E:/STMicroelectronics/workspace/stm32f429/projects/HAL_demo/out/HAL_demo.elf'"
                },
                {
                    "text": "target remote localhost:3333"
                },
                {
                    "text": "monitor reset"
                },
                {
                    "text": "monitor halt"
                },
                {
                    "text": "load"
                }
            ],
            "preLaunchTask": "build",
            "launchCompleteCommand": "None",
            "externalConsole": true,
            "cwd": "${workspaceRoot}"
        }
    ]
}

注意事项:

  • "miDebuggerPath": "E:\ARM\gcc-arm-none-eabi\bin\arm-none-eabi-gdb.exe" 替换为 您本地的 arm-none-eabi-gdb.exe路径
  • "program": "${workspaceRoot}\out\HAL_demo.elf" 替换为 您Project的elf文件名称和路径
  • "file 'E:/STMicroelectronics/workspace/stm32f429/projects/HAL_demo/out/HAL_demo.elf'" 替换为 您Project的elf文件名称和路径
  • ARM Debug配置中有设置 preLaunchTask 为 “build”(必须与前面创建的build task同名)。这样做的目的是为了: 每次debug时都会重新Build Project。如果每次Debug时不需要重新Build Project, mask掉这行即可

在VSCode下使用GDB调试程序

上面步骤完成以后,我们可以正式开始调试前一章节编译出来的可执行文件了。

  • 运行"openocd" task, 确保openocd成功运行并且连接上ST-Link
    运行"openocd" task.png
  • 按下F5进入到VSCode Debug界面
    进入Debug界面.png
  • 在程序某处打上断点,然后按F5继续,可以发现程序已经运行到断点处
    打断点.png
  • 在调试控制台 输入如下command 查看 core registers状况
-exec info registers
查看 core registers状况.png
  • 在调试控制台 输入如下command 查看 PC位置和汇编Code
-exec disassemble
查看PC位置和汇编Code.png
  • 继续运行,按F6暂停,查看当前CPU状况
    查看当前CPU状况.png

    可以发现当前程序运行到prvCheckTasksWaitingTermination function里面
  • 其他功能
    单步调试,重启,查看变量,调用堆栈 等功能都是可以工作的。大家自己尝试一下。
    Note: 单步调试,单步跳过,单步跳出这些功能是C Code为单位的,不是以ASM Code为单位的

本章总结

至此,我们已经成功在VSCode下搭建调试环境了,可以愉快使用GDB调试板子了。
可惜,目前在VSCode调试还有以下缺陷(这些缺陷通过GDB command可以解决)

  1. 不支持汇编程序调试
  2. 查看Registers状况不方便
  3. 创建data breakpoint 不方便

推荐阅读更多精彩内容