1. 搭建第一个Renode仿真环境
任务说明
本案例目标是在本机搭建Renode仿真环境,创建一个虚拟的嵌入式平台(以STM32F4 Discovery开发板为例),加载并运行一个LED闪烁的固件程序,通过观察虚拟板上LED状态变化来验证Renode的基本工作流程。完成本案例后,你将具备使用Renode进行嵌入式仿真的基础能力。
环境准备
Renode支持Windows、Linux和macOS。以下步骤以Ubuntu 22.04 LTS为例,其他平台请参考官方文档。需要安装.NET 6.0 SDK和Renode本体。
# 安装.NET 6.0 SDK(若已安装可跳过)
wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update
sudo apt-get install -y dotnet-sdk-6.0
# 下载并安装Renode
wget https://github.com/renode/renode/releases/download/v1.15.3/renode_1.15.3_amd64.deb
sudo dpkg -i renode_1.15.3_amd64.deb
sudo apt-get install -f -y
安装完成后,在终端输入renode --version,若能输出版本号(如1.15.3),说明安装成功。
创建虚拟平台与固件
首先准备一个最简单的LED闪烁固件。我们使用STM32F4的寄存器操作方式,直接控制GPIOD的Pin 12和Pin 13(板上LED)交替输出高低电平。创建文件led_blink.c:
// led_blink.c - 适用于STM32F407的LED闪烁程序
// 编译: arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -nostdlib -Ttext=0x08000000 -o led_blink.elf led_blink.c
#define RCC_AHB1ENR (*(volatile unsigned int*)0x40023830)
#define GPIOD_MODER (*(volatile unsigned int*)0x40020C00)
#define GPIOD_ODR (*(volatile unsigned int*)0x40020C14)
void delay(void) {
volatile int i;
for (i = 0; i < 1000000; i++);
}
int main(void) {
// 使能GPIOD时钟
RCC_AHB1ENR |= (1 << 3);
// 设置PD12和PD13为输出模式
GPIOD_MODER |= (1 << 24) | (1 << 26);
while (1) {
GPIOD_ODR |= (1 << 12); // PD12高电平
GPIOD_ODR &= ~(1 << 13); // PD13低电平
delay();
GPIOD_ODR &= ~(1 << 12); // PD12低电平
GPIOD_ODR |= (1 << 13); // PD13高电平
delay();
}
}
编译需要ARM交叉编译器。若未安装,执行sudo apt-get install gcc-arm-none-eabi。编译命令:
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -nostdlib -Ttext=0x08000000 -o led_blink.elf led_blink.c
编译成功后生成led_blink.elf文件。
编写Renode仿真脚本
Renode使用.resc脚本文件描述平台和启动流程。创建stm32f4_led.resc:
# 加载STM32F4 Discovery开发板平台描述
include @platforms/boards/stm32f4_discovery.repl
# 加载编译好的固件
sysbus LoadELF @/path/to/led_blink.elf
# 启动仿真
start
注意将/path/to/led_blink.elf替换为实际路径。Renode自带STM32F4 Discovery平台描述文件,其中已定义GPIO、UART等外设映射。
运行与验证
在终端启动Renode并执行脚本:
renode -e "include @stm32f4_led.resc"
仿真启动后,在Renode的Mono终端中执行以下命令观察LED状态:
# 查看GPIO端口D的寄存器值
sysbus.gpioportD GetRegisterValue 0x14
该命令读取GPIOD的ODR寄存器(偏移0x14)。预期输出为0x00001000(PD12为高)或0x00002000(PD13为高),两者交替出现。由于程序中有延时循环,可以多次执行该命令,观察值在0x1000和0x2000之间切换。
判定标准
本案例验证通过的条件如下:
renode --version能正常输出版本号,说明环境安装正确;- 执行
.resc脚本后无报错,仿真正常启动; - 多次读取ODR寄存器(偏移0x14),返回值在
0x1000和0x2000之间交替变化,说明固件在虚拟平台上正确执行,LED控制逻辑生效。
若观察到上述现象,则证明Renode基本工作流程已跑通,本案例目标达成。