主要原理是利用mini-rv32ima,在EPS32上运行一个riscv32模拟器,在模拟器里运行无需MMU版的主线Linux 6.X
这位大佬已经把mini-rv32ima移植到esp32-s3的PlatformIO里的Arduino平台上,代码看着好像很简单,就几个脚本:来了来了,用单片机 ESP32-S3 跑 RISC-V 模拟器运行 Linux,这次启动只要 8 秒 | Architecting Life
主要移植思路参考它的文档即可,我主要是做出一些小修改,让他移植的这个兼容不同版本的EPS32-S3
git clone https://github.com/jeason1997/esp32s3-rv32ima.git
vscode安装platformio,建议直接在微软的CodeSpaces里操作,安装快很多
通过platformio打开esp32s3-rv32ima这个项目
在菜单栏底部,选择对应的模板
点击下方的✔开始编译
编译完成后,在项目文件夹下的'.pio/xxx(开发板的名字)/‘下面会发现生成的引导,分区表跟固件
烧录参考官方文档:Flashing Firmware - ESP32-S3 - — esptool latest documentation
esp的程序会生成3个文件,一个引导文件bootloader.bin烧录到0x0处,一个分区表烧录到0x8000处,主程序固件烧录到0x10000处
像NuttX,Arduino,MicroPython等,它们都是在生成ESP32的固件的时候把它们合并到一个bin里了,所以直接烧录到0x0就行
esptool --chip esp32s3 --port /dev/ttyUSB0 --baud 921600 write_flash -z \ 0x0 .pio/build/esp32s3/bootloader.bin \ 0x8000 .pio/build/esp32s3/partitions.bin \ 0x10000 .pio/build/esp32s3/firmware.bin
移植到Arduno工程:
1.把src目录提取出来即可,然后把main.cpp改为xx.ino(跟文件夹同名),才能被arduino识别
2.把emulator文件夹内的脚本都挪到外面,Arduino好像识别不了文件夹里的代码
3.把mini-rv32ima.c里的 #include <esp32/spiram.h> 改为 #include "esp32-hal-psram.h",否则编译会报错找不到头文件
4.把分区表挪到根目录,并改名为 partitions.csv (这一步骤可选)
5.Arduino里的配置
需要改的地方:
Flash Mode:选QIO 120MHz(DIO:2脚数据线 较慢 兼容性好,QIO:4脚数据线 中等,OPI:8脚数据线 快速 但我板子上的不是这种Flash)
Flash Size:改为对应的容量
PSRAM:一般集成在芯片里的是8脚数据线的高速SPI,选 OPI 模式,如果是自己焊接连在外面的,例如8个引脚的ESP-PSRAM,这种就是4跟数据线的,选 QSPI 模式
Partition Scheme:可以选里面对应容量的分区模板,也可以选Custom,选Custom的话,要确保根目录有 partitions.csv 分区表来实现自己分区
# 8MB分区表 # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000, otadata, data, ota, 0xe000, 0x2000, app0, app, ota_0, 0x10000, 0x3A0000, app1, app, ota_1, 0x3B0000,0x3A0000, spiffs, data, spiffs, 0x750000,0xB0000,# 16M分区表 # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000, otadata, data, ota, 0xe000, 0x2000, app0, app, ota_0, 0x10000, 0x640000, app1, app, ota_1, 0x650000,0x640000, spiffs, data, spiffs, 0xc90000,0x360000, coredump, data, coredump,0xFF0000,0x10000,