はじめに
AtomVM 上で Elixir アプリ(main.avm)を動かすとき、パーティションテーブルと書き込みオフセット(flash_offset)を把握しておく必要があります。
それらがよく分からず何回かハマりました。
main.avm の書き込みに成功したあとに、AtomVM が別の場所を読みに行き、結果として何故かアプリが起動しないという状態になります。
同じことで時間を溶かさないためにメモしておきます。
※ 写真はイメージです
対象環境
- マイコン
- ESP32-S3
- ホスト PC
- Debian 系 Linux
- 主なソフトウェア
- AtomVM 0.7.0-dev(開発版)
- ESP-IDF v5.5
結論
見るべきポイントは 2 つです。
-
idf.py partition-tableでmain.avmの オフセット を確認 - Elixir 側(
mix.exs)のflash_offsetを、その オフセット と一致させる
ESP32 側
Elixir 対応イメージをビルドする場合は、
公式に従って sdkconfig.defaults ファイルで partitions-elixir.csv を指定します。
+ CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions-elixir.csv"
Elixir側
Elixir 側では mix.exs に flash_offset を指定する場所があります。
パーティションテーブルを確認する
AtomVM の ESP32 プラットフォームのディレクトリで確認します。
cd ~/Projects/atomvm/AtomVM/src/platforms/esp32
source ~/esp/esp-idf/export.sh
idf.py partition-table
手元の構成(Elixir 用)ではこんな感じになってました。
*******************************************************************************
# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs,data,nvs,0x9000,24K,
phy_init,data,phy,0xf000,4K,
factory,app,factory,0x10000,1792K,
boot.avm,data,phy,0x1d0000,512K,
main.avm,data,phy,0x250000,1M,
*******************************************************************************
公式リポジトリにお手本(?)も見つかりました。
オフセットがズレたときの直し方
どこかで手順を間違ったのか
idf.py partition-table の表示で main.avm のオフセットが想定と違う場合がありました。
自分は次の流れで修正することができました。
cd ~/Projects/atomvm/AtomVM/src/platforms/esp32
idf.py fullclean # もしくは rm -rf build
idf.py reconfigure
idf.py partition-table
![]()
![]()
![]()
おわりに
AtomVM(Elixir)でアプリを書き込むときは、以下の 2 つを合わせるということを覚えておきましょう。
-
idf.py partition-tableのmain.avmのオフセット - Elixir 側の オフセット(
flash_offset)
🎌 🎌 🎌
