Renode 固件仿真
QDebugTool 可以启动 Renode 运行固件 ELF,把虚拟 UART 桥接成普通 TCP 通道,再继续使用参数表、收发区、波形和 HMI。e2 studio 或 STM32CubeIDE 可同时连接虚拟目标,进行断点、单步、内存和寄存器调试。
功能仿真,非实时
当前平台面向通信、协议和应用逻辑验证。RA6T2 的 GPT1 周期溢出可以驱动固件的 100 µs MainTask,但这只证明功能路径;电机 FOC、ADC/PWM 时序、真实 100 µs 周期、函数执行时间、中断延迟和晶振起振过程不能据此代替真机结论。
1. 准备工作
- Windows 10/11 64 位,QDebugTool 带对应平台模板。
- Renode 1.17.0 便携版。开发环境放在
artifacts/renode-r0/renode/renode_1.17.0-portable/renode.exe;发行版放在QDebugTool.exe旁的renode/renode.exe。 - 已在原 IDE 编译固件,得到带调试符号的
.elf,例如E:/RA6T2_Project/trunk/RA6T2/Debug/RA6T2.elf。 - 当前 RA6T2 平台的 UART 使用中断驱动模型。若其固件仍把对应 SCI 的收发挂在 DTC 上,请先在 FSP 配置中移除这些 DTC transfer 模块并重新生成、编译;否则可能能接收但无法发送。
只需修改代码时,仍在原 IDE 中开发、编译,再把新生成的 ELF 交给仿真,不需要在 QDebugTool 中维护另一份源码。
当前平台与支持等级
| 平台 | 内核 | 状态 | 当前桥接 | 边界 |
|---|---|---|---|---|
| RA6T2 | Cortex-M33 | 已验证 | SCI0/1/3/9、GDB、GPT1 周期任务 | 非完整电机外设或硬实时仿真 |
| RA6M5 | Cortex-M33 | 实验 | SCI0/1、GDB | 真实固件和其他外设待验证 |
| RA8M1 | Cortex-M85 | 实验 | SCI0/1、GDB | 安全区和其他外设待验证 |
| RA4M1 | Cortex-M4F | 实验 | SCI0/1、GDB | 真实固件和其他外设待验证 |
| STM32F103 | Cortex-M3 | 实验 | USART1/2、GDB | 真实固件和其他外设待验证 |
| STM32F412 | Cortex-M4F | 实验 | USART1/2、GDB | 不代表全部 F4 料号,其他外设待验证 |
| STM32H743 | Cortex-M7 | 实验 | USART1/2、GDB | 真实固件和其他外设待验证 |
| SiFive FE310 | RV32IMAC | 实验 | UART0/1、GDB | 真实固件和其他外设待验证 |
| Kendryte K210 | RV64IMACFD 双核 | 实验 | UART、GDB | 独立核调试和其他外设待验证 |
“实验”表示平台包和通道已提供,但尚未完成该型号真实固件的完整回归;不能把 UART 桥接成功理解为所有外设均已验证。平台下拉还收录 Renode 1.17.0 官方顶层 platforms/cpus 的其他 110 个平台,同样标为实验;这些平台未适配 UART 和 QDebugTool 启动流程,只提供通用 ELF/GDB 模板,可能还需要时钟、启动和外设适配。可用“型号筛选”按型号或系列过滤完整列表。
乐鑫说明:Renode 1.17.0 没有官方 ESP32 平台。第三方 renode-espemu 目前仅覆盖 ESP32-C3,并需要专用 ROM、额外启动脚本和外设模型;其仓库未声明开源许可,因此暂不纳入平台下拉和发行包。ESP32/ESP32-S3 也暂不能按已支持型号使用。
2. 直接打开示例
示例工程:examples/cxfiot-仿真.proj。它保留了 CXF 上位机 Lua 通道、流解析表、HMI 地址库、曲线和组态,默认不自动连接设备。
- 打开工程,在项目树「仿真管理 → RA6T2」右键选择「属性」。
- 把「固件 ELF」改成本机 RA6T2 工程的实际产物路径,保存。
- 菜单「视图 → 仿真日志区」,点击「启动」,等待状态由「启动中」变为「运行中」。首次启动通常需要 10~50 秒。
- 项目树「连接管理 → 上位机」右键选择「连接设备」。该连接已经配置为
127.0.0.1:3461、本地 CXF Lua 模式,不需要再改帧格式。 - 打开「上位机·流解析」查看调试数据,或通过 HMI 地址库和组态画面写参数。
示例中的 ELF 路径和导入组态的 qeoutRcc 图片资源路径属于本机配置;复制到其他电脑后需要一并调整。只需要通信和参数表功能时,不依赖组态图片资源。
3. 从零新建仿真
3.1 新建配置
通过工具栏「新建 → 新建仿真」、项目树底部「仿真」或「仿真管理」右键菜单进入:
- 名称:任意便于识别的名称。
- 平台:按实际芯片选择;下拉会显示支持等级,切换后通道和构建提示同步变化。
- 固件 ELF:选择原 IDE 生成的
.elf。 - 构建命令:暂时留空;需要「编译并重载」时按第 5 节填写。
仿真配置随 .proj 保存。打开工程只恢复配置,不会自动启动 Renode;多个配置共享一套端口,同时只运行一个。
3.2 创建通信通道
再次打开仿真属性,在「通道配置」对应行点击「新建通道」。QDebugTool 会预填主机、端口和协议;保存后它就是项目树中的普通连接,参数表、曲线和组态仍按原方式绑定。
| 虚拟外设 | TCP 地址 | 建议用途 |
|---|---|---|
| SCI9 | 127.0.0.1:3456 | 自由收发 |
| SCI0 | 127.0.0.1:3460 | 自由收发 |
| SCI1 | 127.0.0.1:3461 | 自由收发;CXF 示例使用此通道 |
| SCI3 | 127.0.0.1:3462 | Modbus RTU 从站 |
RA6T2 的 SCI3 通道使用 TCP 客户端 + Modbus RTU 裸帧。其他平台目前将 SCI0/USART1 映射到 3460、SCI1/USART2 映射到 3461,供自由收发或按固件协议使用。这里虽然走 TCP,但传输的是 UART 字节流,不是 Modbus TCP 的 MBAP 报文;Modbus 固件必须选择 RTU 帧格式。
3.3 启动并连接
- 打开「视图 → 仿真日志区」。
- 右键仿真节点选择「启动仿真」,或点击日志区「启动」。
- 看到
Machine started且状态变为「运行中」后,再连接对应设备。 - 参数表开始刷新后,即可读写参数、查看原始帧或打开曲线和组态。
先启动仿真再连接设备,可避免设备在 Renode 尚未监听端口时反复重连。
4. IDE 源码级调试
Renode 在 127.0.0.1:3333 提供 GDB Server,IDE 直接连接它,不需要真实调试器,也不需要再启动第二个 Renode。以下以 e2 studio 为例:
- 先在 QDebugTool 中启动仿真并确认「运行中」。
- e2 studio 打开同一工程,进入 Run → Debug Configurations…。
- 新建 Renesas GDB Hardware Debugging 配置,选择当前工程和同一个
Debug/RA6T2.elf。 - 在调试器/GDB Server 设置中选择 Other remote target,主机填
127.0.0.1,端口填3333。GDB 命令使用 RA 工具链的arm-none-eabi-gdb。 - 点击 Apply → Debug。连接后可暂停、设置断点、单步、查看调用栈、变量、内存和寄存器。
STM32CubeIDE 使用对应的 GDB Hardware Debugging/远程目标配置,同样连接 127.0.0.1:3333,GDB 使用 arm-none-eabi-gdb。
修改源码后的推荐顺序:结束 IDE 调试会话 → 重新编译 → 在 QDebugTool 中热重载或重启仿真 → 重新连接调试。ELF 必须带符号;只有 HEX 时没有源码级调试信息。
5. 编译并重载
在仿真属性的「构建命令」中填写 e2 studio 无头构建命令,例如:
"C:/Renesas/e2studio/e2studio.exe" -nosplash --launcher.suppressErrors -application org.eclipse.cdt.managedbuilder.core.headlessbuild -data "E:/RA6T2_Project/workspace" -build RA6T2/Debug把 e2studio.exe 和 -data 后的工作区路径换成本机实际值,-build 使用 工程名/构建配置。
- 构建前会检查命令中的程序是否存在;构建输出显示在仿真日志区。
- 构建成功且仿真正在运行时,自动执行暂停、重新加载 ELF、复位并继续。
- 构建失败不会重载,正在运行的旧固件保持原状。
- 在 e2 studio 外部重新编译后,仿真日志区会出现「检测到 ELF 已更新」;确认后点击「重载新 ELF」即可,不会在编译过程中自动复位。
- 热重载失败时,可点击「重新启动」完整重启当前仿真。
6. 仿真日志区
- 「启动/停止」:控制当前活动仿真;「重新启动」用于完整重启。
- 「编译并重载」:执行上述构建命令。
- 「仿真配置…」:编辑活动配置;下方显示当前 ELF、构建命令是否配置和 GDB 地址。
- 「清空」:只清空界面日志,不删除 Renode 落盘日志。
- 日志支持鼠标选择单行或连续多行,
Ctrl+C复制,Ctrl+A全选。
7. 常见问题
| 现象 | 检查与处理 |
|---|---|
| 提示找不到 renode.exe | 检查便携版是否在第 1 节规定的目录;不要只配置 renode.exe 所在的任意 PATH |
| 端口 1234、3333、3456、3460~3462 被占用 | 先停止其他仿真或占用程序。QDebugTool 会自动清理与当前配置匹配的旧实例,但不会强杀其他 Renode 工程或未知程序 |
| 强关 QDebugTool 后再次启动 | 直接重新启动当前仿真;匹配的旧 Renode 会先被清理,日志显示其 PID |
| 一直停在「启动中」 | 等待至多 90 秒;检查 ELF 是否有效、平台模板是否完整,以及仿真日志尾部错误 |
| 能启动但设备连接失败 | 确认已进入「运行中」,主机是 127.0.0.1,端口号与 SCI 通道一致 |
| SCI3 有数据但 Modbus 不响应 | 帧格式选择 RTU 而非 TCP;同时检查站号以及固件是否仍在使用 DTC |
| 能收打印但没有回帧 | 核对固件实际使用的 SCI 与端口映射;检查 TX 是否改为中断驱动,并用 e2 studio 断点确认发送函数是否执行 |
| e2 studio 连不上 3333 | 先确认仿真运行中;不要重复启动 Renode,检查其他 GDB 会话是否已占用目标 |
| 修改代码后行为没有变化 | 确认编译的是同一构建配置和同一 ELF,然后执行热重载或重启仿真 |
| 界面日志突然很多 | 使用「清空」整理视图;平台已做日志限流,完整细节仍可查 Renode 输出文件 |