如何使用 Renode(快速入门)
Renode 是一个强大的开源仿真框架,主要用于模拟嵌入式系统的硬件和软件环境,特别适用于 IoT 设备、ARM 微控制器、RISC-V 平台等。你可以用它来运行固件、调试嵌入式程序、捕获总线通信(如 UART、SPI、I2C、CAN)甚至与测试框架集成。
🚀 如何使用 Renode(快速入门)
✅ 一、安装 Renode
方法 1:使用 prebuilt 安装包(推荐)
-
macOS (通过 Homebrew):
brew install --cask renode
-
Ubuntu / Debian:
sudo apt update sudo apt install mono-complete wget unzip wget https://builds.renode.io/renode-latest.linux-portable.tar.gz tar -xzf renode-latest.linux-portable.tar.gz cd renode_* ./renode
-
Windows:
下载预编译.zip
文件:
👉 https://builds.renode.io/
方法 2:使用 renode-run
(适合只运行 demo)
pip install renode-run
✅ 二、运行一个简单的 demo 固件
示例:STM32 固件运行
renode
然后在 Renode Monitor 中输入:
mach create
machine LoadPlatformDescription @platforms/cpus/stm32f4_discovery.repl
sysbus LoadELF @path/to/your/firmware.elf
start
📌
@path/to/your/firmware.elf
是你的裸机程序,比如基于 STM32 的 Blinky 工程
✅ 三、运行 CAN 或特斯拉 Roadster 示例
以 Tesla Roadster 项目为例:
-
克隆项目:
git clone --recursive https://github.com/antmicro/renode-tesla-roadster-simulation.git cd renode-tesla-roadster-simulation
-
提取固件(见前面翻译步骤)
-
启动仿真:
renode roadster.resc
会打开 Monitor 控制台、CAN 分析器窗口等。
✅ 四、使用 Wireshark 查看 CAN 总线流量
在 Monitor 控制台中输入:
emulation LogCANTraffic
Renode 会将所有 CAN 帧导出到一个 PCAP 文件,并自动打开 Wireshark 显示。
✅ 五、运行测试(Robot Framework)
renode-test roadster.robot --show-log
可自动运行测试脚本、解析 UART/CAN 输出并断言结果。
🧠 常用命令总结(Renode Monitor)
命令 | 功能说明 |
---|---|
mach create | 创建一个新的虚拟机器 |
sysbus LoadELF @路径 | 加载 ELF 格式固件 |
sysbus LoadBinary @路径 | 加载二进制裸机固件 |
start | 启动仿真 |
pause / reset | 暂停或重置仿真 |
uart0 AttachToConsole | 显示串口输出 |
emulation CreateProfiler | 创建性能分析器 |
emulation LogCANTraffic | 捕获并查看 CAN 通信数据 |
🎯 适合使用 Renode 的场景
- 在没有真实硬件的情况下运行嵌入式固件
- 对通信协议(CAN、UART 等)进行调试和分析
- 自动化 CI 测试嵌入式软件(Robot Framework)
- 反向工程/固件分析(如 Tesla VMS 研究)
- 教学和演示嵌入式系统运行
STM32F103 是 ST 非常流行的一款 Cortex-M3 微控制器,适合裸机、RTOS、CAN 通信等项目。在 Renode 中模拟 STM32F103 系统是完全可行的。以下是一个完整的 STM32F103 + Renode 入门指南,包括如何运行你的固件。
✅ 使用 Renode 运行 STM32F103 固件
一、准备工作
✅ 你需要的文件:
- STM32F103 固件(推荐使用
.elf
,也可用.bin
) - Renode 平台描述文件(
.repl
)
二、步骤详解
✅ 1. 安装 Renode(如你未安装)
wget https://builds.renode.io/renode-latest.linux-portable.tar.gz
tar -xzf renode-latest.linux-portable.tar.gz
cd renode_*
./renode
✅ 2. 创建平台描述文件
创建一个平台描述文件 stm32f103.repl
:
using "platforms/cpus/stm32f1.repl"cpu: CPU.STM32F103C8sysbus:uart1: UART.STM32-> cpu@0x40013800timer2: Timer.STM32-> cpu@0x40000000gpioa: GPIOPort.STM32-> cpu@0x40010800gpiob: GPIOPort.STM32-> cpu@0x40010C00flash: MappedMemorysize: 0x20000-> cpu@0x08000000sram: MappedMemorysize: 0x5000-> cpu@0x20000000
✅ 3. 编写 Renode 脚本 .resc
保存为 stm32f103.resc
:
using sysbus
mach create "stm32f103"machine LoadPlatformDescription @stm32f103.replsysbus LoadELF @your_firmware.elfuart1 CreateTerminalBackend "uart"start
📝 如果你是裸机 .bin
文件,用这个替换:
sysbus LoadBinary @your_firmware.bin 0x08000000
✅ 4. 运行仿真
在 Renode 目录下执行:
./renode stm32f103.resc
你会看到 Monitor 控制台,并可打开 UART 窗口查看输出。
三、可选:观察串口输出
在 Monitor 中输入:
uart1 AttachToConsole
或者你可以在脚本中加:
uart1 CreateTerminalBackend "uart"
这样 Renode 会为 UART1
创建一个控制台窗口。
🧪 示例测试固件(Blinky)
如果你还没有固件,可以尝试 STM32CubeMX + Keil 或 PlatformIO 编译一个简单的 Blinky 工程。
STM32F103C8 的 Blinky 主循环一般是:
while (1) {HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);HAL_Delay(500);
}
在 Renode 中,GPIO 不直接映射到 LED,你可以用 log 或脚本方式观察 GPIO 变化,我也可以帮你模拟 LED。
📈 进阶功能
- 模拟 CAN 总线:添加
can1: CAN.STM32
设备 - 使用
emulation LogPeripheralAccess
查看内存访问 - 使用
emulation CreateProfiler "profile.dump"
分析性能 - 与 Wireshark 配合查看 CAN 或串口流量
没错!在 Renode 中,GPIO 引脚不会自动映射到物理 LED 灯(毕竟它是模拟环境),但你可以通过 多种方式 来观察或“模拟”GPIO 控制 LED 的行为。下面是一些实用的方法和操作示例:
✅ 方法 1:使用 Renode 脚本创建“虚拟 LED”
示例场景:STM32F103 用 GPIOC13 控制 LED(通常接板载 LED)
你可以通过 Renode 的 LED
模块 将 GPIO 映射为虚拟 LED!
🔧 修改你的平台描述文件(.repl)
在 stm32f103.repl
里添加:
gpio_led: LED-> sysbusconnector:gpioa@13 -> gpio_led@0
或者如果使用的是 GPIOC13,可以写:
gpioc: GPIOPort.STM32-> cpu@0x40011000gpio_led: LED-> sysbusconnector:gpioc@13 -> gpio_led@0
这样,当固件将 GPIOC13 设置为低电平时,Renode 的虚拟 LED 会点亮。
✅ 方法 2:用脚本观察 GPIO 状态变化
你可以在 Monitor 控制台里输入以下命令:
showAnalyzer gpioc
这会打开一个图形窗口,实时显示每个 GPIO 引脚的状态(高电平或低电平)。这样你可以看到哪个引脚被拉高/拉低,比如 GPIOC13。
✅ 方法 3:记录 GPIO 活动日志
logLevel 0
logPeripheralAccess gpioc
这会打印出每次对 GPIOC 的写入,比如:
[INFO] gpioc: Set pin 13 to low
[INFO] gpioc: Set pin 13 to high
你可以结合这个日志判断 LED 状态。
✅ 方法 4:通过脚本监控 GPIO 自动行为
如果你希望在 GPIO 状态改变时执行一些操作,比如:
gpioc AddValueChangedHook 13 "echo 'LED toggled!'"
这段脚本会在 GPIOC13 电平变化时输出一句日志。你也可以用它触发模拟事件或记录文件等。
🧪 实战测试:固件点灯循环(C代码)
你的裸机代码大概如下:
while (1) {HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // LED ONHAL_Delay(500);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // LED OFFHAL_Delay(500);
}
这个代码在 Renode 中不会真的点亮 LED,但结合上述 LED 虚拟设备或 GPIO 观察工具,你可以清楚看到它的行为!
✅ 总结
方法 | 功能 | 适合场景 |
---|---|---|
虚拟 LED | 图形化显示点灯/灭灯 | 模拟视觉效果 |
GPIO Analyzer | 实时电平图 | 调试多个引脚 |
日志记录 | 文本输出行为变化 | 离线分析 |
Hook 自动响应 | GPIO 事件触发自定义动作 | 自动测试 |
Renode 对 仿真支持最完整、最成熟的 SoC 型号,主要集中在以下几个厂商和系列上,尤其是 Antmicro 官方长期支持、用于演示和 CI 测试的目标:
✅ 最完整仿真支持的 SoC 型号(推荐)
### 1. STM32F4 系列(特别是 STM32F4Discovery)
-
型号示例:
STM32F4Discovery
(STM32F407VG
) -
支持情况:
- ✔️ Cortex-M4
- ✔️ NVIC、SysTick
- ✔️ UART, GPIO, I2C, SPI, Timer
- ✔️ ADC(基础支持)
- ⚠️ DMA(部分支持)
- ⚠️ USB(基础虚拟化存在,但不完全)
- ✔️ 片上外设全部映射,并支持
.svd
显示寄存器
📦 Renode 自带平台文件:platforms/boards/stm32f4_discovery.repl
2. RISC-V 系列(SiFive Freedom E310 / HiFive1)
-
型号示例:
SiFive E310-G000
(HiFive1) -
支持情况:
- ✔️ 完整 CPU 模型(RV32IMAC)
- ✔️ GPIO, UART, SPI, PWM
- ✔️ Timer, CLINT, PLIC
- ✔️ 自带 SDK 和 demo 可直接运行
-
🧪 用作 Renode 官方 CI 测试和 demos 的平台之一
📦 平台文件:platforms/cpus/sifive_e310.repl
+ platforms/boards/hifive1.repl
3. nRF52 系列(Nordic nRF52840)
-
型号示例:
nRF52840-DK
-
支持情况:
- ✔️ Cortex-M4F CPU
- ✔️ NVIC, GPIO, UART, Timer, RTC
- ✔️ QSPI Flash, Radio(仿真形式)
- ✔️ 多协议支持:BLE 模拟(部分)
-
📦 Zephyr、RIOT、Mynewt 等 RTOS 有完整 demo 配套
4. Microchip SAM E70 / ATSAM 系列
-
型号示例:
ATSAME70Q21B
-
支持情况:
- ✔️ Cortex-M7
- ✔️ UART, GPIO, Timer, ADC
- ✔️ NVIC、DMA、PDC 支持较完整
- ⚠️ 外设模拟精度略逊于 STM32F4
🚫 STM32F1、F0、L 系列支持情况(较弱)
-
STM32F103、STM32F072、STM32L0、L4:仅基础支持,很多外设缺失或行为简化
-
比如你看到的 RCC、DMA、ADC 报警,通常就是因为:
- 未模拟对应 peripheral
- 或仅有 SVD 显示、无行为模拟
✅ 推荐平台选择建议
目标 | 推荐平台 |
---|---|
STM32 仿真最强支持 | ✅ STM32F4Discovery (F407VG) |
RISC-V 入门与测试 | ✅ HiFive1 (E310) |
BLE + Cortex-M | ✅ nRF52840-DK |
Zephyr 官方 CI 支持平台 | ✅ STM32F4 , nRF52840 , E310 |
USB 测试(部分) | ⚠️ STM32F4 (基础 USB OTG) |
✅ 示例:STM32F4Discovery 平台加载命令
include @platforms/boards/stm32f4_discovery.resc
或 .repl
:
machine LoadPlatformDescription @platforms/boards/stm32f4_discovery.repl
stm32f4_discovery.resc 如下:
# 1. 启动 Renode 并加载开发板
mach create
machine LoadPlatformDescription @platforms/boards/stm32f4_discovery.repl# 2. 加载 ELF 文件
sysbus LoadELF @/path to /stm32f4_discovery.elf# 3. 配置 UART 输出
sysbus.uart4 CreateFileBackend "/path to /uart4.log" true# 4. 启动模拟
start
linux 终端运行 renode stm32_discovery.resc
,执行完后,程序运行中所有串口输出都会写入这个文件。
查看方法:
tail -f uart4_output.log