基于 qemu 的 riscv32架构的 freertos 体验 教程
我在 freertos 最新版本中看到了FreeRTOSv202107.00\FreeRTOS\Demo\RISC-V-Qemu-virt_GCC准备搭环境体验一下 ,因为我后续要做类似的工作---搭环境是比较麻烦的一件事,我准备在 ubuntu-16.04.7 iso 做出的虚拟机上 做这件事但是, 找了一些 源, 都找不到 qemu-system-riscv32 .去官网下载 qemu-6.1
·
我在 freertos 最新版本中看到了
FreeRTOSv202107.00\FreeRTOS\Demo\RISC-V-Qemu-virt_GCC
准备搭环境体验一下 ,因为我后续要做类似的工作
---
搭环境是比较麻烦的一件事,
我准备在 ubuntu-16.04.7 iso 做出的虚拟机上 做这件事
但是, 找了一些 源, 都找不到 qemu-system-riscv32 .
去官网下载 qemu-6.1.0 并编译 ,要求我装 python3.6 ,我去 源中找 python3.6 , 找不到.
我下面 如果要解决这个问题,可以从两种渠道出发
1. 降版 qemu,并试错找到对Python版本要求没那么高的版本
2. 下载并编译 python3.6
突然感觉没有必要这么折腾,FreeRTOSv202107.00\FreeRTOS\Demo\RISC-V-Qemu-virt_GCC\Readme.md说他们用的平台是 Debian 10
那么我就用Debian 就好了
说下Debian,Debian 也是 一种linux发行版,并采用apt管理软件包
知道了这些后,做事会比较从容一点
在官网下载了 Debian 11,虚拟机安装后启动没有打印,然后去搞 Debian10.10, 效果一样
还是去搞 ubuntu 20.04 吧
用什么系统我不关心,时间有限,只要达到目的就行了
要做的事情
20.04 装好了
下面是我用来编译 crosstool-ng 和 qemu 的 软件包配置
sudo apt-get install net-tools openssh-server git vim make gcc gawk bison flex texinfo automake libtool-bin cvs libncurses5-dev ninja-build libglib2.0-dev libpixman-1-dev help2man
// 下面要做几件事情
1. 准备 riscv32 和 riscv64 的仿真器 // 我们只用到了 riscv32 的仿真器
2. 准备 riscv32 和 riscv64 的编译器 // 我们只用到了 riscv32 的编译器
3. 准备 freertos-risc32 的镜像
4. 用 riscv32仿真器 加载 freertos-risc32的镜像
- 1.准备 riscv32 和 riscv64 的仿真器
可以直接在 https://github.com/sifive/freedom-tools/releases 下载
August 2020 Tools Release 及以前的版本都有 qemu 的发布
可以 下载 qemu 代码 直接编译
在这里,我们采用直接编译的方法,版本qemu-6.1.0
// 配置
qemu-6.1.0$./configure --target-list=riscv32-softmmu,riscv64-softmmu --prefix=/home/pop/work/qemu/qemu-out 2>&1 | tee log_configure.txt
// 编译
make 2>&1 | tee log_build.txt
// 安装
make install 2>&1 | tee log_install.txt
// 测试
pop@ubuntu:~$ qemu-system-riscv32 -machine help
Supported machines are:
none empty machine
opentitan RISC-V Board compatible with OpenTitan
sifive_e RISC-V Board compatible with SiFive E SDK
sifive_u RISC-V Board compatible with SiFive U SDK
spike RISC-V Spike board (default)
virt RISC-V VirtIO board
pop@ubuntu:~$ qemu-system-riscv64 -machine help
Supported machines are:
microchip-icicle-kit Microchip PolarFire SoC Icicle Kit
none empty machine
shakti_c RISC-V Board compatible with Shakti SDK
sifive_e RISC-V Board compatible with SiFive E SDK
sifive_u RISC-V Board compatible with SiFive U SDK
spike RISC-V Spike board (default)
virt RISC-V VirtIO board
- 2.准备 riscv32 和 riscv64 的编译器
可以 直接 在 https://github.com/sifive/freedom-tools/releases 下载,
December 2020 Tools Release及以前都会有发布
https://static.dev.sifive.com/dev-tools/freedom-tools/v2020.12/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz
可以 用 https://github.com/crosstool-ng/crosstool-ng 的源码 去编译
// 生成 为 riscv64-unknown-elf-gcc
可以 用 https://github.com/riscv/riscv-gnu-toolchain 的源码 去编译
// 生成为 riscv64-unknown-linux-gnu-gcc
我们采用 第一种方法
riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz
但是编译出的有问题, 错误为链接时ERROR
ABI is incompatible with that of the selected emulation:
target emulation `elf64-littleriscv' does not match `elf32-littleriscv'
换版本riscv64-unknown-elf-gcc-8.3.0-2020.04.1-x86_64-linux-ubuntu14.tar.gz
FreeRTOSv202107.00/FreeRTOS/Demo/RISC-V-Qemu-virt_GCC/Makefile 更改如下
24c24
< LDFLAGS = -nostartfiles -Tfake_rom.lds \
---
> LDFLAGS = $(ASFLAGS) -nostartfiles -Tfake_rom.lds \
编译链接都OK
- 3.准备 freertos-risc32 的镜像
直接在官网下载 freertos,版本为 FreeRTOSv202107.00.zip
并使用 工程(FreeRTOSv202107.00/FreeRTOS/Demo/RISC-V-Qemu-virt_GCC) 直接用 make 编译
该工程 用的编译链 为 riscv64-unknown-elf-gcc
该工程直接 make 就可以
- 4.用 riscv32仿真器 加载 freertos-risc32的镜像
// 该放PATH的放PATH
qemu-system-riscv32 -nographic -machine virt -net none \
-chardev stdio,id=con,mux=on -serial chardev:con \
-mon chardev=con,mode=readline -bios none \
-smp 4 -kernel ./build/RTOSDemo.axf
打印信息如下
Hello FreeRTOS!
0: Tx: Transfer1
0: Rx: Blink1
0: Tx: Transfer2
0: Rx: Blink2
...
- 其他
我们用的平台是 32位的,工具如下
编译器用的是 riscv64-unknown-elf-gcc , 参数为 -march=rv32ima -mabi=ilp32
仿真器用的是 qemu-system-riscv32 , 参数为 -machine virt
是不是没有 riscv32 的编译器 , 但为什么有 riscv32 的 仿真器 ???
riscv的编译链
1. sifive 发布的 : riscv64-unknown-elf-gcc
2. crosstool-ng 发布的 : riscv64-unknown-elf-gcc
3. riscv-gnu-toolchain 发布的 : riscv64-unknown-elf-gcc
4. andes 发布的 : win :riscv64-linux-gcc/riscv64-elf-gcc/riscv32-linux-gcc/riscv32-elf-gcc
linux :riscv64-linux-gcc
更多推荐
已为社区贡献5条内容
所有评论(0)