ESP32-WROOM-SOLO でトラブった件

TL;DR

WROOM-SOLOチップを使う場合、とりあえず動かすには PlatformIO で ESP-IDF を選択して sdkconfig.h を次のように変更する必要がある。

  • 「#define CONFIG_FREERTOS_UNICORE 1」の行を追加
  • 「#define」行のうち「_CPU1」を含むもの、および「_PINNED_TO_CORE_0」を含むものを削除

※間違えて「_PINNED_TO_CORE 0」(CORE と 0 の間が「_」でなく半角スペース)を消さないよう注意

長文版

前回書いてからだいぶ経ったなぁと思いつつ最終更新日を見たら一年も経過していて愕然とした新年最初の月(の終わり)でございます。

久々に電子工作のネタを思い付いたので bluetooth LE の使えるワンチップマイコンの ESP32-WROOM を購入したのですが、カタログを見ながら毎度のごとく下手な考えで「ちょっと安価なシングルコア版かぁ、こっちが買いだな。」とやって要らぬ苦労をしたという話です。

くだんの ESP32-WROOM チップ自体は有名なので、変種の -SOLO についての情報もある『だろう』と思って調べもせずに購入してしまったのです。それがこれから始まる苦難の道への第一歩であるとも知らずに…

問題が発覚したのは注文の翌々日、商品が届いたその日でした。
一緒に頼んだブレッドボード用のブレイクアウト基板に WROOM-SOLO をハンダづけし、arduino-IDE でサンプルスケッチの Blink (いわゆる L チカ)を書き込んで走らせたその時、シリアルモニタに驚愕すべき文字列が表われたのです!

原文

E (98) cpu_start: Running on single core chip, but application is built with dual core support.
E (99) cpu_start: Please enable CONFIG_FREERTOS_UNICORE option in menuconfig.
abort() was called at PC 0x4008274e on core 0

萌訳

べ、別に双頭人向けのマニュアルが読めないわけじゃないのよ!
でも、あんたがどうしても単頭人版も用意したいって言うなら、特別にそっちも読んであげてもいいわ!

「…ま、まあ CPU コア数が違うんだから、設定項目くらいあるか。うん、考えてみれば当然だよなぁ、ははは…」と呟きつつ、指示通りにシェルから make menuconfig を実行すると『make.exe”: *** No rule to make target `menuconfig’. Stop.』という非情なエラー表示が…

しかし、これはまだ序の口でした…

この直後に起こった闘いは、かの有名な「血と硝煙の七日間」として後世で語られるものとなったのです。

…が、紙幅の都合により、ここではダイジェストでお送りします。

  • arduino-IDE で別ボード名の設定を次々と試しては希望を砕かれ、失意のうちにマンハッタン隔離区画(通称 The division)にてマディソン野戦病院から医師を保護する作戦に召集
  • google 神の託宣を求めるも主流のデュアルコア派に関する情報しか得られず途方に暮れる中、リンカーン・トンネル検問所に追い詰められた部隊の救出に従事
  • データシートの解読を試みるも求めるものは見付からず、直後にマンハッタンの地下死体安置所から技師のポール・ローズを連れ出す作戦を遂行
  • PlatformIO 環境に変えてみても arduino 版は動かず、絶望にうめきながらハドソン難民キャンプからクリーナーズを排除
  • ESP-IDF 版では 4秒だけ動いてリセットが繰り返されるという怪奇現象に悩まされつつ、ブロードウェイの商業施設にて汚染源と推測されるドル札を調査
  • ようやく Linux 仮想マシン上にて動くバイナリが make できる事をつきとめ、 祝賀イベントと称してクリーナーズの火炎弾生産現場を襲撃
  • ついに Windows の PlatformIO での設定方法が判明した喜びでハイになった勢いで、タイムズスクエアの継電器をライカーズギャングから奪還

このときの携行火器はショットガンとサブマシンガン、 何度も半死半生になりながら仲間の援護射撃の下、イチかバチかの敵陣特攻を繰り返したと伝えられています。
…って話題が入れ替わってますね、はい。

というわけで、なんとかマトモに動く目処が付いたので忘れないうちに駄文記録を残しているところです。

オマケ:-SOLO 用設定のデフォルト化

新規プロジェクトで用意される sdkconfig.h の テンプレートを探したところ、grep して辿り着いた ~/.platformio/platforms/espressif32/builder/frameworks/espidf.py を見た限りでは espressif32/examples/*/src/sdkconfig.h を探して見付かったどれかをコピーしてくるようなので、次の手順で毎回の sdkconfig.h の変更を回避する事にしました。

  1. examples フォルダ内にあるサンプルを別フォルダに移動する
  2. サンプルの一つである espidf-blink フォルダ以下を examples にコピーして戻す
  3. 唯一のテンプレート候補である examples/espidf-blink/src/sdkconfig.h に次の変更を行う
    1. 次の一行を追加「#define CONFIG_FREERTOS_UNICORE 1」
    2. 以下のいずれかを含む行を削除
      1. 「_CPU1」
      2. 「_PINNED_TO_CORE_0」(CORE と 0 の間はアンダーバー記号)

ちなみにデュアルコア版 WROOM は変更後の設定でも(単一コアモードで)動きます。
※ESP32-WROOM 自体ではなく、変種の ESP32-WROVER-B で確認しました