我们班计算机组成与设计
课程选用了今年四月份发行的RISC-V
版本教材,为了方便今后的学习,我配置了RISC-V
运行环境,以此记录。
环境:Windows 10 + WSL2
工具链编译
这里按照官方教程走没有任何问题
1 2 3 4 5 6 7
| git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
sudo apt-get 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
./configure --prefix=/opt/riscv make
|
这里我选用了手动编译,因为Ubuntu
的软件源只自带了Linux
的工具链,为了方便调试等操作,我需要手动编译newlib
版本的工具。
在编译安装完成后,将/opt/riscv/bin
加入环境变量PATH
中
运行时环境准备
官方提供的运行时工具有spike
和proxy kernel
,但是不知道为什么,我没能启动调试器连接调试,暂时放弃该方法。
我选用了qemu
来运行编译的程序。在Ubuntu
下安装qemu
1
| sudo apt install qemu-user
|
然后编写一个测试程序并试验一下:
1 2 3 4 5 6 7 8 9 10
| ➜ ~ cat hello.c
int main() { printf("Hello World\n"); return 0; } ➜ ~ riscv64-unknown-elf-gcc hello.c -o hello ➜ ~ qemu-riscv64 hello Hello World ➜ ~
|
VSCode配置
我这里VSCode
的配置并不完美,暂时没找出解决方案(自己写插件好一些)
首先是tasks.json
,我们需要编写两个任务,一是编译我们的代码,另一个是启动qemu
参考如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| { "version": "2.0.0", "tasks": [ { "type": "shell", "label": "C/C++(RISCV): Build active file", "command": "/opt/riscv/bin/riscv64-unknown-elf-g++", "args": [ "-Wall", "-g", "${file}", "-o", "${workspaceFolder}/debug/${fileBasenameNoExtension}" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": [ "$gcc" ] }, { "type": "shell", "label": "Run Qemu Server(RISCV)", "dependsOn": "C/C++(RISCV): Build active file", "command": "qemu-riscv64", "args": [ "-g", "65500", "${workspaceFolder}/debug/${fileBasenameNoExtension}" ], "isBackground": true }, { "type": "shell", "label": "Kill Qemu Server(RISCV)", "command": "ps -C qemu-riscv64 --no-headers | cut -d \\ -f 1 | xargs kill -9", "isBackground": true } ] }
|
然后是launch.json
,参考如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| { "version": "0.2.0", "configurations": [ { "name": "C/C++(RISCV) - Debug Active File", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/debug/${fileBasenameNoExtension}", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "miDebuggerPath": "/opt/riscv/bin/riscv64-unknown-elf-gdb", "miDebuggerServerAddress": "localhost:65500" } ] }
|
在配置完成后,以调试某数据结构作业为例测试一下:
首先是运行任务,启动qemu
:
然后按照常规操作启动调试:
其中在上图中,首先确定1
处选用的是RISC-V
配置,然后在2
处确定选择的是Run Qemu ...
,与被调试程序的交互在这里(3
处)完成。