RISC-V 想玩起來,第一步,可以先準備軟體環境。
官方倉庫的 GNU 工具鏈 riscv-gnu-toolchain 裡,有 Spike pk 或 QEMU 的模擬環境,可以一次性把編譯和模擬環境都準備好。
準備工具鏈
前提
如果是 Windows / WSL2 環境,在獲取程式碼前,請確認工作目錄屬性是區分大小寫的。因為 glibc 只能在區分大小寫的檔案系統上編譯。不然,編譯時會遇到連結錯誤,如 undefined reference to 'rtld_errno'
。
# 以管理員許可權開啟 Windows 終端
# https://github.com/microsoft/terminal
# 查詢工作目錄區分大小寫屬性
fsutil.exe file queryCaseSensitiveInfo D:\wslcodes
已禁用目錄 D:\wslcodes 的區分大小寫屬性。
# 啟用工作目錄區分大小寫屬性
fsutil.exe file setCaseSensitiveInfo D:\wslcodes enable
已啟用目錄 D:\wslcodes 的區分大小寫屬性。
如果是 Linux / Ubuntu 環境,那已經是區分大小寫的了。
獲取程式碼
git clone --depth 1 -b master https://github.com/riscv-collab/riscv-gnu-toolchain.git
cd riscv-gnu-toolchain
git submodule update --init --recursive
如果不用 QEMU 模擬,可以刪除該子模組,加快下載:
git rm --cached qemu
git submodule update --init --recursive
編譯安裝
Ubuntu 20 上的編譯過程。其他作業系統,請見工具鏈的 README。
# 依賴
sudo apt update -y
sudo apt install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev ninja-build -y
# for spike
sudo apt install device-tree-compiler -y
# 配置
# --enable-multilib 支援 32-bit 與 64-bit,預設 64-bit
# --with-sim=spike 帶上 Spike 模擬器 (only support rv64* bare-metal/elf toolchain)
./configure --prefix=/opt/riscv --enable-multilib --with-sim=spike
# 編譯
sudo make linux build-sim
# 環境
# 可以進 ~/.bashrc,但影響系統 gcc 環境
export RISCV_HOME=/opt/riscv
export PATH=$RISCV_HOME/bin:$RISCV_HOME/riscv64-unknown-elf/bin:$PATH
# 測試
riscv64-unknown-elf-gcc --version
spike -h
編譯程式並執行
編寫檔案 hello.c
:
#include <stdio.h>
int main(int argc, char const *argv[]) {
printf("hello riscv\n");
return 0;
}
編譯程式:
riscv64-unknown-elf-gcc hello.c -o hello
Spike 執行:
# 預設 64-bit,故用 pk64,另有 pk32
$ spike $(which pk64) hello
bbl loader
hello riscv
# spike debug 執行
$ spike -d $(which pk64) hello
: h
更多資料
GoCoding 個人實踐的經驗分享,可關注公眾號!