单片机模拟器

linux的:qemu模拟嵌入式开发板运行linux - JeasonBoy - 博客园

 

QEMU

ESP32

乐鑫官方移植的qemu工程:espressif/qemu: Fork of QEMU with Espressif patches. See Wiki for details.

官方使用说明:esp-toolchain-docs/qemu/README.md at main · espressif/esp-toolchain-docs

目前支持ESP32,EPS32C3,ESP32S3,功能还不错,支持多核、PSRAM、SD、GPIO等,I2C、SPI等不支持(但应该可以通过GPIO软件模拟来实现)

下面以ESP32S3为例:

# 安装依赖
sudo apt install ninja-build

# 克隆工程
git clone https://github.com/espressif/qemu.git

# 配置qemu
## xtensa芯片的配置(ESP32 ESP32S3)
./configure --target-list=xtensa-softmmu \
--enable-gcrypt \
--enable-slirp \
--enable-debug \
--enable-sdl \
--disable-strip --disable-user \
--disable-capstone --disable-vnc \
--disable-gtk
## riscv芯片的配置(ESP32C3)
./configure --target-list=riscv32-softmmu \
--enable-gcrypt \
--enable-slirp \
--enable-debug \
--enable-sdl \
--disable-strip --disable-user \
--disable-capstone --disable-vnc \
--disable-gtk

# 编译
ninja -C build

# 运行
build/qemu-system-xtensa -nographic \
  -machine esp32s3 \
  -drive file=固件.bin,if=mtd,format=raw \
  -global driver=ssi_psram,property=is_octal,value=true \
  -m 8 \
  -nic user,model=open_eth
## 参数说明
-drive file=xx.bin 固件路径,注,flash貌似不支持qio模式,只能dio
if=mtd告诉 QEMU:“把这个文件当作 ESP32S3 的外部 Flash 芯片来用”
format=raw告诉 QEMU:“这个文件是纯二进制,直接按字节读取并写入模拟的 Flash 芯片即可”
-m 8 使用PSRAM,大小为8M,如果不使用PSRAM,不加这个
-global driver=ssi_psram,property=is_octal,value=true   使用OPI方式的PSRAM(默认是QSPI)
-nic user,model=open_eth 开启网络

# 合并固件
## qemu貌似不支持单独加载某个分区,只能将整个Flash加载进去,所以如果编译生成的是多个文件(如引导,分区表,主程序等等),需要将它们合并成一个
esptool --chip esp32s3 merge-bin -o esp32s3_full_16M_flash.bin \
  0x00000000  bootloader.bin \
  0x00008000  partition-table.bin \
  0x00010000  network_adapter.bin \
  0x000b0000  etc.jffs2 \
  0x00120000  xipImage \
  0x00600000  rootfs.cramfs \
  --pad-to-size 16MB \
  --flash-mode dio
## qemu只能支持完整的flash文件,所以像zephyr跟micropython这种编译后会自动帮你合并成一个文件,但没有填满整个falsh空间的固件,加载后也识别不了,手动填充满flash空间
esptool --chip esp32s3 merge-bin -o micropython.bin \
  0x00000000 ESP32_GENERIC_S3-20250911-v1.26.1.bin \
  --pad-to-size 16MB
esptool --chip esp32s3 merge-bin -o zephyr_8M.bin \
  0x00000000 build/zephyr.bin \
  --pad-to-size 8MB
### 如果是Nuttx,可以在配置里直接打开qemu支持,它会自动合并文件并扩到4MB的Flash大小
$ make menuconfig -j8
Board Selection ‣ ESP32S3 binary image for QEMU (Enable)
然后编译即可
$ make bootloader
$ make -j8
会在根目录生成 nuttx.merged.bin

目前只有 nuttx 和 jeason1997/esp32s3-rv32ima-arduino 这个Arduino Linux 的程序能成功执行,其他的大多运行个开头就卡住了,原因未知

image

image

 

RP2040

工程路径:ME-IRL/qemu-rp2040: RP2040 support for QEMU. (编译失败,还未测试)

这个工程多年未更新,应该是废弃了,不过无妨,RP2040有一个rp2040js的模拟器,更好用

 

 

Renode

Renode 是一个用于嵌入式平台的开源仿真器。今天,它支持 x86(Intel Quark)、 Cortex-A (NVIDIA Tegra)、 Cortex-M、 SPARC (Leon)和基于risc-v 的平台等等

与Qemu的区别:QEMU 专注于模仿面向更高级别操作系统(如 Linux 计算机)的系统,而不是嵌入式设备,而Renode支持更低的嵌入式设备,以及它们的外设,如GPIO,SPI等

renode用 'xx.repl' 来描述硬件设备,类似设备树那样,用 'xx.resc' 来当作脚本,类似 shell 脚本,可以执行里面的命令

官网:Renode

官方文档:Renode - documentation

各种模拟器描述文件:Raspberry Pi Pico · Antmicro Designer

中文文档:docs/tools/renode/1.renode-introduction.md · OneOS/OneOS-Metis - 码云 - 开源中国

如何使用 Renode(快速入门)-CSDN博客

RP2040

先安装最新版(当前是1.16.0),记得设置为导出到环境变量,方便使用

image

去antmicro里下载一个pico的描述文件,例如micropython的

image

解压后cmd进入到该目录, renode .\micropython.resc 就可以执行带有micropython的zephyr固件了

在renode的控制台里,输入start开始模拟,更多命令,输入help查看

image

不过这个1.16.0的官方模拟器,antmicro里下的描述文件都是针对zephyr这个固件的,如果换自己编译的固件,例如Arduino编译的,就会无法运行

解决方法是换某个作者自己实现的一个rp2040模拟器,只能用于1.15.3,matgla/Renode_RP2040: Repository with RP2040 simulation models.

直接将它根目录的 run_firmware.resc 修改下即可:

$machine_name?="rasbperry_pico"
$platform_file?=$ORIGIN/boards/raspberry_pico.repl
$visualization_file?=$ORIGIN/visualization/raspberry_pico
include $ORIGIN/boards/initialize_custom_board.resc

sysbus LoadELF $ORIGIN/自己固件名字.elf

sysbus.cpu0 VectorTableOffset 0x00000000
sysbus.cpu1 VectorTableOffset 0x00000000

showAnalyzer sysbus.uart0

start

 

posted @ 2025-10-11 00:51  JeasonBoy  阅读(84)  评论(0)    收藏  举报