起因是在task里执行sntp初始化时,有时会因为网络问题花了太长时间导致log报狗死了。虽然没有重启也不会影响功能但是log很多error看着很困扰,所以想看看能不能喂狗喂上。于是添加了以下代码
error = esp_task_wdt_add(uxTask_Handler);
ESP_LOGI(UX_TAG,"%d",error);
error = esp_task_wdt_reset();
ESP_LOGI(UX_TAG,"%d",error);
HA_Esp_Sntp_Init();
error = esp_task_wdt_reset();
ESP_LOGI(UX_TAG,"%d",error);
HA_delay_ms(6000);
error = esp_task_wdt_reset();
ESP_LOGI(UX_TAG,"%d",error);
sec_print_rtc_notify();
mqtt_client_init();
esp_task_wdt_delete(uxTask_Handler);
在menuconfig里设置的timeout for RTC watchdog是9000ms,我认为如果喂狗喂上了应该狗是不会死的
但是log里还是出了
E (7713) task_wdt: Task watchdog got triggered. The following tasks/users did not reset the watchdog in time:
E (7713) task_wdt: - IDLE (CPU 0)
E (7713) task_wdt: Tasks currently running:
E (7713) task_wdt: CPU 0: ux_task
E (7713) task_wdt: Print CPU 0 (current core) registers
并且看esp_task_wdt_reset的结果都是0应该是成功的,但是还是没喂上
esp32-c3 喂狗问题
-
- Posts: 156
- Joined: Tue Jul 11, 2023 6:55 am
Re: esp32-c3 喂狗问题
你好,看门狗设计的逻辑就是为了避免在一个任务中滞留时间过长。请参考:https://docs.espressif.com/projects/esp ... timer-twdt
根据你的描述,是因为网络问题在 HA_Esp_Sntp_Init() 花费了过长的时间。遇到这种情况建议优化代码逻辑。你也可以在 HA_Esp_Sntp_Init() 中添加喂狗机制,调高看门狗 timeout 的时长,或者调高另一个 task 的优先级跳到另一个 task 中喂狗。但是这样就违背了使用看门狗的初衷,因为使用看门狗的目的就是为了避免在某一个 task 花费过长的时间。
下面是一些建议:
1. 将 HA_Esp_Sntp_Init() 的功能拆开,或者在 HA_Esp_Sntp_Init() 中的一些 API执行前添加延时让 idel task 获得机会执行喂狗。
2. 在 HA_Esp_Sntp_Init() 中添加 timeout 机制
根据你的描述,是因为网络问题在 HA_Esp_Sntp_Init() 花费了过长的时间。遇到这种情况建议优化代码逻辑。你也可以在 HA_Esp_Sntp_Init() 中添加喂狗机制,调高看门狗 timeout 的时长,或者调高另一个 task 的优先级跳到另一个 task 中喂狗。但是这样就违背了使用看门狗的初衷,因为使用看门狗的目的就是为了避免在某一个 task 花费过长的时间。
下面是一些建议:
1. 将 HA_Esp_Sntp_Init() 的功能拆开,或者在 HA_Esp_Sntp_Init() 中的一些 API执行前添加延时让 idel task 获得机会执行喂狗。
2. 在 HA_Esp_Sntp_Init() 中添加 timeout 机制
Re: esp32-c3 喂狗问题
error = esp_task_wdt_reset();
ESP_LOGI(UX_TAG,"%d",error);
HA_delay_ms(6000);
error = esp_task_wdt_reset();
但是我在当前task中只执行这段代码也会死,所以怀疑是没有喂上狗
ESP_LOGI(UX_TAG,"%d",error);
HA_delay_ms(6000);
error = esp_task_wdt_reset();
但是我在当前task中只执行这段代码也会死,所以怀疑是没有喂上狗
Who is online
Users browsing this forum: No registered users and 166 guests