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を利用する実装に変更してきたみたいです