MapleBoard RISC-V 工具鏈建置與使用

為什麼我們需要工具鏈?

於 Mpb-toolchain-Example/src 下的Makefile內容

在嵌入式系統的開發中,工具鏈(toolchain)是銜接主機端(Host)以及目標板(Target)的重要橋樑。

我們在主機端將應用程式(Application,AP)撰寫好後,可能是LED閃爍程式,或者進階一點的LCD顯示程式,需要有一個工具將我們撰寫的高階語言(如C語言),轉換成為處理機能夠讀懂的機械碼(Machine Code),而擔任這個重責大任的就是工具鏈。

工具鏈首先將C程式碼的註解先去除(Preprocessing),產生沒有註解的C檔案,再將這個檔案與相依檔案(如gd32vf103.h)進行連結後,再依照不同目標平台架構(GD32是RISC-V)編譯成物件碼(Object Code)。

這時候會產生如同”entry.o”這種檔案,工具鏈會再將物件碼與標準的C函式庫(或者不同硬體架構的標準函式庫)在進行連結(Loading)。

由於標準含式庫在專案開發的過程中不會有所改變,因此可以直接用物件碼與AP做連結即可。

最後,把連結好的程式碼輸出成ELF格式(Exectuable and Loadable Formate),如gd32vf103.elf。再將ELF檔案轉換成十六進制(.hex)以及二進制(.bin)檔案,並利用上傳工具將機器馬上傳到目標板上。

認識工具鏈

工具鏈一般包含

  • 編譯器
  • 連結器 (將原始碼/目的碼轉換成可執行程式檔)
  • 函式庫 (提供與作業系統之間的介面)
  • 除錯器

這些工具一般一個接一個地運用,上一個工具的輸出即是下一個工具的輸入,因此得名,但這幾種工具也可以獨立不相依得進行使用。

其中最知名的工具鏈就是GNU計畫的GNU toolchain

我們的Mpb-toolchain也是源自於GNU專案衍伸出來的RISC-V GNU toolchain 並進行改寫的工具鏈專案。

下載工具鏈

前往 https://github.com/MapleBoard/mpb-toolchain下載我們的Mapleboard toolchain 以利GD32 RISC-V Nano/Pico的開發。

首先建立一個資料夾(或者移動到任意資料夾)把整個原始碼下載下來。

在終端視窗輸入:

$ git clone https://github.com/MapleBoard/mpb-toolchain.git
$ cd mpb-toolchain

可以看到一個名為mpb-toolchain的資料夾內包含所有工具鏈必要檔案。

建置工具鏈

下載好工具鏈後,請將終端視窗移動到riscv-gnu-toolchain資料夾內。

先安裝工具鏈鎖需要的相依套件:

$ sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev

接著,建立一個build資料夾,並對工具鏈做基本的設定:

$ mkdir build
$ ./configure --prefix=`pwd`/build --with-arch=rv32imac --with-abi=ilp32

接下來安裝工具鏈:

$ sudo make -j8

安裝過程耗時較長,可以在最後執行make指令的時候增加”-j8″的參數來使用多線程進行建置。

若日後想要更新工具鏈的相依模組,可以輸入:

$ git submodule foreach --recursive git pull  

使用工具鏈-設定環境變數

建置完成後,我們需要把工具鏈的可執行檔路徑加入到系統的環境變數,也就是$PATH中。

我們要讓電腦重開機依然以使用工具鏈的指令,因此需要修改系統的.bash_rc檔案。

先將終端機工作目錄移動到使用者目錄底下,並用nano文字編輯器修改(亦可使用vi或vim編輯器):

$ cd ~
$ nano .bashrc

進入如左圖的編輯畫面後,直接在最底端添加:

export PATH=~/path_to_your_directory/riscv-gnu-toolchain/build/bin/:"$PATH"

其中PATH=~/後面的路徑要依照使用者的命名而定,這裡只是舉例。

新增完後,按下Ctrl+O(英文字母 歐)儲存,再按下Ctrl+X離開。
在終端機輸入

$ . .bashrc

可重新載入.bashrc的設定檔
輸入

$ echo $PATH

查看我們剛剛輸入的路徑是否已經寫入到系統環境變數。

使用工具鏈-使用指令

將指令加入系統環境變數後,只要在命令視窗中輸入”riscv32-mapleboard-elf”並按兩下”Tab”鍵,就會自動列出所有指令。

這些指令中包含常見的gcc(編譯器), ar(組譯器), ld(連結器), objcopy(物件碼轉換器) 等等工具鏈必備的軟體。

到這一步我們就可以使用終端視窗編譯我們的程式碼,只需要依照順序將原始碼進行編譯,組譯,連結,轉檔,最後在利用特定的上傳工具上傳到目標板上即可。

但是這說還是很籠統,因此我們提供了一個工具鏈使用的範例程式供大家下載使用。

關於工具鏈的範例以及範例的使用方法,請繼續閱讀

MapleBoard 工具鏈範例使用教學