单片机模拟器
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
然后编译即可
$ make bootloader
$ make -j8
会在根目录生成 nuttx.merged.bin
目前只有 nuttx 和 jeason1997/esp32s3-rv32ima-arduino 这个Arduino Linux 的程序能成功执行,其他的大多运行个开头就卡住了,原因未知


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
各种模拟器描述文件:Raspberry Pi Pico · Antmicro Designer
中文文档:docs/tools/renode/1.renode-introduction.md · OneOS/OneOS-Metis - 码云 - 开源中国
RP2040
先安装最新版(当前是1.16.0),记得设置为导出到环境变量,方便使用

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

解压后cmd进入到该目录, renode .\micropython.resc 就可以执行带有micropython的zephyr固件了
在renode的控制台里,输入start开始模拟,更多命令,输入help查看

不过这个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

浙公网安备 33010602011771号