
esp32sim:全架构ESP32指令级模拟器
esp32sim 是一款开源 ESP32 模拟器,支持乐鑫 Xtensa (ESP32, S3) 和 RISC-V (C3, C6) 两大 CPU 架构。该工具对四款 ESP32 SoC 进行指令级模拟,能够引导真实的掩膜 ROM、第二阶段引导加载程序及未经修改的应用镜像,实现端到端运行,无需修补固件或注入桩代码。
项目采用 MIT 许可证,无需云服务或账户即可本地运行。经典 ESP32 可在双核 LX6 上引导 ECO3 ROM,支持 GPIO、UART 和定时器;通过 --board ttgo-tdisplay 参数还可模拟 LilyGO TTGO T-Display 的显示屏及按键。
核心特性与架构支持
esp32sim 的核心优势在于高保真度与灵活性:
- 真实引导流程:完整模拟 ROM → Bootloader → FreeRTOS → App 启动链。
- 零修改固件:直接运行官方 ESP-IDF 构建的二进制文件。
- 虚拟网络栈:支持虚拟 AP、WPA2、DHCP/DNS/NTP,并可映射到宿主真实网络,支持 HTTPS。
- 多平台运行:支持原生运行(Linux/macOS/Windows)及浏览器端 WebAssembly。
各芯片支持状态对比
| 特性 | ESP32-S3 | ESP32-C3 | ESP32-C6 |
|---|---|---|---|
| CPU | 2 × Xtensa LX7 @ 240 MHz | 1 × RISC-V RV32IMC @ 160 MHz | 1 × RISC-V RV32IMAC @ 160 MHz |
| 执行引擎 | 块解释器 + AArch64 JIT (~150–240 Minsn/s) | 普通解释器(无 JIT) | 普通解释器(无 JIT) |
| 外设模拟 | ST7735/ST7701S 屏幕、触摸、WS2812、摄像头、音频 | 仅控制台 | ST7789 屏幕、WS2812、802.15.4 能量检测 |
| WiFi 支持 | 虚拟 AP, WPA2, NAT, HTTPS | 扫描, WPA2, DHCP, NAT (单站点) | 同 C3,支持传统速率 |
| 验证状态 | 成熟(JTAG 锁定步测试 8000 步无分歧) | 草稿(控制台输出 205/208 行一致) | 草稿(控制台输出 203/204 行一致) |
硬件复用与模块化设计
大部分 SoC 组件在芯片间共享。C3 复用了 S3 的 UART、USB-Serial/JTAG、定时器、GPIO、SPI Flash 控制器及加密模块模型,仅替换内存映射、缓存控制器和中断矩阵。C6 进一步复用相同模型,并增加了 PLIC 前端、L1 缓存、PCR 和常开 LP 模块。只有 CPU 核心 crate 是完全独立的。
板卡模拟详情 (ESP32-S3)
S3 版本支持多种开发板模拟,通过 BoardModel 解释引脚级事件:
- atech14(默认):带 ST7735 屏幕、WS2812 环形灯、编码器和按钮。
- waveshare-lcd4b:Waveshare ESP32-S3-Touch-LCD-4B,支持 480×480 RGB 屏幕、GT911 触摸及音频编解码器,可运行 LVGL 面板。
- waveshare-cam:Waveshare ESP32-S3-CAM-OV5640,支持 OV5640 摄像头输入、音频输出,可端到端运行行人检测演示。
- none:裸模块模式,仅输出控制台日志。
运行与调试
ESP32-S3:支持 AArch64 JIT 加速,空闲核心自动跳过,性能显著优于实时。在 M 系列 MacBook 上可达约 70 Minsn/s,足以实时运行 Pocket Synth 等音频应用。
ESP32-C3/C6:目前使用解释器执行,速度仍高于实时。C3 和 C6 的验证主要通过比对真机控制台输出来完成,发现了包括竞争条件在内的多个模拟器错误并已修复。
调试功能丰富,支持 --trace(指令追踪)、--break(断点)、--watch(内存监视)及 --profile(PC 直方图)。环境变量可开启 SPI、USB、WiFi 等子系统的详细调试日志。
浏览器体验与 WebAssembly
esp32sim 可编译为 WebAssembly,在浏览器中通过 Web Worker 运行。用户无需安装任何环境,即可在线体验:
- ESP32-S3 上的 Linux 6.11 系统。
- 带 SID 播放器的 Touch-LCD-4B 面板演示。
- Pocket Tank 游戏及 C3/C6 的 Hello World 引导。
在线演示地址:https://mikroverk.github.io/esp32sim/
差分测试与验证
为确保准确性,项目采用了严格的硬件差分测试:
- ESP32-S3:通过 JTAG 锁定步(Lockstep)方式,将模拟器与真机逐指令比对。在 Atech 板上从复位开始执行 8000 步,未发现任何 PC 分歧。
- ESP32-C3/C6:通过比对真机捕获的控制台文本与模拟器输出。C3 在三个启动周期中 205/208 行完全一致;C6 为 203/204 行完全一致。
许可证与贡献
esp32sim 基于 MIT 许可证发布,版权归 Joakim Eriksson、Alice 和 Mattia Fiumara 所有。项目依赖的第三方组件(如 MicroPython、xterm.js、Linux 镜像等)保留其原有许可证。欢迎开发者通过 GitHub 提交 Pull Request,需遵循 CI 检查及测试规范。