Task watchdog got triggered. The following tasks did not reset the watchdog in time:
- Войдите на сайт для отправки комментариев
Чт, 05/05/2022 - 12:16
Решил в отдельую тему перетащить вопрос. Контроллер ESP32, в среднем через 45 минут слышен лай сторожевого пса. Далее контроллер самопроизвольно отправляется в перезагрузку.
E (2653082) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time: E (2653082) task_wdt: - async_tcp (CPU 1) E (2653082) task_wdt: Tasks currently running: E (2653082) task_wdt: CPU 0: IDLE0 E (2653082) task_wdt: CPU 1: IDLE1 E (2653082) task_wdt: Aborting. abort() was called at PC 0x40145438 on core 0 ELF file SHA256: 0000000000000000 Backtrace: 0x40089080:0x3ffbf8d0 0x400892fd:0x3ffbf8f0 0x40145438:0x3ffbf910 0x40087721:0x3ffbf930 0x4015e4a3:0x3ffbc280 0x40146d33:0x3ffbc2a0 0x4008bacd:0x3ffbc2c0 0x4008a30e:0x3ffbc2e0 Rebooting... ets Jun 8 2016 00:22:57
Если я правильно понимаю из сообщений сериал монтора, то библиотека async_tcp активно использует лишь одно ядро, CPU 1? В то время как CPO 0 простаивает. Напрашивается вывод, что необходимо сделать одно из..
1) Организовать сброс сторожевого таймера
2) Распределить задачи между ядрами
3) Как особый случай, вообще отключить нафиг этого пса.
Поправьте если ошибаюсь и как вообще на практике сие реализовать?
-сброс WDT нужен однозначно из за его идеологии каждый проход loop, иначе зачем вы его вообще используете.
-наверно много задержек в коде используете, поэтому МК и сбрасывается.
ЗЫ. В последнем проекте убрал WDT поскольку не могу контролировать библиотеки WiFi и HTTP клиент (точнее необходимо ковырять чужой код), когда сервер недоступен, происходит сильная задержка, до 40 секунд. Минимум сутки uptime, работает норм.
-сброс WDT нужен однозначно из за его идеологии каждый проход loop, иначе зачем вы его вообще используете.
-наверно много задержек в коде используете, поэтому МК и сбрасывается.
Делаев почти нет. Хотя нет, один на 1000 мсек используется. Это у меня из-за вывода остатка времени по millis. Таймеры там у меня. Если вот этот кусок кода убираю, то всё становится на свои места.
Вот именно сброс WDT и не знаю как правильно сделать.
ЗЫ. В последнем проекте убрал WDT поскольку не могу контролировать библиотеки WiFi и HTTP клиент
Если не выйдет первое, тогда так и поступлю.
yield() в цикле.
Или форк на второе ядро.
Не, на esp32 не нужно "отдаваться" другим потокам. Там это успешно делает сама RTOS.
В вот красивая строчка "backtrace" может оооочень помочь. Яндексим: "Esp exception decoder". Вот , если вдруг яндексу не доверяете https://github.com/me-no-dev/EspExceptionDecoder/releases/tag/2.0.2
И ошибка ваша , скорее всего, потому что отправляете что то клиенту, который уже отвалился.
То brokly: А если оправлять клиенту который отвалился, то ESP после такого всегда уходит в ребут?
Не, на esp32 не нужно "отдаваться" другим потокам. Там это успешно делает сама RTOS.
В вот красивая строчка "backtrace" может оооочень помочь. Яндексим: "Esp exception decoder". Вот , если вдруг яндексу не доверяете https://github.com/me-no-dev/EspExceptionDecoder/releases/tag/2.0.2
И ошибка ваша , скорее всего, потому что отправляете что то клиенту, который уже отвалился.
Вот что мне на это ответил "ESP exception decoder"
Только еще больще запутался. Причем тут линуксовые директории? ))
В том то и дело, что клиент даже и не думал отваливатся. Отваливается лишь во время ребута ESP. Что естественно. Да и не должен он ребутится не зависимо от того подключен клиент или нет.
yield() в цикле.
Или форк на второе ядро.
yield() Не поможет. Он лишь помогает крутить код даже тогда, когда делей всё остальное тормознул. Нет у меня делеев. Про вилку на второе ядро понятия не имею. Почитаю, попробую.
https://exploreembedded.com/wiki/Hello_World_with_ESP32_Explained << xTaskCreate
https://randomnerdtutorials.com/esp32-dual-core-arduino-ide/ << xTaskCreatePinnedToCore
https://randomnerdtutorials.com/esp32-dual-core-arduino-ide/ << xTaskCreatePinnedToCore
Спасибо, отличный урок! Как раз то что нужно. Буду эсперементировать, потом отпишусь.