RISC-V Linux 嵌入式编程技术 · 第一章

本章实验 · 三个实验

实验一 板端原生跑通 probe · 实验二 架构陷阱(编错就上不了板)· 实验三 上板通道验收(CoreMark)

本章三个实验一览

本章全部围绕「程序怎么到板子上跑起来」这一件事,拆成三个递进的实验。实验一、实验二只需要软件(板端 gcc),没有硬件器材;实验三是正式的通道验收。三个实验都必须在板上跑通、留下可复查证据才算过关。

实验层次一句话目标跑在哪
实验一
板端原生:自己编、自己跑
软件 最小程序 probe 在板端用 make 编出 RISC-V 产物并跑通 荔枝派(原生)
实验二
架构陷阱:编错就上不了板
软件 把主机 gcc 编出的 x86 产物传上板,亲眼看到 Exec format error,理解为何要「对架构编译」 主机 + 荔枝派
实验三
上板通道验收(CoreMark)
通道验收 交叉编 CoreMark → SCP 上传 → 板端跑分,归档整套通道证据 主机交叉 + 荔枝派
器材:实验一、实验二只需要「已能 SSH 登录的荔枝派 4A + 板端自带 gcc/make」(讲义 1.2 之后已具备),不需要任何外设或接线

实验一 · 板端原生:自己编、自己跑(probe)

荔枝派跑的是一套完整的 Linux,板子上自带 gccmake(讲义 1.3「三条开发路径」中的板端原生路径)。本实验让板子「自己编、自己跑」一个最小程序,并用 file / readelf 认一认产物确实是 RISC-V。

步骤

源码在仓库 chapters/ch01/code/probe/(一个 probe.c + 一个 Makefile)。先把它传到板子:

# 主机上执行:把 probe 目录整个传到板端家目录
$ scp -r chapters/ch01/code/probe user@board-ip:~/

然后登录板子,编译、认架构、运行:

# 板端 shell
$ cd ~/probe
$ make
$ file probe
# 期望输出里含 UCB RISC-V;若没有,说明 make 用的不是板端 gcc
$ readelf -h probe | grep Machine
# 期望:Machine: RISC-V
$ ./probe
# 期望:
#   arch     = riscv
#   ptr size = 8 bytes
#   probe done.

本实验成功判据:file probe 出现 RISC-V;readelf -h 的 Machine 为 RISC-V;./probe 正常打印三行并退出。把三处输出抄进下表。

记录字段你的记录
板端 uname -m
file probe 一行摘要
readelf -h probe | grep Machine 输出
./probe 输出(三行)

验收:上表字段齐全、值正确,即通过实验一。

板上 SSH:make probe、file 为 RISC-V、./probe 打印三行
板端证据(SSH → probe):原生 makefile 为 RISC-V、./probe 跑通

实验二 · 架构陷阱:编错就上不了板

实验一证明「板端原生 gcc 编的能跑」。现在反过来看:主机 gcc 编的程序,架构是 x86-64,直接传上板子会怎样?本实验把同一份 probe.c 在主机编一次、在板端编一次,两份都拿到板子上跑,亲自确认「对架构编译」这件事。

步骤

# 主机上执行(这台是 x86 Linux):make 得到 x86-64 产物
$ cd chapters/ch01/code/probe
$ make
$ file probe
# 期望:x86-64 / Advanced Micro Devices X86-64,而不是 RISC-V
$ readelf -h probe | grep Machine
# 期望:Machine: Advanced Micro Devices X86-64
$ scp probe user@board-ip:/tmp/probe.x86
# 板端 shell:先确保自己有 riscv 版,再试跑传上来的 x86 版
$ cd ~/probe && make          # 若实验一已编过,这步会跳过
$ file probe
# 期望:UCB RISC-V
$ chmod +x /tmp/probe.x86
$ /tmp/probe.x86
# 期望:cannot execute binary file: Exec format error(退出码 126)
#       —— x86 程序在 RISC-V 板上跑不起来,而不是「程序崩溃」
$ ./probe
# 期望:正常打印 arch = riscv —— 板端自己编的就能跑
理解:Exec format error 不是程序写错,而是产物架构和 CPU 对不上。要让板子跑,程序必须编成 RISC-V:要么在板端原生编,要么在主机用交叉工具链编(实验三用后者)。讲义 1.3 的反汇编对比,让你看到同一份 C 在不同架构下生成的指令根本不同。
记录字段你的记录
主机 file probe 一行摘要(x86-64)
板端 file probe 一行摘要(RISC-V)
板端跑 /tmp/probe.x86 的错误行(cannot execute binary file: Exec format error
板端跑 ./probe 的输出首行
一句话结论(为什么 x86 产物上不了板)

验收:两张 file 摘要架构不同;x86 产物在板上报 Exec format error;riscv 产物正常跑;结论句写对。

板上跑 x86 probe 报 Exec format error,再跑 RISC-V probe 成功
板端证据(SSH → 架构陷阱):/tmp/probe.x86 → Exec format error;板端 ./probe 正常

实验三 · 上板通道验收(CoreMark)

实验一、实验二已经证明:板端能原生编、能跑;主机默认 gcc 的产物上不了板。实验三把整条「主机交叉编译 → 传输 → 板端运行」通道用到正式程序 CoreMark 上,并留下可复查的分数与证据。

本实验要做什么

本实验要证明一件事:你在主机上用交叉工具链编出的 RISC-V 程序,能够完整传到荔枝派 4A,并在板端真正跑起来。我们用 CoreMark 作为这份程序:你将留下编译产物、传输核对与板端运行的完整证据,使整条通道可以被复查。分数用来确认程序确实执行成功;可复查的通道证据,才是本章实验要交付的成果。

开始之前,请确认讲义 1.1 至 1.3 已经做完:交叉工具链可用,板子可以登录,主机上已经交叉编出 CoreMark,并且用 file 确认产物架构是 RISC-V。交叉编译的完整命令以讲义为准;本页从「核对已有产物」开始,完成传输、跑分与归档。

你将依次完成这些事:在主机上再次用 filesha256sum 核对产物;用 SCP 把文件传到板子并确认两端哈希一致;在板端加上执行权限并跑出 CoreMark 分数;把分数、日志与通道自证输出写入记录表。

通过标准:记录表与验收表中的项目全部齐全。本章实验采用主机交叉编译得到的可执行文件完成上板;讲义中介绍的板端原生编译可作为对照理解,但本章实验的通过条件以交叉编译产物为准。

前提自检

请先确认下表每一项都已具备。若有缺项,回到对应讲义小节补齐后再继续本页步骤。

前提你怎么确认「已经具备」对应讲义
ruyi 与交叉工具链已安装 x86 Linux 上激活 venv-gnu-ruyisdk 后执行 riscv64-ruyisdk-linux-gnu-gcc -dumpmachine,输出为 riscv64-ruyisdk-linux-gnu 1.1
荔枝派 4A 已烧录并可启动 上电能登录;cat /etc/revyos-releaseRELEASE_ID=20251226uname -mriscv64(讲义 1.2) 1.2
串口或 SSH 至少一种可登录板端 能进入板端 shell,并执行简单命令(如 hostname 1.2
主机上已有 RISC-V 架构的 CoreMark 可执行文件 对产物执行 file,输出中含 RISC-VUCB RISC-V(架构为 x86-64 则需回到讲义 1.3 重编) 1.3

步骤

下面是本实验的主体步骤。若交叉编译命令需要重做,请回到讲义 1.3。

1. 在主机确认 CoreMark 产物架构

x86 Linux 上进入 chapters/ch01/code(或板上同步目录 ~/ruyi-riscv-embedded/ch01-lab 的主机交叉产物):

$ file coremark/coremark.exe
# 成功:一行摘要里应出现 UCB RISC-V 或 RISC-V 字样
# 失败:若出现 x86-64 / Intel 80386,说明没用交叉工具链,回讲义 1.3 重编

$ sha256sum coremark/coremark.exe
# 记下这串哈希,稍后与板端对照,证明 SCP 传的是同一份文件

本步成功判据:file 确认是 RISC-V ELF;你已把 sha256sum 结果抄进下方「必记字段」表。

x86 上交叉编译 CoreMark,file 显示 UCB RISC-V
图 1 在 x86 Linux 上激活 venv-gnu-ruyisdkmake:产物为 RISC-V ELF

2. SCP 上传到荔枝派 4A 并核对完整性

SCP(Secure Copy)通过 SSH 通道把文件拷到远端。把下面命令里的 userboard-ip 换成你板子的真实用户名与局域网 IP(可先在板端执行 ip a 查看)。

$ scp coremark/coremark.exe user@board-ip:/tmp/
$ ssh user@board-ip 'sha256sum /tmp/coremark.exe'
# 板端打印的哈希必须与主机上一步完全一致

本步成功判据:两端哈希一致;板端路径 /tmp/coremark.exe(或你实际选用的路径)可被列出。

3. 板端赋予执行权限并跑分

$ ssh user@board-ip
# 已进入板端 shell 后:
$ chmod +x /tmp/coremark.exe
$ /tmp/coremark.exe

程序会运行一段时间后打印结果。请从输出中抄录 CoreMark 分数(常见字段为 Iterations/Sec,或汇总行里的 CoreMark 总分),并把完整终端输出另存为日志文件(截图或重定向均可),同时写入下方「必记字段」表。

本步成功判据:程序正常结束并打出分数;你已把分数与运行日期写入「必记字段」表,并保存完整日志。

板上运行 CoreMark:Correct operation validated
图 2 板端证据(SSH → CoreMark):产物为 RISC-V,跑分通过校验(并列原生路径;验收仍以交叉+SCP 为准)

本实验验收走步骤 2–3 的 SCP 路径。图 2 是板上自己编译/跑分的对照,两条都会即可。

排错:板端报 Exec format error 时,先回主机用 file 核对是否误用了主机 GCC;再核对 SCP 目标路径与 chmod +x 是否做过。若 SSH 连不上,回讲义 1.2 检查网线、IP 与防火墙。命令细节以讲义 1.2 / 1.3 为准。

必记字段

字段你的记录
产物文件名
主机 file 一行摘要
主机与板端 sha256sum(须一致)
板端可执行文件路径
CoreMark 分数(含字段名)
运行日期 / 板卡型号

4. 通道与工具链自证

除跑分外,还要留下三份「通道还活着」的证据。每条保留一行真实输出(可粘贴到实验报告)。

# 板端:证明 SSH 能登录,且架构是 riscv64
$ ssh user@board-ip 'hostname; uname -m'
# uname -m 的期望输出:riscv64

# 主机:证明交叉工具链三元组正确
$ riscv64-ruyisdk-linux-gnu-gcc -dumpmachine
# 期望输出:riscv64-ruyisdk-linux-gnu

本步成功判据:三行输出均已保存;uname -mriscv64-dumpmachineriscv64-ruyisdk-linux-gnu

验收表

全部勾选且材料齐全,即完成本章实验。缺证据视为未通过。

验收项证据
烧录后荔枝派 4A 可启动启动日志或串口/SSH 登录截图
SSH 可登录板端ssh … 'hostname; uname -m' 输出
uname -mriscv64同上日志中的架构行
工具链三元组正确-dumpmachineriscv64-ruyisdk-linux-gnu
CoreMark 交叉编译产物为 RISC-V主机 file 输出
SCP 上板成功且文件完整两端 sha256sum 一致
板端跑出 CoreMark 分数并已记录完整运行日志 + 「必记字段」表
完成标志:验收表全部勾选;CoreMark 分数与三项自证输出已归档。通道打通后进入第二章。