VSCode下 搭建 ARM Cortex-M 開發(fā)環(huán)境 -- Part 2 調(diào)試環(huán)境搭建

  • Part 0 開發(fā)工具安裝
  • Part 1 編譯環(huán)境搭建
  • Part 2 調(diào)試環(huán)境搭建

VSCode下 搭建 ARM Cortex-M 開發(fā)環(huán)境 -- Part 2 調(diào)試環(huán)境搭建

前言

本章旨在記錄如何在VSCode搭建DEBUG環(huán)境,具體包含以下幾個部分:

  1. 調(diào)試所需基礎(chǔ)環(huán)境
  2. 運行OpenOCD
  3. 在VSCode下創(chuàng)建task運行OpenOCD(可選)
  4. 在VSCode下創(chuàng)建task編譯工程(可選)
  5. 在VSCode下添加GDB配置
  6. 在VSCode下使用GDB調(diào)試程序

調(diào)試所需基礎(chǔ)環(huán)境

  • 程序是如何被調(diào)試的?
    如下圖所示,使用GDB調(diào)試目標系統(tǒng)需要滿足以下條件:
    gdb-with-gdb-server.png
    1. PC端得運行GDB程序
      GDB程序可以在Termianl中運行,也可以在IDE中運行GDB。GDB程序運行以后,用戶可以通過下GDB command去調(diào)試目標系統(tǒng)
    2. PC端還得運行GDB Server
      GDB Server起到承上啟下的作用:
      1)通過TCP/IP Port與GDB程序通信,GDB Server接受來自GDB的命令
      2)GDB Server 通過USB控制Debugger,讓Debugger執(zhí)行GDB命令對應(yīng)的動作
    3. 連接Debugger
      Debugger收到GDB的命令,通過JTAG去Access CPU的Debug uint
    4. CPU的Debug uint
      CPU中的Debug uint實現(xiàn)各種Debug event, 例如Instruction Breakpiont, Data Breakpoint,單步執(zhí)行等
  • VSCode下debug架構(gòu)
    VSCode下debug架構(gòu)與上圖中各個組件一一對應(yīng)的話:
    • VSCode 對應(yīng)著 IDE
    • GDB 對應(yīng)著 arm-none-eabi-gdb
    • GDB Server 對應(yīng)著 OpenOCD
    • Debug Probe 對應(yīng)著 ST-Link
    • Microcontroller 對應(yīng)著 STM32F429 chip

運行OpenOCD

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

  1. 在Project的tools文件夾下創(chuàng)建openocd_settings文件夾
    創(chuàng)建openocd_settings文件夾.png
  2. 復(fù)制{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. 復(fù)制{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. 復(fù)制{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. 復(fù)制{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. 把開發(fā)板連上電腦,在VSCode的Terminal下執(zhí)行如下命令, 即可發(fā)現(xiàn)openocd已經(jīng)成功connect上ST-link了
openocd -f tools/openocd_settings/stlink-v2-1.cfg -f tools/openocd_settings/stm32f4x.cfg

openocd connect ST-link.png

至此,openocd已經(jīng)成功運行,并且可以成功connect上ST-Link了。

在VSCode下創(chuàng)建task運行OpenOCD

在每次debug之前首先得讓openocd成功運行并且connect上板子。但是,每次都要在Termianl輸入command實在太麻煩了,不如在創(chuàng)建個VSCode Task幫我們做這事:

  1. 在VSCode界面下,單擊“任務(wù)”,選擇“配置任務(wù)”
  2. 在task.json下 創(chuàng)建一個名為 "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 創(chuàng)建一個task去 運行openocd連接ST-Link了


    運行openocd task.png

在VSCode下創(chuàng)建task編譯工程(可選)

在每次debug之前可能需要重新編譯程序。但是,每次都要在Termianl輸入make clean 和 make 實在太麻煩了,不如在創(chuàng)建個VSCode Task幫我們做這事:

  1. 在tools文件夾下創(chuàng)建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界面下,單擊“任務(wù)”,選擇“配置任務(wù)”
  2. 在task.json下 創(chuàng)建一個名為 "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 創(chuàng)建一個task去 編譯程序了


    運行build task.png

在VSCode下添加GDB配置

  1. 在VSCode界面下,單擊“調(diào)試”,選擇“添加配置”
  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配置中有設(shè)置 preLaunchTask 為 “build”(必須與前面創(chuàng)建的build task同名)。這樣做的目的是為了: 每次debug時都會重新Build Project。如果每次Debug時不需要重新Build Project, mask掉這行即可

在VSCode下使用GDB調(diào)試程序

上面步驟完成以后,我們可以正式開始調(diào)試前一章節(jié)編譯出來的可執(zhí)行文件了。

  • 運行"openocd" task, 確保openocd成功運行并且連接上ST-Link
    運行"openocd" task.png
  • 按下F5進入到VSCode Debug界面
    進入Debug界面.png
  • 在程序某處打上斷點,然后按F5繼續(xù),可以發(fā)現(xiàn)程序已經(jīng)運行到斷點處
    打斷點.png
  • 在調(diào)試控制臺 輸入如下command 查看 core registers狀況
-exec info registers
查看 core registers狀況.png
  • 在調(diào)試控制臺 輸入如下command 查看 PC位置和匯編Code
-exec disassemble
查看PC位置和匯編Code.png
  • 繼續(xù)運行,按F6暫停,查看當前CPU狀況
    查看當前CPU狀況.png

    可以發(fā)現(xiàn)當前程序運行到prvCheckTasksWaitingTermination function里面
  • 其他功能
    單步調(diào)試,重啟,查看變量,調(diào)用堆棧 等功能都是可以工作的。大家自己嘗試一下。
    Note: 單步調(diào)試,單步跳過,單步跳出這些功能是C Code為單位的,不是以ASM Code為單位的

本章總結(jié)

至此,我們已經(jīng)成功在VSCode下搭建調(diào)試環(huán)境了,可以愉快使用GDB調(diào)試板子了。
可惜,目前在VSCode調(diào)試還有以下缺陷(這些缺陷通過GDB command可以解決)

  1. 不支持匯編程序調(diào)試
  2. 查看Registers狀況不方便
  3. 創(chuàng)建data breakpoint 不方便
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容