R2P2ESP32

QEMU上で動作させる

実機なしで、QEMU(ESP32-S3)上でR2P2-ESP32を動作させます。

R2P2-ESP32は、実機がなくてもQEMU上で ESP32-S3をターゲットに動作させることができます。これにはESP-IDF組み込みの idf.py qemuサポートと、qemu-xtensaツールパッケージを使用します。

ESP-IDFを使う場合

専用のビルドディレクトリ(build-qemu)を一度だけセットアップします。UARTコンソール 付きのESP32-S3をターゲットにします(QEMUはUSB Serial/JTAGコンソールをエミュレート しません)。

$ rake setup_qemu

続いて、好きなVMで実行します。

$ rake femtoruby:qemu # VM: mruby/c
$ rake picoruby:qemu  # VM: mruby
$ rake qemu           # build-qemuに現在設定されているVM(デフォルトはfemtoruby/mrubyc)

これでエミュレートされたUART上のpicoruby-shellプロンプトに入ります。QEMUの終了は Ctrl-A Xです(-nographicモード)。

Dockerを使う場合

環境構築でDockerを使っている場合は、docker:名前空間の下に 同等のタスクがあります。

$ rake docker:setup_qemu
$ rake docker:femtoruby:qemu   # または docker:picoruby:qemu, docker:qemu

既知の制限事項

  • USB Serial/JTAGコンソールはエミュレートされません。 rake setup_qemuは、 普段のSDKCONFIG_DEFAULTS(設定を参照)に関わらず sdkconfigs/qemu(UARTコンソール)でビルドします。USB Serial/JTAGコンソール ビルドは、QEMUが決して提供しないホスト接続を待ち続けて永遠にハングしてしまうためです。
  • ADC/SENSペリフェラルはエミュレートされません。 そのため、通常app_mainの前に 実行されるADCハードウェアの自己キャリブレーションが無限に回り続けます。 rake qemuは、初回実行時にQEMUのeFuseイメージにBLK_VERSION_MAJOR=1を 書き込むことでこれを回避します。これによりキャリブレーションはハードウェアに 触れる代わりに(ゼロ埋めされた)eFuseデータを読むようになります。そのため、 QEMU上でのADCの読み取り値には意味がありません。
  • PSRAMは8MBに制限されます。 実機はそれ以上搭載していることがありますが、 デフォルトの32MBのままだとQEMUがPSRAM全体を仮想アドレス空間にマップできず、 storage(LittleFS)パーティションのマウント時に esp_mmu_map: no such vaddr rangeでクラッシュします。
  • USE_WIFIビルド自体はコンパイルできますが、QEMUはEthernet MAC (open_eth)のみをエミュレートし、実際のWi-Fiハードウェアはエミュレートしないため、 Network::WiFi / ESP32::WiFiはQEMU上では動作しません (Wi-Fiを有効にするを参照)。