概要
デバッグレベルを変更したところ、起動時に便利な情報が表示されていたので確実に表示させる方法を紹介したいと思います。
起動時の表示項目
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の状態がわかるので、明示的に呼び出して便利に使える関数だと思います。



コメント
いつも有用な記事いつもありがとうございます。大変参考にさせていただいています。
実は、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とかなり使い方が変わっていますので注意してください
うまくいきました。ありがとうございます。
私もソフトを使っていろいろなESPの状態取得をしていたのですが、こちらで他にもたくさん有用な情報があるのを知って、それをなんとか取得できないかと思案しています。
お忙しいところ、ご返信いただいけて感謝しております。
それにしても、pioarduinoがいろいろと変わっているのに驚きました。
Arduinoのバージョン2から3でいろいろ変わったみたいですね
ESP-IDFとは別の実装をArduinoはしてきたのですが、Arduino3からはなるべくESP-IDFのSDKを利用する実装に変更してきたみたいです
お世話になっております。先日は有益な助言をありがとうございました。
さて、現在、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
https://github.com/tanakamasayuki/esp32-arduino-test
ここに各バージョンの対応が書いてあります
espressif32@6.12.0だと2.0.17(2024/05/22)ですね
pioarduinoの使い方も下の方に書いてありますが
platform = https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip
上記が最新バージョンとなります
バージョンを固定する場合(教材の場合固定が好ましいです)
platform = https://github.com/pioarduino/platform-espressif32/releases/download/54.03.21-2/platform-espressif32.zip
上記のようにバージョン番号を指定したURLにします。
54.03.21-2は3.2.1に対応するバージョンのはずです
arduino-cliを使うのであれば上記のツールや、コマンドラインから設定ファイルのバージョン指定ができて、中身はArduino IDEと同じ処理にすることができます
初心者向きですとArduino IDEが好ましいですが、バージョンが固定できないので教材だと若干最新バージョンで常に確認する手間ができてしまいます
PlatformIO用のplatform.iniもしくはarduino-cli用のsketch.yamlを使うのであればバージョンが指定できます
VS CODEを使うのであればvscode-arduino-cli-wrapper拡張を使うことで、最新バージョンをチェックしてsketch.yamlを更新する機能とか、開いているフォルダ配下にある全プロジェクトをビルドしてエラーが無いかを確認する機能などがあります
arduino-cliはArduino IDEと互換性があり、sketch.yamlを使うか使わないかなどの差なので、Arduino IDE向けでもarduino-cliでビルドや実行をしても結果はかわらない利点があります
注意点として
sketch.yamlを使わないarduino-cliはArduino IDEと全く同じ環境を利用します(Arduino IDEからarduino-cliを呼び出している)
sketch.yamlを使うarduino-cliはArduino IDEと別の環境に、指定されたバージョンのライブラリとボードの環境を作成してビルドします
いつも有益なアドバイスに感謝申し上げます。
pioarduino IDEを追加し、PlatformIOで作成したものをそのまま最新
環境に移行でき、Arduino IDEと応用の性能が得られました。
こうした情報はなかなか入手できず、困っていました。
今後もよろしくお願いいたします。
platform-espressif32/releases/download/54.03.21-2/platform-espressif32.zip
に移行して、重大な不具合を確認し、困っています。
それは、SPRAMを使用するとpanicになるというものです。
初めは何が原因なのかわからず、Serial.printを散りばめてようやく特定しました。
短期的には、前の環境に戻せば動作するのですが、新しい版の性能を確認すると
ぜひ新版で使いたいと思います。
解決方法を教えてください。
補足します。
この不具合は、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のバージョンあがってちゃんと指定しないとだめになったかもしれません
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を使っていないとは思えないんですが、、、
依然?として改善できません(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本体も見える範囲にはないのでちょっと実機確認もできていません
今回の相談で、「 PSRAM が使えない(使用するとエラー)」といった内容で
相談しました。
念の為、M5GFXなどに付属するサンプルなどを試しみたところ、正常に動作する
ことを確認しました。
つまり、M5GSXなどのAPI(PSRAMも含めて)Core 3.xで使えるようです。
依然として私の作成したコードで動作しないのですが、まだ原因は理解って
いません(Core 2.xに戻すと動作し、Arduino IDE ver2.3.7でもOkです)。
情報が不十分なまま相談してしまって、すみません。
サンプルコードとの違いは、WiFi接続などの機能を使っている点ですが、もう
少し調べてみます。
参考までに、以下が私が作成した 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”
}
その後の報告です。
pushSprite()を呼んだ直後にcrashしていました。試しにpushSprite()を
コメントにするとcrashしません(表示もしませんが、問題の切り分け
用です)。
内部ではM5GFXを呼び出しているのですが、何らかの(メモリーの扱い?)
不具合があるのだと思います。
M5GFXのメモリーの扱いで、PSRAMの利用を止めるような指示は可能でしょうか。
PSRAM通常の操作は可能なので、M5GFXのPSRAM利用を制御したいです。
お騒がせしました。解決しました。
☓ canvas.pushSprite(0, 0); // ここで一括描画し、チラツキを回避する
↓
◯ canvas.pushSprite(&M5.Lcd, 0, 0); // ここで一括描画し、チラツキを回避する
一箇所に &M5.Lcd, を追加したら動作するようになりました。
この不具合は、私が、やや古い宣言を使っていたことに起因します。
私は、互換性のために残されていた M5Canvas canvas(&M5.Lcd); を使用して
いました。
現在は M5Canvas canvas(&M5.Display); が標準のようです。
M5Canvas canvas(&M5.Lcd); と書いた場合には、 canvas.pushSprite(&M5.Lcd, 0, 0);
と書かないと、内部エラーになるようです。
なお、Arduino IDEではこの不具合は起きないので、どこかで補っているのでしょう。