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を有効にするを参照)。
このページの内容