概要
QEMUというプロセッサエミュレータを利用して、実機がなくてもESP32の開発ができるようなので実験してみました。ESP-IDFでの開発になりますが一応可能です。ただ環境構築を考えると実機を利用したほうが楽だと思います。
QEMUとは
オープンソースのプロセッサエミュレータで、いろいろなCPUなどを再現可能です。どこまでの機能をサポートするのかはプラットフォームにり異なるようでした。
ESP32向けの情報は上記のページになります。Windows用もビルド済みファイルがありましたがなんとなく普段は利用できないWSL2(Ubuntu22.04)環境で試してみました。
ESP-IDF環境の構築
上記がセットアップ方法になります。
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を使う
さらに仮想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を組み合わせて動かしているサンプルになります。
動かすと上記のような画面が表示されます。
実際のコードは上記になります。
実際の活用例
上記の公式ブログにありました。ESP32-C3のセキュリティー機能の実験です。ESP32にはいろいろなセキュリティー機能がありますが、基本的にはeFuseに書き込む必要があります。ただしeFuseは書き込み回数上限があったり、1度しか書き込めないものが多く実機で検証をするとチップを使い捨てする必要があります。そこで、事前にQEMUを使って最低限の動作確認をしてから実機で使うことによってeFuseまわりの検証がしやすくなるのが狙いのようです。
私もフラッシュ暗号化とかたしめたことがありますが、たしか3回ぐらいしかテストすることができず、テストで利用したDebKitなども他の用途には使いにくくなってしまうのでQEMUが使えると最初の実験がしやすくなりそうです。
まとめ
仕組み的には非常に便利そうであり、GDBを利用したデバッグもできるようです。しかしながらArduino環境では気軽に利用できなかったり、ホビー用途だとちょっと面倒です。
上記のWokwiだとブラウザ上でそのままArduinoのスケッチを動かすことができるので一般用とだとこちらの方が簡単だと思います。QEMUはどちらかというと組み込みのプロ向けツールで、ブート周りの実験などで使う感じかなと思っています。
仮想LCDは便利そうですが、LovyanGFXやM5Unified(M5GFX)でもSDLを使った仮想LCDは実現可能です。個人的にはArduino IDEを使っているのでQEMUはかなり限定的な用途以外には使わないと思います。
コメント