nstrFetchProhibited,stack overflow,Task watchdog got triggered解决办法


一些是在ESP32上跑FreeRTOS上遇到的各种问题,坑实在是太多了
遇到问题可以参考这个网站:
API指南–严重错误


1.空指针产生 nstrFetchProhibited

Guru Meditation Error: Core 0 panic’ed (InstrFetchProhibited). Exception was unhandled.
Core 0 register dump:
PC : 0xa5a5a5a5 PS : 0x00050033 A0 : 0xa5a5a5a5 A1 : 0x3ffb2e30
A2 : 0xa5a5a5a5 A3 : 0xa5a5a5a5 A4 : 0xa5a5a5a5 A5 : 0xa5a5a5a5
A6 : 0xa5a5a5a5 A7 : 0xa5a5a5a5 A8 : 0xa5a5a5a5 A9 : 0xa5a5a5a5
A10 : 0xa5a5a5a5 A11 : 0xa5a5a5a5 A12 : 0xa5a5a5a5 A13 : 0xa5a5a5a5
A14 : 0xa5a5a5a5 A15 : 0xa5a5a5a5 SAR : 0x00000025 EXCCAUSE: 0x00000014
EXCVADDR: 0xa5a5a5a4 LBEG : 0xa5a5a5a5 LEND : 0xa5a5a5a5 LCOUNT : 0xa5a5a5a5

在网上找了半天没有解决,最后在ESP编程指南找到这个问题
InstrFetchProhibited,此 CPU 异常表示 CPU 无法加载指令,因为指令的地址不在 IRAM 或者 IROM 中的有效区域中

通常这意味着代码中调用了并不指向有效代码块的函数指针。这种情况下,可以查看 PC (程序计数器)寄存器的值并做进一步判断:若为 0 或者其它非法值(即只要不是 0x4xxxxxxx 的情况),则证实确实是该原因

这就是可能你程序中存在着空指针!!!

2.栈溢出问题

ERROR A stack overflow in task task1_task has been detected.

给每个任务函数所分配的栈空间比较小,一般试着将任务函数的栈空间改大一些,esp32不知道能不能查询freertos 统计任务状态和堆栈使用空间

堆栈使用情况和堆栈溢出检查 :堆栈使用和检测

3.看门狗问题

E (10151) task_wdt: Task watchdog got triggered. The following tasks did not reset

ESP为空闲任务创建一个看门狗计时器,以及执行您工作的任何任务,它创建了两个额外的任务IDLE0和IDLE 1(每个内核一个),其唯一目的是什么都不做,即空闲。这些空闲任务只是在看门狗各自的内核空转时为其供电

每当ESP中的任何任务以及中断例程以比IDLE任务更高的优先级运行时,而不会延迟或阻止足够长/足够频繁(在紧密的while循环中执行时),它会触发监视程序,因为该内核现在完全繁忙,这意味着它不再经常空闲, 这意味着空闲的"任务"会挨饿,因此它们无法重置看门狗, loop() 以比 IDLE 任务更高的优先级运行

所以,必须进行一些调用,以足够的间隔阻止您的代码至少10mS

如果你希望任务看门狗触发之后进行重启可以试着调用panic handler :在 make menuconfig --> Component config --> ESP32-specific选中 Invoke panic handler on Task Watchdog timeout


总结

提示:这里对文章进行总结:

没想到刚上手这玩意都会出现这么多问题啊

Guess you like

Origin blog.csdn.net/qq_53144843/article/details/121499730
got