M5Stackで発生したGuru Meditation Errorの原因と対策
M5Stack系マイコンで、Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.と表示された後、マイコンがリセットされる問題が発生しました。原因分析結果を整理します。
1. Guru Meditation Errorが発生
M5Stack系マイコン(今回はFire)でコンパイル後、プログラムが実行されるのですが、シリアルモニタに下記エラーが表示され、マイコンがリセットされる問題が発生しました。
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
コンパイル時のエラーであれば、どの行がエラーなのか表示されます。一方、このエラーはプログラム実行時のエラーであり、この内容からは何が原因でエラーが発生しているのかよくわかりません。。
Serial.printを追加したり、コードを消したりしながら、どのコードでエラーが発生しているのか分析しました。
2. PSRAMの競合が原因だった
結果的にPSRAMの競合が原因と思われます。M5Stack Fireの公式ページを見ると、下記の通り書かれていました。
今回のプログラムは、PortCをシリアル通信に使用し、さらに、ESP-NOWやSDカードへの書き込みも行うものでした。
リセットされるタイミングは、SDカードへの書き込み関連コード実行時でした。しかし、SDカード関連コードに不具合は見当たらず、色々と試してみると、シリアル通信をコメントアウトするとリセットされないことがわかりました。ここで、M5Stack Fireの公式ページを見ると、PSRAMの記述があり、さらに、M5Stack Fireにおいて、 GPIO16/17はPortCに使用されていることから、PSRAMが原因だと推定しました。正直、どのタイミングでPSRAMが使用されるのかがよくわかっていませんが、結果的にはこれが原因だと思われます。
対策として、ArduinoIDE→ツール→PSRAM→Disabledと選択し、PSRAMを使用しない設定にすることで、リセットが回避されました。
3. その他の原因
今回のGuru Meditation Errorの原因は、PSRAMの競合だと推定しました。しかし、以前にも同じエラーでリセットされる問題が発生していました。
その際の原因は、
char buf[100];で宣言していたバッファーに、sprintf(buf, "XXXX...");で文字列を代入する際、宣言を超える文字列(この例の場合は100)を書き込んだこと
割り込み関連
SDカード関連
ESP-NOW関連
だったと記憶しています。
Guru Meditation Errorが発生した際に、着目したい項目です。
4. まとめと今後の課題
SDカード関連コードで、Guru Meditation Errorおよびリセットが発生したため、SDカード関連コードを見直していたのですが、結果的にPSRAMだったとは。中々気づけませんでした。プロのエンジニアは、どういう思考回路で問題解決するのでしょうか。バグ取りの思考回路が気になります。
参考文献
・M5Stack Fireの公式ページ。PSRAMの競合注意と思いっきり書かれています。