基于 qemu 的 riscv32架构的 freertos 体验 教程


我在 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
									

你可能感兴趣的:(riscv,riscv,risc-v)