1. 搭建第一个Renode仿真环境

搭建第一个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仿真验证流程 主机终端 renode -e "include @stm32f4_led.resc" Renode仿真器 解析 .resc 脚本 → 加载平台描述 → 加载 ELF 固件 → 启动 CPU 虚拟STM32F4平台 Cortex-M4 CPU 执行固件 → 写 GPIOD_ODR 寄存器 → 更新 GPIO 引脚状态 验证点:sysbus.gpioportD GetRegisterValue 0x14

判定标准

本案例验证通过的条件如下:

  • renode --version能正常输出版本号,说明环境安装正确;
  • 执行.resc脚本后无报错,仿真正常启动;
  • 多次读取ODR寄存器(偏移0x14),返回值在0x1000和0x2000之间交替变化,说明固件在虚拟平台上正确执行,LED控制逻辑生效。

若观察到上述现象,则证明Renode基本工作流程已跑通,本案例目标达成。