前言
這篇文章針對要使用RV-Link為GBD除錯的使用者撰寫
與網路上其他GDB使用介紹不同的是,許多GDB使用說明都是針對本機端程式在除錯
也就是說我在我的PC上執行一個C或Python程式,並且為這隻程式除錯。
但我們現在要為GD32 RISC-V Nano/Pico除錯,程式是執行在另一塊目標板上而不是PC本機。
在嵌入式系統除錯中,有兩樣軟體需要認識,分別是GDB以及OpenOCB。
GDB與OpenOCD的關係可以從下圖了解,OpenOCD負責提供PC端與除錯器端的連接性,而GDB則是藉由OpenOCD提供的界面來實做除錯軟體的功能,如中斷,記憶體存取等等。
除錯器與GDB的介紹可以參考深入淺出GD32 RISC-V Nano/Pico – (七) RV-Link 仿真器製作與使用 這篇文章。
當我們依照這篇文章建製好工具練後,GDB與OpenOCd都已經被安裝好,我們只需要下指令就可以使用。
硬體連接
PA15 -> PA15
PA14 ->PA14
PA13 ->PA13
PB3 ->PB3
別忘了電源
3V3 -> 3V3
GND -> GND
軟體執行
先把要除錯的軟體上傳到目標板上
移動到專案資料夾的src目錄底下,將目標板進入dfu模式後,執行
make dfu
接下來會進行標準工具鍊建製,直到dfu-util出現,會要求輸入使用者密碼。
最後會有上傳進度條,達到100%表示上傳成功。
雖然有Error 74,但這不影響我們的程式執行。
上傳好後,把目前工作目錄移動make指令的輸出目錄build下。
GDB是需要在專案輸出目錄下運行才能正確執行的。
我們拿mpb-toolchain-example工具鍊範例作為示範,如果你想為其他的程式除錯,也可以如法炮製這些步驟。
cd build
接下來叫出riscv32-mapleboard-elf-gdb 程式,並且將剛剛製作的elf檔案匯到gdb中
riscv-32-mapleboard-elf-gdb gd32vf103.elf
發現終端機前面多一個 (gdb) 就是現在正在執行gdb應用程式,而現在輸入的指令是給gdb而不是給linux的終端機。
接下來,把TypeC連接線接到RV-Link上,並打開令一個終端視窗檢查RV-Link是掛載在那一個device上
ls /dev/tty*
把RV-link拔掉 看那一個不見就知道他是那一個(好像繞口令XD
一般預設的是ttyACM0
接下來回到GDB終端機,輸入
target remote /dev/ttyACM0
接著將剛剛建制好的gd32vf103.elf檔載入RV-link中
load gd32vf103.elf
到這一步為止就成功建立目標板與RV-link除錯器的連線。
常用GDB指令介紹
1. list 或 l :列出10行程式,在視窗前面之數字是程式行數,可用於設置中斷。
list main
列出main為首的10行程式碼,繼續按Enter可繼續顯示。
l 10
從目前執行的程式碼第10行開始顯示前後10行程式碼
2. break 或 b :設置中斷點
break main
在main設置中斷點
b 50
在第50行設置中斷點 [ gd_eval_led_init(LED3) ]
3. info break : 顯示各個中斷點的詳細資訊
info b
4. watch : 查看變數
watch x
查看x變數,會顯示就的數值與新的數值,同時在建立watch時也會同時建立中斷。
5. continue 或 c : 繼續執行程式
6. next 或 n : 單步執行程式
7. print 或 p : 列出變數值,與watch不同的是print不會在變數改變處設定中斷。
8. reverse continue 或 rc : 反向單步執行 ***嵌入式GDB不支援
題外,許多GDB可以使用layout
指令圖形話的觀看執行狀況,但現在riscv工具練似乎還不支援,因此使用上較不方便。