論壇總覽 GD32 RISC-V 論壇 開始使用GD32 RISC-V Nano/Pico 深入淺出GD32 RISC-V Nano/Pico – (六) MapleBoard GDB使用教學

標籤: ,

正在檢視 1 篇文章 - 1 至 1 (共計 1 篇)
  • 作者
    文章
  • #585
    johnson
    管理員
      @johnson

      什麼是GDB?為什需要它?

      安裝完Mapleboard工具鏈,

      完成MapleBoard工具鏈範例建置,

      以及下載好dfu-util後,就可以開始為我們的GD32 RISC-V Nano/Pico除錯。

      GDB是GNU除錯器 (GNU Debugger)的簡稱,是GNU專案中的標準除錯器。

      在嵌入式系統以及軟體開發中,了解自己撰寫的應用程式實際上執行的狀況在除錯時是非常重要的,理想的狀況當然是自己撰寫的程式萬無一失,把所有可能考慮到的狀況都考慮進去。

      但是現實世界並不如想像中的美好,常常出現許多在設計時忽略的例外狀況,這時候就會有臭蟲(Bug)出現,要如何解決Bug就有賴各位軟體工程師的智慧,而抓出Bug的工具就是GDB。

      GDB是自由軟體基金會(Free Software Foundation)所發行的軟體,是GNU工具鏈的其中一環,因此我們的工具鏈當然也具備GDB軟體,但與一般的GDB不同的是,MapleBoard工具鏈式針對GD32V的除錯進行開發,使用方法同時也保留傳統GDB的指令。

      GDB不僅提供單步執行程式(single step)的功能,同時也可以設置中斷點(Breakpoint),讀取暫存器(Register)數值,寫入暫存器數值,顯示變數值等等。對於嵌入式系統開發的除錯是非常重要的。

      使用MapleBoard工具鏈的GDB

      首先請先將MapleBoard工具鏈安裝到電腦上:MapleBoard RISC-V工具鏈建置與使用

      安裝完成後,只需要輸入指令:

      $ riecv32-mapleboard-elf-gdb --help

      就會顯示工具鏈的幫助畫面。
      由於GDB功能強大,在這篇文章中只會列出常用的指令,若想要完整學習GDB的指令與參數,請見:GDB線上文件

      RV-Link硬體仿真器

      在使用GDB為GD32 RISC-V Nano/Pico除錯之前,我們還需要有一個硬體界面來把電腦的資料轉換成JTAG的除錯資料。

      因此我們推薦使用者使用RV-Link 作為仿真器(Emulator)

      只需要一塊GD32 RISC-V Pico開發板,燒錄好RV-Link的韌體後,就搖身一變成為除錯器,相關教學請參考:RV-Link 仿真器製作與使用教學

      若已經擁有如J-Link ,ST-Link等更高階仿真器的使用者,則可以直接沿用符合J-TAG(Joint Test Action Group)規範的仿真器為GD32V系列CPU進行除錯。

      RV-Link與目標板連接

      在GD32VF103CBT6的資料手冊中,JTAG的腳位與GPIO的腳位對應如下:

      PA15 -> JTDI
      PA14 ->JTCK
      PA13 ->JTMS
      PB4   ->NJTRST (此腳位使用RV-Link時可以不連接)
      PB3   ->JTDO

      使用時請將RV-Link與待測開發板連接如下:
      JDIO  -> JDIO
      JTDI  -> JTDI
      JTCK -> JTCK
      JTMS -> JTMS
      3V3     -> 3V3
      GND   -> GND

      GDB-載入elf檔案

      首先請先將終端機的工作目錄移動到與可執行碼相同的資料夾,如Mpb-toolchain-Example/src/build/
      接著在終端視窗輸入:$ riscv32-mapleboard-elf-gdb gd32vf103.elf
      將.elf檔案載入到GDB裡,這樣GDB才能夠把待測板上的變數表(Variable table)轉換成我們看得懂的形式。

      GDB-硬體仿真器掛載

      下一步我們要把RV-Link與GDB進行掛載,我們現在有RV-Link硬體與GDB軟體,但兩個沒有互相連接的話就如同不完整的拼圖,無法發揮作用。

      請先透過USB連接線將RV-Link與電腦連接好後,新開一個終端機,並在視窗中輸入:

      $ ls /dev/tty*
      這個指令會列出所有與電腦連接的裝置編號。RV-Link一般會是ttyACM0,但若電腦有連接其他設備,裝置編號可能會不一樣。

      確認RV-Link的裝置編號後,回到GDB的終端機視窗,輸入:

      (gdb) target remote /dev/ttyACM0
      前面(gdb)是指gdb程式,指令輸入後面的target即可。
      這時候畫面會顯示:

      Remote debugging using /dev/ttyACM0
      就表示GDB與RV-Link連線在一起了!

      GDB-上傳elf檔到目標板

      下一步我們需要把要上傳到目標板的elf程式碼透過RV-Link上傳。 在終端視窗中輸入:(gdb) load gd32vf103.elf
      輸入完成後,終端視窗會顯示載入的elf檔案細節,以及除錯器的資料傳輸速度。

      GDB-設置中斷點

      下一步我們可以在程式碼的任意位置設置中斷點,指令很簡單:(gdb) b main
      ‘b’指的是break,同時也是指breakpoint的意思。 GDB的指令可以任意縮寫成最小字元,只要不合其他命令重複即可,但這常常令人搞混,因此也可以按兩下Tab鍵來列出指令。 ‘b’後面接的參數就是要設中斷的函數名稱,在這裡是主程式”main”,以Mapleboard工具鏈範例程式為例,你也可以把中斷點設定在”gd_eval_led_on”。 在終端機中輸入(gdb) d
      可以把所有中斷點刪除, ‘d’代表delete的意思。

      GDB-單步執行

      想要讓程式碼單步執行,前提是程式碼已經被中斷,請在終端視窗中輸入:

      (gdb) n
      ‘n’代表”next”的意思。

      在GDB中,指令只需要輸入一次,下一次直接按下Enter,GDB就會重複上次的指令執行。

      使用單步執行的好處是讓開發者可以逐行執行程式碼,同時監控開發板的腳位狀況,讓除錯更方便。

      GDB-查看暫存器數值

      進階一點的開發者會需要監控MCU內部的暫存器數值,這時候我們以輸入:

      (gdb) info registers
      GDB會列出所有能夠被讀取的暫存器數值,並且排版好給我們看。
      左圖是GD32VF103CBT6的暫存器數值。

      暫存器對應到的功能以及旗標(Flags)可以參考GD32VF103CBT6的資料手冊。

      GDB-繼續,中斷執行與離開

      在進入中斷點後,GDB會停止程式運作,讓使用者可以查看進入中斷點時的機器狀態,若不想使用單步執行,而是分析每一次進入中斷點的機器狀況,可以在終端視窗中輸入:(gdb) c
      ‘c’代表continue的意思,就是讓程式碼繼續執行直到下一次進入中斷點時,GDB再將程式中斷。 若你不小心刪除中斷點,且又讓程式繼續執行,那GDB會一直等待目標中斷。 這時候終端視窗界面不管輸入什麼都不會有動作,除了”Ctrl+C”強置中斷。 Ctrl+C會強置把正在執行中的程式碼中斷在你按下鍵盤的時候,所以中斷的位置並不固定,但我們可以取回對GDB的控制權,這時”(gdb)”再次出現在終端視窗中,我們就可以再為它設置新的中斷點。 若最後程式除錯完畢,要離開GDB只需要在終端視窗中輸入:(gdb) quit
      就可以跳出GDB回到本來的終端機界面。

    正在檢視 1 篇文章 - 1 至 1 (共計 1 篇)
    • 需要以回覆此篇主題...