LoginSignup
2
0

More than 3 years have passed since last update.

ESP32でスタックオバーフローが起こった時の対処法

Posted at

はじめに

先日、ESP-IDFで、ESP32-CAMでプログラムを組んでいた際、スタックオーバーフローが起こったので、まとめておきます
なお、環境は以下のようになっています

  • MacOS10.15(Catalina)
  • ESP-IDFv3.3
  • Xcode10.0

What happen? -何が起こったのか-

まず、起こったのは、単純なスタックオバーフローでした

スクリーンショット 2020-03-26 19.25.36.png

このスクリーンショットにもあるように、
エラーコードは0x40085130でスタックオバーフローのエラーがファイルから出力されています
これに対し、自分は、以下のように対処しました

What were you doing? -どんなことを試したのか-

スクリーンショット 2020-03-26 19.26.30.png
まずapp_main関数から、タスクとして、今まで使ってきたものを呼びだし、スタックサイズを調節しました。

しかし、この結果、一部の関数で不具合(具体的にはカメラの垂直同期に失敗)が発生します。

そこで、別のアプローチから、問題解決を試みます
スクリーンショット 2020-03-30 21.09.40.png
スクリーンショット 2020-03-30 21.10.04.png
スクリーンショット 2020-03-30 21.10.14.png

make menuconfig->Componet config->ESP32-spefig
の順に辿ると,Main task stack sizeの設定がありここから操作できます
私は、このスタックサイズを変え、プログラムのコードも元に戻しました
しかし、まだスタックオバーフローは解決していませんでした

Why is this? -エラー、治らず-

スクリーンショット 2020-03-30 14.52.18.png

この写真にもあるように、今度はファイルから呼び出される前に、ファームウェア?から呼び出されています。

私は、そのまま、メインタスクのスタックサイズを増やし続けましたが結果は変わらず。。。

Finally -結論-

結論として、実は、容量が足りていないのはメインタスクではなかったのです。
多分、自分より、スキルの高い方はお気づきかもしれませんがアイドルタスクのスタックサイズが不足していました。
そもそもアイドルタスクとは

アイドルタスクとは優先度0(最低)で、他に実行条件を満たすタスクが存在しない場合に実行権が与えられて、無駄な電力を消費しないようにするタスクです。 http://www2.denshi.numazu-ct.ac.jp/lego/brickOS/task/task.html

つまり、スタックサイズの設定場所も異なっています。
スクリーンショット 2020-03-30 21.26.34.png
スクリーンショット 2020-03-30 21.26.50.png
スクリーンショット 2020-03-30 21.27.02.png
このように、make menuconfig->Component config->FreeRTOS
と辿ると Idle Task stack sizeと設定があり、ここをいじるとうまく解決してくれます

最後に

最後までお読みいただきありがとうございます
ご参考になられましたらありがたいです

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0