以下のようなログ出力が出てきました
Guru Meditation Error: Core 0 panic'ed (Stack protection fault).
Detected in task "ntp_task" at 0x40802358
Stack pointer: 0x40832a60
Stack bounds: 0x40832a8c - 0x40833a80
Core 0 register dump:
MEPC : 0x4080fa4a RA : 0x40802372 SP : 0x40832a60 GP : 0x4081bd04
TP : 0x40833a80 T0 : 0x4002685e T1 : 0x10000000 T2 : 0x776d6d2f
S0/FP : 0x40832aac S1 : 0x4082b528 A0 : 0x00000002 A1 : 0xffffffff
A2 : 0x00000004 A3 : 0x0000000a A4 : 0x00000000 A5 : 0x00000000
A6 : 0xa0000000 A7 : 0x0000000a S2 : 0xffffffff S3 : 0x00000004
S4 : 0x40832c64 S5 : 0x40832c50 S6 : 0x420f4b4e S7 : 0x00000000
S8 : 0x00000008 S9 : 0x0000001b S10 : 0xffffffff S11 : 0x40832c64
T3 : 0x00000000 T4 : 0x408330d0 T5 : 0x00000005 T6 : 0xd0000000
MSTATUS : 0x00001881 MTVEC : 0x40800003 MCAUSE : 0x0000001b MTVAL : 0x00000000
MHARTID : 0x00000000
Backtrace: 0x4080fa4a:0x40832a60 0x40802370:0x40832a60 0x40802530:0x40832a90 0x40802606:0x40832aa0 0x40026868:0x40832ac0
Backtrace ended abruptly: cannot find DWARF information for instruction at address 0x40026868
読み解いて解決していきます。
大事なところ
Detected in task "ntp_task"
Stack pointer: 0x40832a60
Stack bounds: 0x40832a8c - 0x40833a80
が重要で、計算すると
SP = 0x40832a60
下限 = 0x40832a8c
なので、SP が下限より 44byte も下になっています。
つまりかなり高確率でスタックオーバーフローだと分かります。
解決方法
タスク生成時にスタック容量を決めることができるので、増やします。
元々
xTaskCreate(ntp_task, "ntp_task", 4096, NULL, 5, &ntpTaskHandle);
↓
修正
xTaskCreate(ntp_task, "ntp_task", 8192, NULL, 5, &ntpTaskHandle);
これによって、スタックオーバーフローがなくなり、問題なく動作するようになりました。
まとめ
Stack protection faultが出たら、指摘されたタスクの容量を増やす

コメント