ESP32栈空间不足,设备崩溃反复重启解决方法

问题:在esp32的程序长时间运行后,突然崩溃,设备反复重启,并提示栈空间溢出。

        文末提供了如何关闭esp32崩溃后,因设备反复重启不利于查找错误、程序调试的办法。

***ERROR*** A stack overflow in task main has been detected

ESP32栈空间不足,设备崩溃反复重启解决方法_第1张图片

esp32c3修改内存堆栈大小

方法一:因程序是在主函数进行调用的,故而是主函数的堆栈空间不足,修改主函数的堆栈空间解决问题。

在终端输入命令:idf.py menuconfig

在弹出的图像界面中

选择component config

ESP32栈空间不足,设备崩溃反复重启解决方法_第2张图片

选择Common ESP-related

ESP32栈空间不足,设备崩溃反复重启解决方法_第3张图片

选择Main task stack size,修改数值为合适的大小

ESP32栈空间不足,设备崩溃反复重启解决方法_第4张图片

方法二:将代码以线程任务的形式创建,在创建任务的时候设置合适的堆栈大小

BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, 
                         const char * const pcName, 
                         unsigned short usStackDepth, 
                         void *pvParameters, 
                         UBaseType_t uxPriority, 
                         TaskHandle_t *pxCreatedTask );

查询当前可用的栈空间大小

printf("in app_main the min free stack size is %d \r\n", (int32_t)uxTaskGetStackHighWaterMark(NULL));

程序正常运行,没有栈空间不足的问题

ESP32栈空间不足,设备崩溃反复重启解决方法_第5张图片

开发工具版本更新后设置main函数stack的方法:

ESP32栈空间不足,设备崩溃反复重启解决方法_第6张图片

ESP32栈空间不足,设备崩溃反复重启解决方法_第7张图片

如何关闭设备崩溃反复重启

在ESP-IDF中,你可以通过以下步骤来配置ESP32C3的重启行为:

1. 打开终端并导航到你的项目目录。

2. 运行idf.py menuconfig命令来打开配置菜单。

ESP32栈空间不足,设备崩溃反复重启解决方法_第8张图片

3. 在配置菜单中,导航到Component config > ESP System settings。

ESP32栈空间不足,设备崩溃反复重启解决方法_第9张图片

4. 在ESP System settings下,你会看到一个选项Panic handler behaviour。这个选项决定了当ESP32C3发生panic(例如由于内核错误或异常)时的行为。

ESP32栈空间不足,设备崩溃反复重启解决方法_第10张图片

5. 在Panic handler behaviour选项中,你可以选择以下几种行为:

- Print registers and reboot:打印寄存器状态并重启。这是默认选项,如果你想关闭重启,你需要选择其他选项。

- Print registers and halt:打印寄存器状态并停止。选择这个选项后,ESP32C3在发生panic时将不会重启。

- Do nothing:不做任何事情。选择这个选项后,ESP32C3在发生panic时将不会重启,也不会打印任何信息。

- Invoke gdbstub:调用gdbstub进行调试。选择这个选项后,ESP32C3在发生panic时将进入调试模式,不会重启。

ESP32栈空间不足,设备崩溃反复重启解决方法_第11张图片

6. 选择你想要的行为,然后按保存配置,最后按退出配置菜单。

7. 运行idf.py build命令来编译并应用新的配置。

        请注意,关闭重启可能会使你无法通过重启来恢复设备的正常运行。在关闭重启之前,你应该确保你知道如何处理panic和其他错误。

你可能感兴趣的:(ESP32系列经验教程,arm开发,mcu,risc-v,c++,物联网,驱动开发)