RISC-V开发环境搭建

Creative Commons
本作品采用知识共享署名

本文记录ubuntu下RISC-V开发环境的搭建过程,主要针对嵌入式系统。

依赖安装

1
2
3
sudo apt update
sudo apt upgrade
sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev libusb-1.0-0-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev device-tree-compiler pkg-config libexpat-dev dkms libnewlib-dev

GNU Tool

当中包含了gcc, newlib, glibc,binutils,gdb,qemu, DejaGnu

下载

1
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain

编译

编译工具链

risc-v可以编译为linux(glibc)或者newlib,下面列出的命令是编译成Newlib为32bit嵌入式系统使用

1
2
3
cd risc-gnu-toolchain/
./configure --prefix=/home/frank/opt/riscv/gnu-toolchain-32/ --with-arch=rv32imc --with-abi=ilp32
make

该编译过程将会使用newlib编译gcc/gdb/binutils,对于–with-abi还可以选取rv32i, rv32iac, rv32im, rv32imac,rv32imacf,对于–with-abi可以选取ilp32,ilp32f,ilp32d, 编译完成后的工具链会被放在home/frank/opt/riscv/gnu-toolchain-32/下

编译qemu

risc-v的qemu需要单独编译,32位的risc-v qemu编译方式如下

1
2
cd qemu
./configure --target-list=riscv32-linux-user && make -j4

设置环境变量

export PATH=$PATH:/home/frank/opt/riscv/gnu-toolchain-32/bin

RISC-V Tool

当中包含了Spike(ISA模拟器),riscv-opcodes(模拟器的opcode), openocd,pk(模拟器的bootloader和转发器),isa test代码

下载

1
2
3
git clone https://github.com/riscv/riscv-tools.git
cd riscv-tools
git submodule update --init --recursive

编译

RISC-V Tool依赖GNU Tool,因此要先编译setup好GNU Tool后才能编译RISC-V Tool

1
2
3
cd riscv-tools/
export RISCV=/home/frank/opt/riscv/riscv-tool
./build.sh

编译的结果会放到/home/frank/opt/riscv/riscv-tool下

设置环境变量

export PATH=$PATH:/home/frank/opt/riscv/riscv-tool/bin

问题处理

1.编译riscv-tool提示-mcmodel=medany找不到

原因是没有设置gun toolchain环境变量,找不到riscv64-unknown-elf-gcc,使用x86 gcc编译导致
注意目前pk和riscv-test都只支持64bit编译,如果要模拟用32bit,还是使用qemu

2.编译qemu时提示ERROR: pixman >= 0.21.8 not present

处理方法

1
2
3
4
# 查找pixman依赖包
sudo apt-cache search pixman
# 安装依赖包
sudo apt-get install libpixman-1-dev

3.编译qemu时提示Could not lex literal_block as “json”

原因是sphinx的问题,参考
https://lists.sr.ht/~philmd/qemu/%3C5D0975BE02000048000A1D94%40prv-mh.provo.novell.com%3E
鉴于sphinx处理比较麻烦,因此参考下文处理
https://blog.csdn.net/t_sing_winter/article/details/104528516
将docs/interop/bitmaps.rst中的json替换为console,使用vim打开bitmaps.rst,执行

1
:%s/json/console/g