WSL2でQEMU上の仮想ESP32での開発

概要

QEMUというプロセッサエミュレータを利用して、実機がなくてもESP32の開発ができるようなので実験してみました。ESP-IDFでの開発になりますが一応可能です。ただ環境構築を考えると実機を利用したほうが楽だと思います。

QEMUとは

オープンソースのプロセッサエミュレータで、いろいろなCPUなどを再現可能です。どこまでの機能をサポートするのかはプラットフォームにり異なるようでした。

QEMU Emulator - ESP32 - — ESP-IDF Programming Guide latest documentation

ESP32向けの情報は上記のページになります。Windows用もビルド済みファイルがありましたがなんとなく普段は利用できないWSL2(Ubuntu22.04)環境で試してみました。

ESP-IDF環境の構築

Standard Toolchain Setup for Linux and macOS - ESP32 - — ESP-IDF Programming Guide latest documentation

上記がセットアップ方法になります。

sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
cd ~/esp/esp-idf
./install.sh all
. $HOME/esp/esp-idf/export.sh

必要なパッケージを最初にいれてからGitHubのESP-IDFをクローン後にinstall.shを実行します。

QEMU環境の準備

sudo apt-get install -y libgcrypt20 libglib2.0-0 libpixman-1-0 libsdl2-2.0-0 libslirp0
python $IDF_PATH/tools/idf_tools.py install qemu-xtensa qemu-riscv32
. $HOME/esp/esp-idf/export.sh

こちらも必要なパッケージを入れてから、pythonでESP32やS3などのxtensaプロセッサとC3などで利用しているriscv32プロセッサのQEMU環境をインストールします。

pathが追加されるので、再度export.shを実行してQEMUを呼び出せるようにします。

hello_world

cd ~/esp
cp -r $IDF_PATH/examples/get-started/hello_world .
cd ~/esp/hello_world
idf.py set-target esp32
idf.py build
idf.py qemu monitor

まずはhello_worldプロジェクトをQEMU環境で実行してみます。最後の「idf.py monitor」が「idf.py qemu monitor」に変更するだけで実行可能です。

このように実機がないのに実行可能でした。ファームウエアなどをすべてファイルにまとめてからQEMUに渡して実行しているようです。

仮想LCDを使う

Espressif IDF Component Registry
Espressif IDF Component Registry

さらに仮想LCDを利用して画面出力を行うことが可能です。

. $HOME/esp/esp-idf/export.sh
cd ~/esp
idf.py create-project-from-example "espressif/esp_lcd_qemu_rgb^1.0.2:lcd_qemu_rgb_panel"
cd lcd_qemu_rgb_panel
idf.py qemu --graphics monitor

上記コマンドでサンプルプロジェクトを作成して、実行可能です。

dependencies:
  espressif/esp_lcd_qemu_rgb:
    version: ^1
  lvgl/lvgl:
    version: ~8.3.0

このサンプルではlvglとesp_lcd_qemu_rgbを組み合わせて動かしているサンプルになります。

動かすと上記のような画面が表示されます。

idf-extra-components/esp_lcd_qemu_rgb at master · espressif/idf-extra-components
Additional components for ESP-IDF, maintained by Espressif - espressif/idf-extra-components

実際のコードは上記になります。

実際の活用例

Trying out ESP32-C3’s security features using QEMU
Lately, Espressif has been developing a system-level emulation of RISC-V based ESP32-C3 using QEMU and its latest releas...

上記の公式ブログにありました。ESP32-C3のセキュリティー機能の実験です。ESP32にはいろいろなセキュリティー機能がありますが、基本的にはeFuseに書き込む必要があります。ただしeFuseは書き込み回数上限があったり、1度しか書き込めないものが多く実機で検証をするとチップを使い捨てする必要があります。そこで、事前にQEMUを使って最低限の動作確認をしてから実機で使うことによってeFuseまわりの検証がしやすくなるのが狙いのようです。

私もフラッシュ暗号化とかたしめたことがありますが、たしか3回ぐらいしかテストすることができず、テストで利用したDebKitなども他の用途には使いにくくなってしまうのでQEMUが使えると最初の実験がしやすくなりそうです。

まとめ

仕組み的には非常に便利そうであり、GDBを利用したデバッグもできるようです。しかしながらArduino環境では気軽に利用できなかったり、ホビー用途だとちょっと面倒です。

Wokwi - Online ESP32, STM32, Arduino Simulator
IoT and Embedded System Simulator: ESP32, STM32, Arduino, Raspberry Pi Pico, displays, sensors, motors and WiFi simulati...

上記のWokwiだとブラウザ上でそのままArduinoのスケッチを動かすことができるので一般用とだとこちらの方が簡単だと思います。QEMUはどちらかというと組み込みのプロ向けツールで、ブート周りの実験などで使う感じかなと思っています。

LovyanGFX/examples_for_PC at master · lovyan03/LovyanGFX
SPI LCD graphics library for ESP32 (ESP-IDF/ArduinoESP32) / ESP8266 (ArduinoESP8266) / SAMD51(Seeed ArduinoSAMD51) - lov...

仮想LCDは便利そうですが、LovyanGFXやM5Unified(M5GFX)でもSDLを使った仮想LCDは実現可能です。個人的にはArduino IDEを使っているのでQEMUはかなり限定的な用途以外には使わないと思います。

コメント