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)試目標(biāo)系統(tǒng)需要滿足以下條件:
    gdb-with-gdb-server.png
    1. PC端得運行GDB程序
      GDB程序可以在Termianl中運行掺出,也可以在IDE中運行GDB。GDB程序運行以后硕盹,用戶可以通過下GDB command去調(diào)試目標(biā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暫停,查看當(dāng)前CPU狀況
    查看當(dāng)前CPU狀況.png

    可以發(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可以解決)

  1. 不支持匯編程序調(diào)試
  2. 查看Registers狀況不方便
  3. 創(chuàng)建data breakpoint 不方便
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骇笔,一起剝皮案震驚了整個濱河市省店,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌笨触,老刑警劉巖懦傍,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異芦劣,居然都是意外死亡粗俱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門虚吟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寸认,“玉大人签财,你說我怎么就攤上這事∑” “怎么了唱蒸?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長烛愧。 經(jīng)常有香客問我油宜,道長,這世上最難降的妖魔是什么怜姿? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任慎冤,我火速辦了婚禮,結(jié)果婚禮上沧卢,老公的妹妹穿的比我還像新娘蚁堤。我一直安慰自己,他們只是感情好但狭,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布披诗。 她就那樣靜靜地躺著,像睡著了一般立磁。 火紅的嫁衣襯著肌膚如雪呈队。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天唱歧,我揣著相機與錄音宪摧,去河邊找鬼。 笑死颅崩,一個胖子當(dāng)著我的面吹牛几于,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沿后,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼沿彭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了尖滚?” 一聲冷哼從身側(cè)響起喉刘,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎漆弄,沒想到半個月后饱搏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡置逻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了备绽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片券坞。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡鬓催,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恨锚,到底是詐尸還是另有隱情宇驾,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布猴伶,位于F島的核電站课舍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏他挎。R本人自食惡果不足惜筝尾,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望办桨。 院中可真熱鬧筹淫,春花似錦、人聲如沸呢撞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殊霞。三九已至摧阅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绷蹲,已是汗流浹背棒卷。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瘸右,地道東北人娇跟。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像太颤,于是被迫代替她去往敵國和親苞俘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容