riscv-3-测试串口打印
1.start.s 位于flash的第一段代码
maskrom中 的代码会引导程序到pflash的零地址 即 0x20000000
,所以程序从这个地址开始。
- 读取hard id
- 如果为0 就跳转_core0 执行打印
- _core0 函数 往flash 0x20000000 一个一个写字母
start.c
1 | .section .text //定义数据段名为.text |
2.lds 链接文件
lds 将.s的代码 链接到flash处
boot.lds
1 | OUTPUT_ARCH( "riscv" ) /*输出可执行文件平台*/ |
build.sh
这里交叉编译器使用
riscv64-unknown-elf-gcc
用于编译面向RISC-V 64位架构的ELF(可执行和可链接格式)目标文件。这个前缀表示,你正在使用的是针对RISC-V架构未知操作系统(ELF)的GCC编译器。
- 制作固件,我们的pflash为32M,因此flash固件比较为32M,我们生成一个32文件,空余位置暂时先填充0,这样就得到了fw.bin固件
1 | CROSS_PREFIX=riscv64-unknown-elf |
run.sh
- 加载固件运行qemu仿真,向之前run.sh脚本添加-drive if=pflash的参数就可以将固件配置到模拟器的固件加载位置,根据之前qemu内的路径就可以加载执行固件内的代码。
1 | SHELL_FOLDER=$(cd "$(dirname "$0")";pwd) |
sudo ./build.sh
sudo ./run.sh
3.问题
注意安装riscv64交叉编译环境的时候汇报这个错误,可能要指明使用的lib路径
1
2 CROSS_PREFIX-gcc -L/opt/riscv/riscv64-unknown-elf/lib -L/opt/riscv/lib -x assembler-with-cpp -c start.s -o $SHELL_FOLDER/output/lowlevelboot/start.o
CROSS_PREFIX-gcc -L/opt/riscv/riscv64-unknown-elf/lib -L/opt/riscv/lib
报错
./run.sh: 9: -drive: not found
原因是上面命令有注释然后命令断开了
1
2
3
4
5
6
7
8
9 SHELL_FOLDER=$(cd "$(dirname "$0")";pwd)
SHELL_FOLDER/output/qemu/bin/qemu-system-riscv64 \
-M quard-star \
-m 1G \
-smp 8 \
-bios none \
-drive if=pflash,bus=0,unit=0,format=raw,file=$SHELL_FOLDER/output/lowlevelboot/fw.bin \
-nographic --parallel none
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Sifanのblog!