- 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)境,具體包含以下幾個部分:
- 調(diào)試所需基礎(chǔ)環(huán)境
- 運行OpenOCD
- 在VSCode下創(chuàng)建task運行OpenOCD(可選)
- 在VSCode下創(chuàng)建task編譯工程(可選)
- 在VSCode下添加GDB配置
- 在VSCode下使用GDB調(diào)試程序
調(diào)試所需基礎(chǔ)環(huán)境
-
程序是如何被調(diào)試的?
如下圖所示,使用GDB調(diào)試目標(biāo)系統(tǒng)需要滿足以下條件:
-
PC端得運行GDB程序
GDB程序可以在Termianl中運行掺出,也可以在IDE中運行GDB。GDB程序運行以后硕盹,用戶可以通過下GDB command去調(diào)試目標(biāo)系統(tǒng) -
PC端還得運行GDB Server
GDB Server起到承上啟下的作用:
1)通過TCP/IP Port與GDB程序通信滨砍,GDB Server接受來自GDB的命令
2)GDB Server 通過USB控制Debugger匆笤,讓Debugger執(zhí)行GDB命令對應(yīng)的動作 -
連接Debugger
Debugger收到GDB的命令忌卤,通過JTAG去Access CPU的Debug uint -
CPU的Debug uint
CPU中的Debug uint實現(xiàn)各種Debug event, 例如Instruction Breakpiont, Data Breakpoint扫夜,單步執(zhí)行等
-
PC端得運行GDB程序
-
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
- 在Project的tools文件夾下創(chuàng)建openocd_settings文件夾
- 復(fù)制{OpenOCD PATH}\openocd-0.10.0\tcl 下的 mem_helper.tcl 到 {Project PATH}\tools\openocd_settings下
- 復(fù)制{OpenOCD PATH}\openocd-0.10.0\tcl\target 下的 swj-dp.tcl 到 {Project PATH}\tools\openocd_settings下
- 復(fù)制{OpenOCD PATH}\openocd-0.10.0\tcl\interface 下的 stlink-v2-1.cfg 到 {Project PATH}\tools\openocd_settings下
- 復(fù)制{OpenOCD PATH}\openocd-0.10.0\tcl\target 下的 stm32f4x.cfg 到 {Project PATH}\tools\openocd_settings下
- 按照下圖修改{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]
- 把開發(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已經(jīng)成功運行棍厂,并且可以成功connect上ST-Link了望侈。
在VSCode下創(chuàng)建task運行OpenOCD
在每次debug之前首先得讓openocd成功運行并且connect上板子。但是勋桶,每次都要在Termianl輸入command實在太麻煩了,不如在創(chuàng)建個VSCode Task幫我們做這事:
- 在VSCode界面下侥猬,單擊“任務(wù)”例驹,選擇“配置任務(wù)”
- 在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",
}
],
}
-
按F1 顯示命令, 輸入 “Tasks: Run Task”,然后回車退唠,選擇“openocd”鹃锈,然后一路回車。即可讓VSCode 創(chuàng)建一個task去 運行openocd連接ST-Link了
在VSCode下創(chuàng)建task編譯工程(可選)
在每次debug之前可能需要重新編譯程序瞧预。但是屎债,每次都要在Termianl輸入make clean 和 make 實在太麻煩了仅政,不如在創(chuàng)建個VSCode Task幫我們做這事:
- 在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"])
- 在VSCode界面下,單擊“任務(wù)”盆驹,選擇“配置任務(wù)”
- 在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"
]
}
],
}
-
按F1 顯示命令圆丹, 輸入 “Tasks: Run Task”,然后回車,選擇“build”躯喇,然后一路回車辫封。即可讓VSCode 創(chuàng)建一個task去 編譯程序了
在VSCode下添加GDB配置
- 在VSCode界面下,單擊“調(diào)試”廉丽,選擇“添加配置”
- 在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
-
按下F5進入到VSCode Debug界面
-
在程序某處打上斷點,然后按F5繼續(xù)焦履,可以發(fā)現(xiàn)程序已經(jīng)運行到斷點處
- 在調(diào)試控制臺 輸入如下command 查看 core registers狀況
-exec info registers
- 在調(diào)試控制臺 輸入如下command 查看 PC位置和匯編Code
-exec disassemble
-
繼續(xù)運行拓劝,按F6暫停,查看當(dāng)前CPU狀況
可以發(fā)現(xiàn)當(dāng)前程序運行到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可以解決):
- 不支持匯編程序調(diào)試
- 查看Registers狀況不方便
- 創(chuàng)建data breakpoint 不方便