Raspberry Pi Pico 2 RISC-V开发实战指南
1. 项目概述:在Raspberry Pi Pico 2上探索RISC-V核心的潜力
上个月发布的Raspberry Pi Pico 2开发板搭载了全新的RP2350微控制器,这款芯片的独特之处在于同时集成了Arm Cortex-M33和RISC-V两种处理器架构。作为一名长期从事嵌入式开发的工程师,我对这种异构设计充满兴趣——它让我们能够在一款价格亲民的开发板上同时体验两种主流指令集架构。
RP2350的具体配置非常有意思:两个Cortex-M33核心加上两个32位RISC-V "Hazard3"核心,但任何时候最多只能同时使用两个核心(可以是两个Arm、两个RISC-V或者各一个)。这种设计既保留了Arm生态的成熟优势,又为RISC-V爱好者提供了实践平台。更令人兴奋的是,某些型号的RP2350板卡还配备了PSRAM,使得在其上运行简化版Linux成为可能。
在本指南中,我将带您完成以下实践:
- 搭建RISC-V开发环境
- 编写并运行简单的LED闪烁程序
- 对比Arm和RISC-V核心的性能表现
- 探索在RP2350上运行Linux的可能性
2. 开发环境搭建与工具链配置
2.1 硬件准备
在开始之前,我们需要准备以下硬件:
- Raspberry Pi Pico 2开发板(或兼容RP2350的其他板卡如Cytron MOTION 2350 Pro)
- Micro USB数据线(用于供电和编程)
- 可选:Raspberry Pi Debug Probe(用于调试)
- 可选:USB转TTL串口模块(用于串口通信)
提示:如果您计划尝试Linux部分,建议选择带有外部PSRAM的板卡,如SparkFun Pro Micro - RP2350,因为标准Pico 2的520KB内存不足以运行Linux。
2.2 软件工具链安装
对于Arm核心的开发,我们可以使用标准的Arm GCC工具链。在Ubuntu/Debian系统上安装如下:
sudo apt update sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential对于RISC-V核心,情况稍微复杂一些。由于RP2350使用的Hazard3核心需要较新版本的GCC支持(14.1.0+),而Ubuntu 22.04的默认仓库不包含这些版本。我们可以选择从源码编译,或者使用预编译的CORE-V工具链:
wget https://buildbot.embecosm.com/job/corev-gcc-ubuntu2204/47/artifact/corev-openhw-gcc-ubuntu2204-20240530.tar.gz tar xvf corev-openhw-gcc-ubuntu2204-20240530.tar.gz export PICO_TOOLCHAIN_PATH=~/corev-openhw-gcc-ubuntu2204-20240530 export PICO_RISCV_TOOLCHAIN_PATH=~/corev-openhw-gcc-ubuntu2204-202405302.3 SDK获取与配置
无论是Arm还是RISC-V开发,我们都需要Raspberry Pi的Pico SDK:
git clone https://github.com/raspberrypi/pico-sdk cd pico-sdk git submodule update --init3. 第一个RISC-V程序:LED闪烁
3.1 从Arm版本开始
为了确保我们的开发环境正常工作,我们先为Arm核心构建一个简单的LED闪烁程序:
git clone -b master https://github.com/raspberrypi/pico-examples.git cd pico-examples/blink_simple/ export PICO_SDK_PATH=../../pico-sdk cmake -DPICO_PLATFORM=rp2350 .. cd blink_simple make -j$(nproc)构建完成后,将生成的blink_simple.uf2文件拖拽到Pico 2的虚拟磁盘中,应该能看到板载LED开始闪烁。
3.2 移植到RISC-V核心
现在我们来为RISC-V核心构建相同的程序。关键区别在于CMake配置时需要指定平台为rp2350-riscv:
cd .. rm -rf CMakeCache.txt CMakeFiles/ cmake -DPICO_PLATFORM=rp2350-riscv .. cd blink_simple make clean make构建完成后,使用file命令检查生成的ELF文件,确认它是RISC-V架构:
$ file blink_simple.elf blink_simple.elf: ELF 32-bit LSB executable, UCB RISC-V, RVC, soft-float ABI, version 1 (SYSV), statically linked, with debug_info, not stripped将新的UF2文件烧录到板子上,LED应该同样开始闪烁。虽然功能相同,但观察文件大小会发现RISC-V版本略大一些(13.8KB vs 12.8KB),这主要是由于不同的编译器优化和指令集特性导致的。
4. 串口通信与调试技巧
4.1 硬件连接
为了查看程序输出和调试信息,我们需要设置串口通信。Pico 2的UART0默认使用以下引脚:
- GP0 (Pin 1) - UART0 TX
- GP1 (Pin 2) - UART0 RX
- GND (Pin 3) - 地线
将这些引脚连接到USB转TTL模块的对应引脚,或者更方便的是使用Raspberry Pi Debug Probe,它集成了USB转串口功能。
4.2 串口示例程序
Pico SDK提供了两种串口输出方式:通过硬件UART或USB CDC。有趣的是,这两种方式的源代码几乎完全相同,区别仅在于CMake配置:
// hello_serial.c 和 hello_usb.c 内容相同 #include <stdio.h> #include "pico/stdlib.h" int main() { stdio_init_all(); while (true) { printf("Hello, world!\n"); sleep_ms(1000); } }关键区别在于CMakeLists.txt中的配置:
# 对于硬件串口版本 add_executable(hello_serial hello_serial.c) target_link_libraries(hello_serial pico_stdlib) # 对于USB串口版本 add_executable(hello_usb hello_usb.c) target_link_libraries(hello_usb pico_stdlib) pico_enable_stdio_usb(hello_usb 1) # 启用USB输出 pico_enable_stdio_uart(hello_usb 0) # 禁用UART输出4.3 串口终端设置
连接好硬件后,可以使用任何串口终端程序(如minicom、screen或picocom)查看输出。在Linux上,Debug Probe通常注册为/dev/ttyACM0:
sudo apt install picocom picocom -b 115200 /dev/ttyACM0如果使用USB CDC串口,设备节点可能是/dev/ttyACM1。注意,USB CDC需要主机安装适当的驱动程序,在Linux上通常开箱即用。
5. 性能对比:Arm Cortex-M33 vs RISC-V Hazard3
5.1 CoreMark基准测试介绍
CoreMark是EEMBC开发的嵌入式系统基准测试程序,它通过执行以下操作来评估处理器性能:
- 链表操作(测试内存访问性能)
- 矩阵乘法(测试算术运算性能)
- 状态机处理(测试控制逻辑性能)
- CRC计算(测试位操作性能)
5.2 测试环境搭建
我们可以使用CoreMark-RP2040项目进行测试。对于RISC-V版本,需要修改Makefile:
# 修改前 cmake .. -DCMAKE_BUILD_TYPE=Debug # 修改后 cmake -DPICO_PLATFORM=rp2350-riscv .. -DCMAKE_BUILD_TYPE=Debug此外,还需要在src/core_portme.h中设置MULTITHREAD为1以启用多核支持:
#define MULTITHREAD 15.3 测试结果分析
在相同时钟频率下,我们得到了以下结果:
Arm Cortex-M33核心:
- CoreMark/MHz: ~280
- 编译器: GCC 10.3.1
- 优化选项: -Og
RISC-V Hazard3核心:
- CoreMark/MHz: ~286 (我们的测试) / 3.81 (官方Hazard3仓库)
- 编译器: GCC 14.1.0
- 优化选项: -Og
注意:我们的测试结果与官方Hazard3仓库的3.81 CoreMark/MHz存在显著差异。这主要是因为测试条件不同——官方使用了更严格的优化参数和特定的编译器标志。实际上,两种核心在相同优化条件下的整数性能相近。
对于浮点性能,由于RP2350的RISC-V核心目前没有硬件FPU,使用软件实现时性能会明显低于具有硬件浮点支持的Cortex-M33。
6. 在RP2350上运行RISC-V Linux
6.1 硬件需求与限制
标准Pico 2板载资源(520KB SRAM + 4MB Flash)不足以运行Linux。要尝试此部分,您需要:
- 至少8MB PSRAM(如SparkFun Pro Micro - RP2350)
- 16MB Flash存储
6.2 构建Linux系统
Mr-Bossman提供了一个基于Buildroot的Linux移植项目:
git clone https://github.com/Mr-Bossman/pi-pico2-linux cd pi-pico2-linux git submodule update --init cd buildroot make BR2_EXTERNAL=$PWD/../ raspberrypi-pico2_defconfig make -j$(nproc)构建过程可能需要较长时间(30分钟到数小时,取决于主机性能),最终会在output/images/目录下生成flash-image.bin等文件。
6.3 系统组成与特性
生成的Linux系统包含以下主要组件:
- Linux内核5.15(针对RP2350定制)
- BusyBox提供基本命令行工具
- 设备树文件raspberrypi-pico2.dtb
- 根文件系统(约2MB的ext2格式)
系统特性:
- 支持PSRAM作为主内存
- 通过UART0提供控制台
- 基本外设驱动(GPIO、I2C、SPI等)
- 启动时间约10-15秒
6.4 烧录与启动
将flash-image.bin烧录到板载Flash的起始位置。对于具有SWD接口的板卡,可以使用:
openocd -f interface/raspberrypi-swd.cfg -f target/rp2350.cfg -c "program flash-image.bin reset exit"启动后,通过串口终端应该能看到Linux启动日志,最终获得登录提示。默认用户名为root,无密码。
7. 开发经验与问题排查
7.1 常见问题与解决方案
问题1:RISC-V程序无法启动
- 检查是否正确设置了PICO_PLATFORM=rp2350-riscv
- 确认工具链路径设置正确(PICO_RISCV_TOOLCHAIN_PATH)
- 检查生成的UF2文件架构:
./uf2conv.py -i firmware.uf2应显示RP2350_RISCV
问题2:串口无输出
- 确认接线正确(TX->RX,RX->TX)
- 检查终端程序波特率设置为115200
- 对于USB CDC,检查dmesg是否识别了设备
问题3:CoreMark结果异常
- 确保在core_portme.h中正确设置了MULTITHREAD
- 尝试不同的优化级别(-O1, -O2, -O3)
- 检查编译器版本是否符合要求
7.2 性能优化建议
内存布局优化:
- 将频繁访问的数据放入TCM(Tightly Coupled Memory)
- 使用DMA减轻CPU负担
- 合理设置缓存策略
编译器优化:
- 针对RISC-V核心:
-march=rv32ima_zicsr_zifencei_zba_zbb_zbkb_zbs - 针对Cortex-M33:
-mcpu=cortex-m33 -mfpu=fpv5-sp-d16 -mfloat-abi=hard
- 针对RISC-V核心:
多核协作:
- 使用RP2350的硬件IPC机制进行核间通信
- 合理分配任务(如Arm核心处理浮点,RISC-V处理控制逻辑)
7.3 调试技巧
利用Debug Probe:
- 单步调试
- 实时变量监控
- 性能分析
日志记录:
- 使用分段缓冲日志减少对性能的影响
- 添加时间戳帮助分析时序问题
电源管理:
- 监控不同工作模式下的电流消耗
- 合理使用睡眠模式降低功耗
8. 项目扩展与进阶方向
8.1 实时操作系统支持
除了Linux,RP2350也适合运行实时操作系统:
- FreeRTOS:已有社区移植版
- Zephyr:官方支持RP2040,可适配RP2350
- RIOT:适用于物联网应用
8.2 混合架构编程
利用两种核心的优势构建异构系统:
- 在Arm核心运行用户界面或通信协议栈
- 在RISC-V核心实现实时控制算法
- 使用共享内存或消息队列进行核间通信
8.3 外设开发
RP2350新增的外设值得探索:
- HSTX接口:高速数据传输
- 增强型安全特性:安全启动、加密加速
- 改进的PIO(可编程I/O)功能
8.4 社区资源
- Raspberry Pi官方论坛:Pico板块
- GitHub上的RP2350相关项目
- RISC-V国际基金会的资源库
- EEMBC的CoreMark优化指南
