gdb+openocd+stlink調(diào)試MCU

1.前言

當(dāng)我們遇到問題的時候,可以加打印信息追蹤流程,但更有效的方式是:調(diào)試。如果你使用的是keil,可以借助stlink或者jlink進(jìn)行調(diào)試。如果你是使用的gnu工具鏈,硬件支持jlink,那么我們可以借助gdb+jlink的方式進(jìn)行調(diào)試;如果我們硬件支持的是stlink,則可以借助gdb+openocd+stlink進(jìn)行調(diào)試。

2.使用GDB調(diào)試OneOS

GDB,全稱GNU Project debugger,是UNIX及UNIX-like下的強(qiáng)大調(diào)試工具,同時也支持對嵌入式系統(tǒng)進(jìn)行調(diào)試。對嵌入式系統(tǒng)進(jìn)行調(diào)試時,是以遠(yuǎn)程調(diào)試的方式進(jìn)行的,調(diào)試環(huán)境的軟硬件連接如下:

image

在上圖的結(jié)構(gòu)中,支持嵌入式芯片調(diào)試的GDB Server有多款,這里主要介紹OpenOCD和J-Link GDB Server。

  • J-Link GDB Server由SEGGER公司推出,僅支持使用Jlink作為調(diào)試適配器進(jìn)行調(diào)試

  • OpenOCD,全稱Open On-Chip Debugger,是一款針對嵌入式芯片調(diào)試的開源軟件,支持市面上大多數(shù)的調(diào)試適配器,例如stlink、DAPlink、Jlink等。OpenOCD支持GDB查看RTOS線程,OneOS已對其進(jìn)行了適配。使用OpenOCD作為GDB Server,可以查看OneOS所有線程的調(diào)用棧和棧上的臨時變量,對于調(diào)試,能提供更多的信息

3.gdb結(jié)合stlink調(diào)試

這里以萬耦開發(fā)板stm32f401-vet-oneos為例演示調(diào)試過程,由于OpenOCD配合Jlink使用時,需要將Jlink的驅(qū)動切換成通用usb驅(qū)動(OpenOCD不支持Jlink的原生驅(qū)動,如果需要,可以使用zadig這款開源軟件將Jlink驅(qū)動切換成WinUSB或libusb),為了方便起見,在使用OpenOCD調(diào)試時,調(diào)試適配器選擇stlink。

3.1 獲取OpenOCD

下載預(yù)編譯的Windows版本請點擊OpenOCD下載

3.2 目錄結(jié)構(gòu)

OpenOCD編譯后的二進(jìn)制文件目錄結(jié)構(gòu)如下:


image

3.2 添加環(huán)境變量

OPENOCD_BIN_PATH="D:\Program\openocd\bin"
OPENOCD_SCRIPT_PATH="D:\Program\openocd\share\openocd\scripts"

3.3 配置文件oneos.cfg

在stm32f401-vet-oneos工程目錄下創(chuàng)建配置文件oneos.cfg,文件內(nèi)容如下:

# this need match your debug adaptor and target device
source [find interface/stlink-v2.cfg]
source [find target/stm32f4x.cfg]

# config openocd support OneOS
$_TARGETNAME configure -rtos oneos

# halt target after gdb attached
$_TARGETNAME configure -event gdb-attach { halt }

3.4 啟動openOCD

在OneOS-Lite代碼根目錄運行OneOS-Cube,執(zhí)行如下命令:

%OPENOCD_BIN_PATH%\openocd.exe -c "gdb_port 5000" -s %OPENOCD_SCRIPT_PATH% -f .\projects\stm32f401-vet-oneos\oneos.cfg

運行成功后的界面如下,此時OpenOCD已配置完成:


image

4 啟動gdb調(diào)試

在OneOS-Lite代碼根目錄下運行OneOS-Cube,執(zhí)行如下命令運行GDB

arm-none-eabi-gdb.exe .\out\stm32f401-vet-oneos\oneos.elf

在GDB命令行交互界面中執(zhí)行如下命令連接GDB Server,其中:5000是GDB Server的tcp端口號,對應(yīng)上面OpenOCD運行時指定的gdb_port(如果使用J-Link GDB Server,則端口選擇上面顯示的2331)

target remote localhost:5000

連接成功后,GDB命令行交互界面如下


image

5.開始調(diào)試OneOS-Lite

  • 查看當(dāng)前線程調(diào)用棧和臨時變量
image
  • 查看所有正在運行的線程(J-Link GDB Server不支持此命令)
image
  • 切換到其他線程并查看調(diào)用棧與臨時變量(J-Link GDB Server不支持此命令)
image
  • 打斷點

b entry

  • 重新加載

load

更多的GDB用法,請查看官方文檔。

6.關(guān)注&&聯(lián)系

gitee: https://gitee.com/cmcc-oneos/OneOS-Lite

docs: https://oneos-lite.com/

摘自:https://os.iot.10086.cn/oneos-doc-2.0/components/debug/OpenOCD/

?著作權(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)容