RV-Link 仿真器製作與使用

什麼是仿真器?

常見的市售仿真器

完成工具鏈範例程式上傳後,若程式碼有問題,下一步就是除錯。

但要除錯除了要有軟體(請參考: MapleBoard GDB使用教學)之外,也需要有硬體的配合。

一般來說,模擬MCU(或CPU)的硬體裝置叫做”仿真器”(Emulator)。它可以是一個同樣型號的MCU,或者是特殊的FPGA(可程式化邏輯陣列)搭載與產品相同功能的電路,或者是經過特殊設計的晶片。但他們的目的都只有一個,就是讓使用者可以在仿真電路上模擬實際產品執行的狀態,並且傳送中斷訊號給目標版。

在所有的嵌入式系統中,JTAG是微處理器必備的連接埠。雖然JTAG會耗掉晶片腳位以及內部的電路面積,但是對於後續的開發與除錯而言,這點犧牲是絕對值得的,因為在系統韌體尚未建立好之前,除錯部分只能仰賴已經建立好的通訊協定才能夠除錯,而JTAG就是為此而生。

當然,GD32VF103CBT6也不例外,官方使用者手冊中有寫到,在第 10章的Debug中, GD32VF103CBT6與JTAG對應的腳位分別是PA15, PA14,PA13,PB4以及PB3,且這幾個腳位也可以透過軟體定義為通用輸出輸入埠(General Purpose Input Output)。

什麼是RV-Link?

RV-Link是一個與BlackMagic相似的開源仿真器專案,有鑑於市售的專業仿真器價格偏高,有一群開發者把GD32V系列MCU改造成能夠為同型號晶片除錯的仿真器,並命名為RV-Link。其命名概念與J-Link相似,就是一個電腦與開發晶片的溝通橋樑。

左圖是除錯時所有軟硬體組合在一起的架構。

我們可以看到最左邊藍色框框是我們的主機端,大部份是個人電腦,我們先在電腦上安裝GDB後,GDB會透過遠端通訊協議(可能是TCP/IP或其他協議)與OpenOCD連線,而OpenOCD再透過USB的傳輸協議與仿真器溝通,也就是圖中的Adapter。

有些仿真器會內建GDB Server,這樣就不需要另外對OpenOCD進行設定,也不用使用遠端通訊協定與GDB溝通。RV-Link就是屬於有內建GDB Server的仿真器。

有了仿真器,我們就可以透過JTAG的腳位定義與目標板進行連接與除錯。

RV-Link專案官方網站:https://gitee.com/zoomdy/RV-LINK(簡體中文)

下載RV-Link韌體

前往https://github.com/MapleBoard/mpb-rv-link

下載我們的RV-Link韌體,也可以使用終端指令:

$ git clone https://github.com/MapleBoard/mpb-rv-link

從Github下載。

下載完成後可以看到裡面有一個名為

“RV-Link_firmware_for_GD32_RISC-V_NanoPico.bin”

這是我們預先建置好的二進制檔案,趕時間的朋友可以直接把這個檔案透過dfu-util上傳到手上的GD32 RISC-V Nano/Pico上,上傳成功後RV-Link就可以馬上使用了。

Dfu-util安裝與使用教學:https://stage.mapleboard.org/dfu-util-installation-and-use-guide/

有興趣研究RV-Link運作原理的朋友,可以點開src資料夾,研究內部的程式碼。

建置與燒錄RV-Link韌體

下載好RV-Link的韌體後,我們可以使用MapleBoard工具鏈把韌體從原始碼建置。

首先將終端機工作路徑移動到剛剛下載的檔案路徑,並直接輸入:

$ make

就可以看到終端機吐出許多CC, AS, LD, COPY等等字樣,如同MapleBoard工具鏈範例使用教學一樣,最後也會顯示產生的執行檔檔案位置。

使用檔案總管開啟這個資料夾會發現,多了一個build資料夾與output資料夾,我們要上傳的檔案位於output資料夾內,名為

t-gd32+gd32vf103.bin

這個檔案。
我們在終端視窗中使用dfu-util:

dfu-util -d 28e9:0189 -a 0 --dfuse-address 0x08000000:leave -D ~/Mpb-RV-Link/output/t-gd32+gd32vf103.bin 

就可以將我們編譯好的RV-Link原始碼上傳到GD32 RISC-V Nano/Pico上了!!
若自己有調整過原始碼的內容,也別忘了重新建置在上傳,否則上傳的會是舊版的二進制碼唷。

若遇到錯誤,請先確認電腦使否已正確安裝MapleBoard工具鏈,並且將工具鏈指令新增到系統環境變數中。

使用RV-Link

上傳完成後,我們可以開始使用MapleBoard工具鏈的GDB來為目標板進行除錯,關於GDB的使用說明以及常用指令,請參考:

MapleBoard GDB使用教學