问题:在esp32的程序长时间运行后,突然崩溃,设备反复重启,并提示栈空间溢出。
文末提供了如何关闭esp32崩溃后,因设备反复重启不利于查找错误、程序调试的办法。
***ERROR*** A stack overflow in task main has been detected
esp32c3修改内存堆栈大小
方法一:因程序是在主函数进行调用的,故而是主函数的堆栈空间不足,修改主函数的堆栈空间解决问题。
在终端输入命令:idf.py menuconfig
在弹出的图像界面中
选择component config
选择Common ESP-related
选择Main task stack size,修改数值为合适的大小
方法二:将代码以线程任务的形式创建,在创建任务的时候设置合适的堆栈大小
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));
程序正常运行,没有栈空间不足的问题
开发工具版本更新后设置main函数stack的方法:
如何关闭设备崩溃反复重启
在ESP-IDF中,你可以通过以下步骤来配置ESP32C3的重启行为:
1. 打开终端并导航到你的项目目录。
2. 运行idf.py menuconfig命令来打开配置菜单。
3. 在配置菜单中,导航到Component config > ESP System settings。
4. 在ESP System settings下,你会看到一个选项Panic handler behaviour。这个选项决定了当ESP32C3发生panic(例如由于内核错误或异常)时的行为。
5. 在Panic handler behaviour选项中,你可以选择以下几种行为:
- Print registers and reboot:打印寄存器状态并重启。这是默认选项,如果你想关闭重启,你需要选择其他选项。
- Print registers and halt:打印寄存器状态并停止。选择这个选项后,ESP32C3在发生panic时将不会重启。
- Do nothing:不做任何事情。选择这个选项后,ESP32C3在发生panic时将不会重启,也不会打印任何信息。
- Invoke gdbstub:调用gdbstub进行调试。选择这个选项后,ESP32C3在发生panic时将进入调试模式,不会重启。
6. 选择你想要的行为,然后按保存配置,最后按退出配置菜单。
7. 运行idf.py build命令来编译并应用新的配置。
请注意,关闭重启可能会使你无法通过重启来恢复设备的正常运行。在关闭重启之前,你应该确保你知道如何处理panic和其他错误。