写在前面
过去二十年,处理器架构市场基本被两家瓜分:Intel 的 x86 统治 PC 和服务,ARM 统治移动端和 IoT。你想自己做一颗芯片?抱歉,先交一笔不便宜的授权费。
RISC-V 的出现打破了这个局面。
RISC-V 是一个完全开源的指令集架构(ISA)。任何人可以免费使用它设计、制造、销售芯片或基于 RISC-V 的产品,而无需向任何公司支付许可费。它由加州大学伯克利分校的 Krste Asanović教授和团队于 2010 年发起,现已成为芯片行业最热门的新势力。
这篇文章,我会从指令集的基本概念讲起,帮你理解 RISC-V 到底有什么不同,然后带你挑选一块开发板,运行你的第一个 RISC-V 程序。
一、什么是指令集架构(ISA)?
1.1 最简单的理解
指令集架构,就是 CPU 和软件之间的\"合同\"——它规定了:
- CPU 能执行哪些基本操作(加法、减法、加载数据、跳转……)
- 有多少个寄存器,每个多宽
- 内存怎么寻址
- 指令的编码格式
你可以把它理解为 CPU 的\"语言规范\"。 软件用这种语言写指令,CPU 听懂并执行。
1.2 x86 vs ARM vs RISC-V
| x86 | ARM | RISC-V | |
|---|---|---|---|
| 开发者 | Intel/AMD | Arm Ltd. | RISC-V 基金会(开源) |
| 授权模式 | 封闭 | 授权收费 | 完全免费开源 |
| 指令类型 | CISC(复杂指令集) | RISC(精简指令集) | RISC(精简指令集) |
| 主要领域 | PC/服务器 | 手机/嵌入式 | IoT/嵌入式/AI/全领域 |
| 可扩展性 | 不可扩展 | 有限扩展 | 高度可扩展 |
RISC-V 的杀手锏是两个字:自由。
你不需要获得任何人的许可就能使用 RISC-V ISA。你可以根据需求自定义指令集扩展。你可以设计一颗极简的 32 位 MCU,也可以设计一颗支持向量扩展的 AI 加速器——都合法,都免费。
1.3 为什么叫 \"V\"?
V 代表\"五\"(罗马数字)。伯克利团队之前已经设计了四代 RISC 处理器(ROCK I~IV),第五代就叫 RISC-V。同时 V 也暗示\"Variable\"(可变),因为 RISC-V 的指令集是可扩展的。
二、RISC-V 架构核心特点
2.1 精简指令集(RISC)
RISC-V 遵循精简指令集哲学:
- 指令长度固定为 32 位(基础 ISA)——解码简单,硬件设计简洁
- Load/Store 架构——只有 load 和 store 指令能访问内存,算术运算只能在寄存器之间进行
- 寄存器数量充足——32 个通用整数寄存器(x0~x31),比 x86 的 16 个多一倍
这种设计让硬件实现更简单,功耗更低,非常适合嵌入式场景。
2.2 模块化设计
RISC-V 不是\"一套指令集适合所有场景\",而是按模块组合:
| 扩展 | 名称 | 说明 |
|---|---|---|
| RV32I / RV64I | 基础整数 ISA | 必选,所有 RISC-V 处理器都包含 |
| M | 乘除扩展 | 硬件乘除法指令 |
| A | 原子操作扩展 | 多核同步用的原子指令 |
| F | 单精度浮点 | 硬件单精度浮点运算 |
| D | 双精度浮点 | 硬件双精度浮点运算 |
| C | 压缩指令 | 16 位编码的压缩指令,减小代码体积 |
| V | 向量扩展 | SIMD 向量运算,适合 AI/多媒体 |
典型组合示例:
- 极简 IoT 节点:RV32I + C(最小代码体积)
- 通用 MCU:RV32IMAC(带乘除、原子、压缩)
- 应用处理器:RV64IMAFDC(64 位 + 全功能)
- AI 加速器:RV64IMAFDCV(加上向量扩展)
2.3 特权级别
RISC-V 定义了三种特权级别:
| 级别 | 名称 | 用途 |
|---|---|---|
| U 模式 | User(用户模式) | 运行用户应用 |
| S 模式 | Supervisor(监管模式) | 运行操作系统内核 |
| M 模式 | Machine(机器模式) | 固件/Bootloader,最高权限 |
MCU 通常只需要 M 模式;跑 Linux 的 SoC 需要 M+S+U。
三、RISC-V 生态现状
3.1 芯片厂商
RISC-V 已经不再只是学术项目,各大厂商都在量产:
| 厂商 | 代表产品 | 定位 |
|---|---|---|
| 平头哥(T-Head) | C906/C910/C920 | 高性能应用处理器 |
| 兆易创新(GigaDevice) | GD32V | MCU,Arduino 兼容 |
| 乐鑫(Espressif) | ESP32-C3 | WiFi/BLE IoT |
| 沁恒(WCH) | CH32V | 低成本 MCU |
| SiFive | E/P/U 系列 | 通用 RISC-V IP |
| Andes Technology | RISC-V IP | IoT/汽车电子 |
3.2 操作系统支持
- Linux:2019 年合并到主线内核(5.0+),完全支持
- FreeRTOS:官方支持
- Zephyr:官方支持
- RT-Thread:官方支持
- Bare-metal:各种裸机 SDK 可用
3.3 开发板推荐
| 开发板 | 芯片 | 价格 | 适合场景 |
|---|---|---|---|
| Sipeed Longan Nano | GD32VF103 | ¥30-50 | 入门学习,带 LCD |
| ESP32-C3 | ESP32-C3 | ¥15-25 | IoT 开发,WiFi+BLE |
| Milk-V Duo | CV1800B | ¥50-80 | Linux 应用处理器 |
| StarFive VisionFive 2 | JH7110 | ¥500-700 | 完整 Linux SBC |
| HiFive1 Rev B | FE310-G002 | ¥300+ | 官方推荐入门板 |
入门推荐:ESP32-C3 或 Sipeed Longan Nano——便宜、资料多、上手快。
四、实战:在 RISC-V 开发板上跑起第一个程序
4.1 硬件准备
我们以 ESP32-C3 为例——它搭载 RISC-V 单核处理器,支持 WiFi 和 BLE 5.0,价格不到 20 块。
你需要:
- ESP32-C3 开发板(如 ESP32-C3-DevKitM-1)
- USB-C 数据线
- 电脑(Windows/Mac/Linux 均可)
4.2 搭建开发环境
方案一:Arduino IDE(最简单)
- 安装 Arduino IDE 2.x
- 偏好设置 → 附加开发板管理器网址,添加:
https://espressif.github.io/arduino-esp32/package_esp32_index.json - 开发板管理器 → 搜索\"ESP32\" → 安装(包含 ESP32-C3 的 RISC-V 支持)
- 选择开发板为 \"ESP32C3 Dev Module\"
- 编写代码 → 上传
// ESP32-C3 Blink 示例
void setup() {
pinMode(8, OUTPUT);
Serial.begin(115200);
Serial.println(\"Hello from RISC-V!\");
}
void loop() {
digitalWrite(8, HIGH);
delay(500);
digitalWrite(8, LOW);
delay(500);
}
就这样——你已经在 RISC-V 处理器上运行代码了。
方案二:ESP-IDF(官方 SDK,更灵活)
如果你需要更底层的控制,用 Espressif 的官方 SDK:
# 1. 安装 ESP-IDF 工具链
git clone --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh esp32c3 # 指定 RISC-V 芯片
# 2. 设置环境
. ./export.sh
# 3. 创建项目
idf.py create-project my_riscv_app
cd my_riscv_app
# 4. 编辑 main/main.c
# 5. 编译(注意这里编译的是 RISC-V 目标代码)
idf.py set-target esp32c3
idf.py build
# 6. 烧录
idf.py -p /dev/ttyUSB0 flash monitor
4.3 方案三:裸机开发(纯 RISC-V 学习)
如果你想从最底层理解 RISC-V,可以尝试纯裸机开发:
# 安装 RISC-V GCC 工具链
# Ubuntu/Debian:
sudo apt install gcc-riscv64-unknown-elf gdb-riscv64-unknown-elf
# 或者用预编译版本:
wget https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/latest/download/xpack-riscv-none-elf-gcc-linux-x64.tar.gz
tar xzf xpack-riscv-none-elf-gcc-linux-x64.tar.gz
写一段最基础的汇编程序:
# hello.S - 在 RISC-V 上打印字符到串口
.section .text
.globl _start
_start:
# 设置栈指针
la sp, _stack_top
# 打印 \"Hello RISC-V!\"
la a0, hello_msg
jal uart_puts
# 停机
1: j 1b
.section .rodata
hello_msg:
.string \"Hello RISC-V!\\n\"
编译:
riscv64-unknown-elf-gcc -march=rv32imac -mabi=ilp32 -nostdlib hello.S -o hello.elf
这就是你在裸 RISC-V 硬件上能跑的最小程序。
五、深入理解 RISC-V 指令
5.1 基础指令(RV32I)
掌握这几条核心指令,你就理解了 RISC-V 的基本运作方式:
| 指令 | 格式 | 示例 | 说明 |
|---|---|---|---|
| addi | rd, rs1, imm | addi x1, x0, 10 |
x1 = x0 + 10 = 10 |
| add | rd, rs1, rs2 | add x2, x1, x1 |
x2 = x1 + x1 = 20 |
| lw | rd, offset(rs1) | lw x3, 0(x4) |
从内存加载 |
| sw | rs2, offset(rs1) | sw x3, 0(x4) |
写入内存 |
| beq | rs1, rs2, label | beq x1, x2, equal |
条件跳转 |
| jal | rd, label | jal ra, my_func |
跳转并链接 |
5.2 一个完整的小程序
// 用 C 写的 RISC-V 程序,编译器会生成对应的 RISC-V 汇编
int fibonacci(int n) {
if (n <= 1) return n;
return fibonacci(n-1) + fibonacci(n-2);
}
int main() {
int result = fibonacci(10); // result = 55
return 0;
}
编译后生成的 RISC-V 汇编大概是这样的(简化版):
fibonacci:
addi sp, sp, -32 # 分配栈空间
sw ra, 28(sp) # 保存返回地址
sw s0, 24(sp) # 保存帧指针
addi s0, sp, 32
sw a0, -20(s0) # 保存参数 n
lw a5, -20(s0)
li a4, 1
bgt a5, a4, .L2 # if n > 1, skip return
lw a5, -20(s0)
mv a0, a5 # return n
j .L3
.L2:
lw a5, -20(s0)
addi a5, a5, -1
mv a0, a5
jal fibonacci # fibonacci(n-1)
mv a5, a0
lw a4, -20(s0)
addi a4, a4, -2
mv a0, a4
jal fibonacci # fibonacci(n-2)
add a0, a5, a0 # result = fib(n-1) + fib(n-2)
.L3:
lw ra, 28(sp)
lw s0, 24(sp)
addi sp, sp, 32
jr ra
虽然看起来复杂,但 RISC-V 的汇编非常规整——每条指令做一件事,没有 x86 那种\"一条指令干三件事\"的魔幻操作。这也是 RISC 哲学在代码层面的体现。
六、RISC-V vs 传统架构:嵌入式场景对比
6.1 功耗
| 架构 | 典型待机电流 | 典型工作电流 | 适合电池应用 |
|---|---|---|---|
| RISC-V (ESP32-C3) | ~10μA | ~50mA | ✅ 优秀 |
| ARM Cortex-M (STM32) | ~5μA | ~30mA | ✅ 优秀 |
| x86 (Atom) | ~1mA | ~500mA | ❌ 不适用 |
RISC-V 和 ARM 在低功耗领域旗鼓相当。RISC-V 的优势在于没有授权费,可以大规模量产而不增加成本。
6.2 性能
| 指标 | RISC-V (C906) | ARM Cortex-A53 | 说明 |
|---|---|---|---|
| Dhrystone DMIPS/MHz | ~2.8 | ~2.0 | RISC-V 略优 |
| 时钟频率 | 最高 2GHz | 最高 1.5GHz | 取决于芯片实现 |
| 多核支持 | ✅ | ✅ | 两者都支持 |
重要提醒:RISC-V 只是 ISA,具体性能取决于芯片实现。 同样的 RISC-V ISA,平头哥 C906 和一颗简单的 MCU 性能差距巨大——就像同样的 x86 ISA,i9 和 Celeron 不是一个量级。
6.3 开发生态
| RISC-V | ARM | |
|---|---|---|
| 编译器支持 | GCC/Clang 主线 | GCC/Clang 主线 |
| RTOS 支持 | FreeRTOS/Zephyr 全支持 | 全支持 |
| Linux 支持 | 主线内核 5.0+ | 成熟 |
| IDE 支持 | PlatformIO/VSCode/CLion | Keil/IAR/STM32CubeIDE |
| 社区教程 | 增长中(中文资料较多) | 非常丰富 |
| 芯片选型 | 快速增长中 | 极其丰富 |
RISC-V 的生态还在快速成长期。对于常规嵌入式开发,工具和生态已经够用;但如果你需要特定的外设库或评估板支持,ARM 的选择面仍然更广。
七、常见问题
Q: RISC-V 能跑 Linux 吗?
能。 从 2019 年 Linux 5.0 内核开始,RISC-V 就是主线支持的目标架构。Milk-V Duo、StarFive VisionFive 2 等开发板都能跑完整的 Linux 发行版。
Q: RISC-V 和 ARM 哪个更好?
没有绝对答案。如果你在做商业产品且成本敏感,RISC-V 没有授权费是巨大优势。如果你需要成熟的生态和现成的库支持,ARM 目前更丰富。 但 RISC-V 的追赶速度极快,预计 3-5 年内生态差距会显著缩小。
Q: 入门应该选哪块开发板?
- 预算最低:ESP32-C3(¥15,WiFi+BLE,Arduino 兼容)
- 想学裸机开发:Sipeed Longan Nano(¥30,带 LCD 和 RGB LED)
- 想跑 Linux:Milk-V Duo(¥50)或 VisionFive 2(¥500)
Q: RISC-V 的未来会怎样?
乐观地说,非常好。Google 宣布 Android 15 支持 RISC-V,NVIDIA 也在 RISC-V 上投入研发。嵌入式领域更是 RISC-V 的主场——ESP32-C3 已经证明 RISC-V 在 IoT 场景完全可用。
八、总结
RISC-V 不是\"又一个处理器架构\",它是一次架构民主化的尝试——任何人都可以自由设计和使用处理器,不再被授权费和技术壁垒束缚。
核心要点回顾:
- RISC-V 是开源指令集,免费且可扩展
- 采用模块化设计(I/M/A/F/D/C/V),按需组合
- ESP32-C3 等芯片已量产,生态快速成熟
- 入门门槛低,¥15 的开发板就能上手
- 适合 IoT、嵌入式、AI 加速等多种场景
如果你之前只接触过 Arduino(AVR)或 STM32(ARM),RISC-V 会给你带来全新的视角。下一期,我会聊聊 ESP32 的 RISC-V 系列(C2/C3/C6)相比传统 Xtensa 架构的优劣对比。
本文测试环境:ESP32-C3-DevKitM-1 + Arduino IDE 2.x + ESP-IDF 5.0