#はじめに
先日、ESP-IDFで、ESP32-CAMでプログラムを組んでいた際、スタックオーバーフローが起こったので、まとめておきます
なお、環境は以下のようになっています
- MacOS10.15(Catalina)
- ESP-IDFv3.3
- Xcode10.0
What happen? -何が起こったのか-
まず、起こったのは、単純なスタックオバーフローでした
このスクリーンショットにもあるように、
エラーコードは0x40085130
でスタックオバーフローのエラーがファイルから出力されています
これに対し、自分は、以下のように対処しました
What were you doing? -どんなことを試したのか-
まずapp_main関数から、タスクとして、今まで使ってきたものを呼びだし、スタックサイズを調節しました。
しかし、この結果、一部の関数で不具合(具体的にはカメラの垂直同期に失敗)が発生します。
make menuconfig->Componet config->ESP32-spefig
の順に辿ると,Main task stack sizeの設定がありここから操作できます
私は、このスタックサイズを変え、プログラムのコードも元に戻しました
しかし、まだスタックオバーフローは解決していませんでした
Why is this? -エラー、治らず-
この写真にもあるように、今度はファイルから呼び出される前に、**ファームウェア?**から呼び出されています。
私は、そのまま、メインタスクのスタックサイズを増やし続けましたが結果は変わらず。。。
#Finally -結論-
結論として、実は、容量が足りていないのはメインタスクではなかったのです。
多分、自分より、スキルの高い方はお気づきかもしれませんがアイドルタスクのスタックサイズが不足していました。
そもそもアイドルタスクとは
アイドルタスクとは優先度0(最低)で、他に実行条件を満たすタスクが存在しない場合に実行権が与えられて、無駄な電力を消費しないようにするタスクです。 http://www2.denshi.numazu-ct.ac.jp/lego/brickOS/task/task.html
つまり、スタックサイズの設定場所も異なっています。
このように、make menuconfig->Component config->FreeRTOS
と辿ると Idle Task stack sizeと設定があり、ここをいじるとうまく解決してくれます
#最後に
最後までお読みいただきありがとうございます
ご参考になられましたらありがたいです