arduino-esp32の3系は便利な状態表示機能が追加されていた

概要

デバッグレベルを変更したところ、起動時に便利な情報が表示されていたので確実に表示させる方法を紹介したいと思います。

起動時の表示項目

Setup前に表示される項目 printBeforeSetupInfo

=========== Before Setup Start ===========
Chip Info:
------------------------------------------
  Model             : ESP32
  Package           : PICO-V3-02
  Revision          : 3.00
  Cores             : 2
  CPU Frequency     : 240 MHz
  XTAL Frequency    : 40 MHz
  Features Bitfield : 0x000000b3
  Embedded Flash    : Yes
  Embedded PSRAM    : Yes
  2.4GHz WiFi       : Yes
  Classic BT        : Yes
  BT Low Energy     : Yes
  IEEE 802.15.4     : No
------------------------------------------
INTERNAL Memory Info:
------------------------------------------
  Total Size        :   378124 B ( 369.3 KB)
  Free Bytes        :   336956 B ( 329.1 KB)
  Allocated Bytes   :    33916 B (  33.1 KB)
  Minimum Free Bytes:   331256 B ( 323.5 KB)
  Largest Free Block:   110580 B ( 108.0 KB)
------------------------------------------
SPIRAM Memory Info:
------------------------------------------
  Total Size        :  2097152 B (2048.0 KB)
  Free Bytes        :  2095104 B (2046.0 KB)
  Allocated Bytes   :        0 B (   0.0 KB)
  Minimum Free Bytes:  2095104 B (2046.0 KB)
  Largest Free Block:  2064372 B (2016.0 KB)
  Bus Mode          : QSPI
------------------------------------------
Flash Info:
------------------------------------------
  Chip Size         :  8388608 B (8 MB)
  Block Size        :    65536 B (  64.0 KB)
  Sector Size       :     4096 B (   4.0 KB)
  Page Size         :      256 B (   0.2 KB)
  Bus Speed         : 80 MHz
  Bus Mode          : QIO
------------------------------------------
Partitions Info:
------------------------------------------
                nvs : addr: 0x00009000, size:    20.0 KB, type: DATA, subtype: NVS
            otadata : addr: 0x0000E000, size:     8.0 KB, type: DATA, subtype: OTA
               app0 : addr: 0x00010000, size:  3264.0 KB, type:  APP, subtype: OTA_0
               app1 : addr: 0x00340000, size:  3264.0 KB, type:  APP, subtype: OTA_1
             spiffs : addr: 0x00670000, size:  1536.0 KB, type: DATA, subtype: SPIFFS
           coredump : addr: 0x007F0000, size:    64.0 KB, type: DATA, subtype: COREDUMP
------------------------------------------
Software Info:
------------------------------------------
  Compile Date/Time : May 15 2025 12:17:22
  Compile Host OS   : windows
  ESP-IDF Version   : v5.4.1-1-g2f7dcd862a-dirty
  Arduino Version   : 3.2.0
------------------------------------------
Board Info:
------------------------------------------
  Arduino Board     : M5STACK_STICKC_PLUS2
  Arduino Variant   : m5stack_stickc_plus2
  Arduino FQBN      : esp32:esp32:m5stack_stickc_plus2:UploadSpeed=1500000,CPUFreq=240,FlashFreq=80,FlashMode=qio,FlashSize=8M,PartitionScheme=default_8MB,DebugLevel=verbose,PSRAM=enabled,LoopCore=1,EventsCore=1,EraseFlash=none
============ Before Setup End ============

上記のようなビルドに利用した情報が表示されます。PSRAMやパーティションの情報なども表示されるのでわかりやすいですね。

とくにPlatformIOなどでビルドするときにFQBNの部分に差が無いかなどを確認するときに便利そうです。

Setup後に表示される項目 printAfterSetupInfo

=========== After Setup Start ============
INTERNAL Memory Info:
------------------------------------------
  Total Size        :   378124 B ( 369.3 KB)
  Free Bytes        :   336868 B ( 329.0 KB)
  Allocated Bytes   :    33972 B (  33.2 KB)
  Minimum Free Bytes:   330908 B ( 323.2 KB)
  Largest Free Block:   110580 B ( 108.0 KB)
------------------------------------------
SPIRAM Memory Info:
------------------------------------------
  Total Size        :  2097152 B (2048.0 KB)
  Free Bytes        :  2095104 B (2046.0 KB)
  Allocated Bytes   :        0 B (   0.0 KB)
  Minimum Free Bytes:  2095104 B (2046.0 KB)
  Largest Free Block:  2064372 B (2016.0 KB)
------------------------------------------
GPIO Info:
------------------------------------------
  GPIO : BUS_TYPE[bus/unit][chan]
  --------------------------------------  
     1 : UART_TX[0]
     3 : UART_RX[0]
============ After Setup End =============

こちらはメモリの状態と、GPIOの設定が表示されます。pinModeやI2Cなどの初期化をすると情報が追加されていることとなります。

ただし、レジスタを直接設定してArduino(ESP-IDF)の関数を呼び出さない場合にはここには反映されないようでした。M5GFXなどはPWMなどは反映されていましたが、SPIとかは表示されていなかったと思います。

表示条件

#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG
  printBeforeSetupInfo();
#else
  if (shouldPrintChipDebugReport()) {
    printBeforeSetupInfo();
  }
#endif

main.cppにて呼び出されています。上記のようにデバッグレベルがLOG以上の場合か、shouldPrintChipDebugReport関数の戻り値がtrueの場合に表示されます。

__attribute__((weak)) bool shouldPrintChipDebugReport(void) {
  return false;
}

shouldPrintChipDebugReport関数は上記のように宣言されており、weakで宣言されています。weakがついた関数は上書きをする関数が宣言されている場合にはそちらを利用し、されていない場合にはこの関数が利用されます。

bool shouldPrintChipDebugReport(void) {
  return true;
}

void setup() {
}

void loop() {
}

上記のように上書き宣言をすることで表示されるようになります。

bool shouldPrintChipDebugReport(void);
#define ENABLE_CHIP_DEBUG_REPORT          \
  bool shouldPrintChipDebugReport(void) { \
    return true;                          \
  }

ただし、上記のような宣言がされていますので

ENABLE_CHIP_DEBUG_REPORT

void setup() {
}

void loop() {
}

上記でも大丈夫です。大丈夫なのですが、非常に違和感があります。

おすすめ設定

#include <chip-debug-report.h>

bool shouldPrintChipDebugReport(void) {
  return true;
}

void setup() {
  delay(1000);
  printBeforeSetupInfo();
}

void loop() {
}

個人的なおすすめ設定は上記になります。まずM5StickCなどのが採用しているUSBシリアルは再起動すると初期化に時間がかかり起動直後のシリアル出力が拾えません。そのためsetupより前に出力されている部分が抜け落ちます。そこでsetupの先頭でdelay()で1秒程度待ち、その後にprintBeforeSetupInfoを自分で呼び出します。これで確実にprintBeforeSetupInfoを表示させることができます。

ただ最近のUSBシリアルだと初期化時間が短いものがあったりして、初期化待ちがいらないものも多いかもしれません。

まとめ

似たようなデバッグ出力関数は自作していたのですが、便利なので標準機能のこちらを今後は利用していきたいと思っています。ただMACアドレス等は表示されていないんですね。

ログ提出用として個人特定ができる項目は避けているのかもしれません。書き込みログを見ればMACアドレスはわかりますしね。

ちなみにprintAfterSetupInfo()関数はメモリの状態とGPIOの状態がわかるので、明示的に呼び出して便利に使える関数だと思います。

コメント

  1. NoRi より:

    いつも有用な記事いつもありがとうございます。大変参考にさせていただいています。
    実は、Aruduino IDEでは「おすすめ設定」で表示されているのですが、platformio環境では、#include が通らなくて困っています。
    platformio.ini でlib_depsに何か登録する必要があるのでしょうか?
    ご教授いただければ幸いです。どうかよろしくお願いします。

    • たなかまさゆき より:

      PlatformIOの標準ESP32プラットフォームは古いバージョンのままで、新しいバージョンはサポートされてなくなりました。

      そのためplatformio.iniで別のプラットフォームを選択する必要があります

      https://docs.espressif.com/projects/arduino-esp32/en/latest/third_party_tools.html

      上記にサポートされているサードパーティーのツール一覧があるのですが、ここからPlatformIOがなくなって、pioarduinoが追加されています。

      PlatformIOはEspressifからお金をもらってサポートを追加していたので、契約が切れたみたいです。

      pioarduinoの利用方法ですがplatformio.iniで指定する必要があります。

      platform = https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip

      上記のようにプラットフォームがespressif32だけだったのが、URL指定に変わっています。

      上記のstableのところがバージョン指定になりまして、stableは最新バージョンです。通常はこれでよいのですが、バージョンを固定したい場合にはリリースのタグである「55.03.30-1」などを指定することができます。

      ただし、pio標準のespressif32はかなり古く、最新版のpioarduinoとかなり使い方が変わっていますので注意してください

      • NoRi より:

        うまくいきました。ありがとうございます。
        私もソフトを使っていろいろなESPの状態取得をしていたのですが、こちらで他にもたくさん有用な情報があるのを知って、それをなんとか取得できないかと思案しています。
        お忙しいところ、ご返信いただいけて感謝しております。

        それにしても、pioarduinoがいろいろと変わっているのに驚きました。

        • たなかまさゆき より:

          Arduinoのバージョン2から3でいろいろ変わったみたいですね
          ESP-IDFとは別の実装をArduinoはしてきたのですが、Arduino3からはなるべくESP-IDFのSDKを利用する実装に変更してきたみたいです

  2. hsenshu より:

    お世話になっております。先日は有益な助言をありがとうございました。

    さて、現在、M5StackやM5Stick用の教材を作成しています。Web socketを活用
    した教材を作成しています。

    autocanonの(厳しい?)負荷テストも、ようやく通過しました。

    しかし、PlatformIOで作成したものとArduino IDEで作成したものを比べると、
    驚くことに約2倍の性能差(Arduino IDEが上)があります。

    利用しているライブラリーは同じなので、Frameworkの違いにより性能差が
    生じていると考えています。

    そこで、この記事にあるprintBeforeSetupInfo();などでPlatformIOでの
    ライブラリを確認しようと思ったのですが上手くいきませんでした。

    iniファイルには以下のように書いています。

    [env]
    platform = espressif32@6.12.0
    framework = arduino

    諦めて自前で代替するコードを書き、以下のものを使っていることを確認しま
    した。

    ESP-IDF: 4.4.7
    Arduino Core: 2.0.17

    これを Arfduino IDEと同じ版を使用するようにはできないでしょうか。
    (Arduino Core 3.2.1、ESP-IDF 5.4.x)

    現在は、(仕方がないので)Arduino IDEでリビルドしています。

    そうか、Arduino IDE wrapper を使えばよいのかな?

    > pioarduinoの利用方法ですがplatformio.iniで指定する必要があります。
    >
    > platform = https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip

  3. hsenshu より:

    いつも有益なアドバイスに感謝申し上げます。

    pioarduino IDEを追加し、PlatformIOで作成したものをそのまま最新
    環境に移行でき、Arduino IDEと応用の性能が得られました。

    こうした情報はなかなか入手できず、困っていました。

    今後もよろしくお願いいたします。

  4. hsenshu より:

    platform-espressif32/releases/download/54.03.21-2/platform-espressif32.zip

    に移行して、重大な不具合を確認し、困っています。

    それは、SPRAMを使用するとpanicになるというものです。

    初めは何が原因なのかわからず、Serial.printを散りばめてようやく特定しました。

    短期的には、前の環境に戻せば動作するのですが、新しい版の性能を確認すると
    ぜひ新版で使いたいと思います。

    解決方法を教えてください。

  5. hsenshu より:

    補足します。

    この不具合は、pioarduino IDEでビルドしたものに発生し、Arduino IDE 2.3.7でビルド
    したものでは正常です。

    不具合は、spritで画面を操作している箇所で発生しています。

    M5unified 0.2.11を使用していますが、Arduini IDEでも同じ版を使用しているので
    このライブラリの不具合とは考えにくいです。

    • たなかまさゆき より:

      PSRAM系はPIOだとトラブル起こりやすいです
      Arduino IDEのボードマネージャだといろいろなボード設定をメニューから設定できますが、それと同じものをPIOだと自分で設定する必要があります

      たしかM5unifiedはPSRAM搭載端末の場合には、なるべくPSRAMからメモリを取得するような動きがあった気がします
      正常にPSRAMが初期化できていないのが原因かもしれません

      https://github.com/3110/m5stack-image-viewer/blob/main/platformio.ini#L277

      たとえばm5stick-c-plus2の場合

      board_build.psram_type = qio

      とかも必要かもしれません
      Arduino IDE版のボードマネージャはボード設定が最初からあって、デフォルトで動くように自動設定されています
      pioの場合には該当ボードがないのでベースにするボードから差分を自分で設定する必要があります

      https://docs.m5stack.com/ja/core/M5StickC%20PLUS2

      ここだとqioの設定していないんですがESP-IDFのバージョンあがってちゃんと指定しないとだめになったかもしれません

  6. hsenshu より:

    SPRAM関連の操作がNGなので、かなり用途が限定されます。

    2026/01/23T21:54:41, co2:411, ema_co2:412.5, ON_OFF:300, fukai:55.7, temp:12.6, hum:41.5
    Guru Meditation Error: Core 1 panic’ed (LoadProhibited). Exception was unhandled.

    Core 1 register dump:
    PC : 0x400fd06a PS : 0x00060b30 A0 : 0x800fd1f9 A1 : 0x3ffb2100
    #0 0x400fd06a in lgfx::v1::LGFX_Sprite::push_sprite(lgfx::v1::LovyanGFX*, long, long, unsigned long) at .pio/libdeps/M5StickCPlus2/M5GFX/src/lgfx/v1/LGFX_Sprite.hpp:423 (discriminator 1)
    (inlined by) lgfx::v1::LGFX_Sprite::pushSprite(long, long) at .pio/libdeps/M5StickCPlus2/M5GFX/src/lgfx/v1/LGFX_Sprite.hpp:337 (discriminator 1)
    (inlined by) sub_loop(bool) at src/main.cpp:764 (discriminator 1)

    A2 : 0x0000012c A3 : 0x3ffddfa8 A4 : 0x00000000 A5 : 0x00000000
    A6 : 0x3ffb2144 A7 : 0x3ffc8408 A8 : 0x01000000 A9 : 0x3ffb20e0
    A10 : 0x3ffb2144 A11 : 0x000000e4 A12 : 0x0000007c A13 : 0x00000010
    A14 : 0x3ffb20cc A15 : 0x3ffc8408 SAR : 0x00000010 EXCCAUSE: 0x0000001c
    EXCVADDR: 0x00000050 LBEG : 0x4008b724 LEND : 0x4008b73a LCOUNT : 0x00000000

    Backtrace: 0x400fd067:0x3ffb2100 0x400fd1f6:0x3ffb2240 0x4010382c:0x3ffb2270 0x40090ede:0x3ffb2290
    #0 0x400fd067 in lgfx::v1::LGFX_Sprite::push_sprite(lgfx::v1::LovyanGFX*, long, long, unsigned long) at .pio/libdeps/M5StickCPlus2/M5GFX/src/lgfx/v1/LGFX_Sprite.hpp:423 (discriminator 2)
    (inlined by) lgfx::v1::LGFX_Sprite::pushSprite(long, long) at .pio/libdeps/M5StickCPlus2/M5GFX/src/lgfx/v1/LGFX_Sprite.hpp:337 (discriminator 2)
    (inlined by) sub_loop(bool) at src/main.cpp:764 (discriminator 2)
    #1 0x400fd1f6 in loop() at src/main.cpp:951
    #2 0x4010382c in loopTask(void*) at C:/Users/user/.platformio/packages/framework-arduinoespressif32@src-b0a35cf7aa8c4c98d8eeed9e0597e1c2/cores/esp32/main.cpp:74
    #3 0x40090ede in vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:139

    以下のようなエラーなので、SPRAM周りの不具合は確実です。

    PLUS2用のjsonファイルも修正sたのですが、なかなか難易度が高いです。

    pioarduino 利用者が、SPRAMを使っていないとは思えないんですが、、、

  7. hsenshu より:

    依然?として改善できません(Arduino 2.0.17では動作します)。

    Arduino Core 3.2.1、ESP-IDF 5.4.xの方が性能が優れているので、これを使いたい
    のですが、SPRAMの扱いが不完全で困っています。

    素朴な疑問ですが、Arduino IDE(v2.3.7)のボードマネージャのボード毎の設定は、
    どこで行われているのでしょうか。

    ご存知であれば教えてください。参考にしたいと思います。

    • たなかまさゆき より:

      https://github.com/espressif/arduino-esp32/blob/master/boards.txt
      このファイルになります。

      m5stack_stickc_plus2.menu.PSRAM.enabled=Enabled
      m5stack_stickc_plus2.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue -mfix-esp32-psram-cache-strategy=memw
      m5stack_stickc_plus2.menu.PSRAM.enabled.build.extra_libs=
      m5stack_stickc_plus2.menu.PSRAM.disabled=Disabled
      m5stack_stickc_plus2.menu.PSRAM.disabled.build.defines=
      m5stack_stickc_plus2.menu.PSRAM.disabled.build.extra_libs=

      PSRAMの設定は上記かな?
      このボード設定と同じものにする必要がありますが、まずPIOの場合ベースになるボードを何にするかが問題になります

      https://github.com/pioarduino/platform-espressif32/blob/main/boards/m5stick-c.json

      たぶんm5stick-cになるのですが、このボード設定時自体がArduinoと設定がズレている場合があります
      なのでそこの設定でずれを全部治す必要があったりしてPIOは結構面倒です。。。

      まずはArduino IDEの設定でより詳細な情報を表示するのコンパイルにチェックをつけて、ビルドオプションを表示するようにします
      次に.ino.cppで検索して、ビルドオプションを確認します

      私の環境だと以下のオプションが追加されていました

      -DF_CPU=240000000L
      -DARDUINO=10607
      -DARDUINO_M5STACK_STICKC_PLUS2
      -DARDUINO_ARCH_ESP32
      -DARDUINO_BOARD=”M5STACK_STICKC_PLUS2″
      -DARDUINO_VARIANT=”m5stack_stickc_plus2″
      -DARDUINO_PARTITION_default_8MB
      -DARDUINO_HOST_OS=”windows”
      -DARDUINO_FQBN=”esp32:esp32:m5stack_stickc_plus2:UploadSpeed=1500000,CPUFreq=240,FlashFreq=80,FlashMode=qio,FlashSize=8M,PartitionScheme=default_8MB,DebugLevel=none,PSRAM=enabled,LoopCore=1,EventsCore=1,EraseFlash=none”
      -DESP32=ESP32
      -DCORE_DEBUG_LEVEL=0
      -DARDUINO_RUNNING_CORE=1
      -DARDUINO_EVENT_RUNNING_CORE=1
      -DBOARD_HAS_PSRAM
      -mfix-esp32-psram-cache-issue
      -mfix-esp32-psram-cache-strategy=memw
      -DARDUINO_USB_CDC_ON_BOOT=0

      FQBNの部分はArduino CLIの項目なのでpioではないはずですが、BOARD_HAS_PSRAMとmfix-esp32の行あたりが怪しいです
      PIOは最新バージョンに追従していないのと、ボードマネージャの取り扱いが昔から問題あるのでそこがちょっと面倒なんですよね
      なのでPIOは最近まったく使っていません
      PLUS2本体も見える範囲にはないのでちょっと実機確認もできていません

  8. hsenshu より:

    今回の相談で、「 PSRAM が使えない(使用するとエラー)」といった内容で
    相談しました。

    念の為、M5GFXなどに付属するサンプルなどを試しみたところ、正常に動作する
    ことを確認しました。

    つまり、M5GSXなどのAPI(PSRAMも含めて)Core 3.xで使えるようです。

    依然として私の作成したコードで動作しないのですが、まだ原因は理解って
    いません(Core 2.xに戻すと動作し、Arduino IDE ver2.3.7でもOkです)。

    情報が不十分なまま相談してしまって、すみません。

    サンプルコードとの違いは、WiFi接続などの機能を使っている点ですが、もう
    少し調べてみます。

  9. hsenshu より:

    参考までに、以下が私が作成した M5stickc_plus2用のjsonファイルです。

    これで、pioarduino IDEのarduino core 3.x環境でM5GSXのサンプルの
    動作確認ができました。

    {
    “build”: {
    “arduino”: {
    “ldscript”: “esp32_out.ld”,
    “partitions”: “default_8MB.csv”,
    “memory_type”: “qio_opi”
    },
    “core”: “esp32”,
    “extra_flags”: [
    “-DARDUINO_M5Stick_C_PLUS2”,
    “-DBOARD_HAS_PSRAM”,
    “-mfix-esp32-psram-cache-issue”,
    “-mfix-esp32-psram-cache-strategy=memw”
    ],
    “f_cpu”: “240000000L”,
    “f_flash”: “80000000L”,
    “flash_mode”: “qio”,
    “psram_type”: “qio”,
    “mcu”: “esp32”,

    “variant”: “m5stack_stickc_plus2”,
    “variant_path”: “variants/m5stack_stickc_plus2”
    },

    “connectivity”: [“wifi”, “bluetooth”],
    “frameworks”: [“arduino”, “espidf”],
    “name”: “M5StickC_PLUS2”,

    “upload”: {
    “flash_size”: “8MB”,
    “maximum_ram_size”: 327680,
    “maximum_size”: 8388608,
    “require_upload_port”: true,
    “speed”: 1500000
    },

    “url”: “https://docs.m5stack.com/en/core/M5StickC%20PLUS2”,
    “vendor”: “M5Stack”
    }

  10. hsenshu より:

    その後の報告です。

    pushSprite()を呼んだ直後にcrashしていました。試しにpushSprite()を
    コメントにするとcrashしません(表示もしませんが、問題の切り分け
    用です)。

    内部ではM5GFXを呼び出しているのですが、何らかの(メモリーの扱い?)
    不具合があるのだと思います。

    M5GFXのメモリーの扱いで、PSRAMの利用を止めるような指示は可能でしょうか。

    PSRAM通常の操作は可能なので、M5GFXのPSRAM利用を制御したいです。

  11. hsenshu より:

    お騒がせしました。解決しました。

    ☓ canvas.pushSprite(0, 0); // ここで一括描画し、チラツキを回避する

    ◯ canvas.pushSprite(&M5.Lcd, 0, 0); // ここで一括描画し、チラツキを回避する

    一箇所に &M5.Lcd, を追加したら動作するようになりました。

  12. hsenshu より:

    この不具合は、私が、やや古い宣言を使っていたことに起因します。

    私は、互換性のために残されていた M5Canvas canvas(&M5.Lcd); を使用して
    いました。

    現在は M5Canvas canvas(&M5.Display); が標準のようです。

    M5Canvas canvas(&M5.Lcd); と書いた場合には、 canvas.pushSprite(&M5.Lcd, 0, 0);
    と書かないと、内部エラーになるようです。

    なお、Arduino IDEではこの不具合は起きないので、どこかで補っているのでしょう。