Esp32simは、従来のESP32、ESP32-S3(Xtensa LX7アーキテクチャ)、およびRISC-VベースのESP32-C3やESP32-C6を含む、複数のEspressif SoC用ファームウェアを実行するために設計されたオープンソースのエミュレータです。特定のAPIや機能的な動作のみを模倣する多くの高レベルなソフトウェアシミュレータとは異なり、Esp32simは命令レベルのエミュレーションを提供します。これにより、実際のマスクROM、第2段階ブートローダー、および未修正のアプリケーションイメージをブートすることが可能になり、エンドツーエンドのプロジェクトテストのための高精度な環境を提供します。

笑顔のチップアイコンを特徴とするEsp32simプロジェクトのロゴ。
Esp32simオープンソースエミュレータプロジェクトの公式ロゴ。github.com

この画像は、さまざまなEspressif SoCに対して命令レベルのエミュレーションを提供するEsp32simプロジェクトを表しています。

このエミュレータはRustで構築されており、パフォーマンスを達成するためにインタプリタとジャストインタイム(JIT)コンパイルを組み合わせて利用しています。ESP32-S3については、AArch64 JITを採用することで約150〜240 Minsn/sの速度を実現しています。システムは、GPIO、UART、タイマー、SPIフラッシュコントローラなど、これらのチップ間で共有される幅広い周辺機器をモデル化しています。また、ESP32-S3のLCDおよびカメラインターフェース用の特殊なモデルも含まれており、開発者はPIE SIMDユニットを使用した歩行者検知などの複雑なプロジェクトを、完全に仮想環境で実行することができます。

このプロジェクトの最も際立った特徴の一つは、WebAssemblyを介してWebブラウザで実行できる能力です。これにより、ユーザーはコンソール、オーディオ、さらにはシミュレートされたWiFiアクセスポイントを含む仮想化された環境と対話できる、インストール不要の体験が可能になります。ネットワークスタックはWPA2、DHCP、NATをサポートしており、エミュレートされたファームウェアはホストの実際のネットワークと通信できます。物理的なプロトタイピングに対する強力な代替手段を提供しますが、エミュレータは現在、リアルタイムよりも大幅に速い速度(例:特定のブートサイクルで約30倍高速)で動作しており、C6用のPHYベースバンドキャリブレーションなど、一部の特定のハードウェア依存機能については、依然としてハードウェア固有のスタブが必要であったり、仮想環境では未サポートのままです。

エミュレータの機能を表示するEsp32simリポジトリのスクリーンショット。
Esp32simリポジトリは、物理的なハードウェアなしでローカルまたはWebブラウザで実際のファームウェアを実行できる能力を強調しています。github.com

エミュレータはWebAssemblyを介したインストール不要の体験をサポートしており、ユーザーはブラウザ内で仮想化された環境と対話できます。

フルブートシーケンスをサポートしているため、Esp32simは、開発者が物理的なボードにデプロイすることなく、異なるブートステージにわたってファームウェアが正しく動作することを確認する必要があるCI/CDパイプラインにおいて特に有用です。これは高レベルな機能シミュレータと物理ハードウェアの架け橋となり、再現可能なローカル環境またはブラウザベースの環境で実際のバイナリファイルをテストする方法を提供します。プロジェクトはMITライセンスの下で公開されており、個人および商用開発ワークフローの両方で利用可能です。

主要な技術仕様とサポートされているボードには以下が含まれます: - **ESP32-S3**: デュアルコア Xtensa LX7 @ 240 MHz、Waveshare LCD4Bや各種カメラモジュールなどのボードをサポート。 - **ESP32-C3**: シングルコア RISC-V RV32IMC @ 160 MHz。 - **ESP32-C6**: シングルコア RISC-V RV32IMAC @ 160 MHz、802.15.4およびWiFi MACサポートを搭載。 - **ネットワーク**: WPA2、DHCP、およびホストネットワークへのNATリレーを備えた仮想AP。

ユーザーはコマンドラインインターフェースを介してエミュレータを実行でき、チップとボードのタイプを指定できます。例えば、ESP32-S3プロジェクトを実行するには、エミュレータにマスクROM、ブートローダー、およびアプリケーションのバイナリを指定します。その後、コードが実行され、ログが仮想UART0コンソールに出力されます。このセットアップにより、最終的なハードウェアへの展開前に、ファームウェアのロジックを迅速に反復試行することが可能になります。

エミュレータはESP32-S3については成熟していますが、C3およびC6モデルは現在ドラフト段階にあります。これらのモデルはS3と多くの周辺機器コンポーネントを共有していますが、独自のメモリマップ、キャッシュコントローラ、および割り込みマトリックスを含んでいます。RTCウォッチドッグリセットや特定のコンソール出力行など、ハードウェア固有の動作を再現するエミュレータの能力は、JTAGトレースとコンソール比較を通じて物理モジュールと照らし合わせて検証されており、主要な開発ワークフローにおいて高い精度が確保されています。

不確実または制限的な事項としては、ネイティブのRustバイナリと比較したWebAssembly実装の正確なパフォーマンスオーバーヘッドや、現在も洗練の過程にあるC6モデルに対するRISC-V命令セットの完全なカバー範囲が含まれます。さらに、エミュレータはほとんどの標準的な周辺機器を処理しますが、物理的な無線ハードウェアを必要とする高度に特殊なアナログコンポーネントや特定のPHYレイヤーのキャリブレーションについては、依然として物理的なボードまたは特定のソフトウェアスタブの使用が必要となります。

最終的に、Esp32simはツールとして機能します。](