Task watchdog got triggered. The following tasks did not reset the watchdog in time:

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021

Решил в отдельую тему перетащить вопрос. Контроллер 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) Как особый случай, вообще отключить нафиг этого пса.

Поправьте если ошибаюсь и как вообще на практике сие реализовать?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

-сброс WDT нужен однозначно из за его идеологии каждый проход loop, иначе зачем вы его вообще используете.
-наверно много задержек в коде используете, поэтому МК и сбрасывается.

ЗЫ. В последнем проекте убрал WDT поскольку не могу контролировать библиотеки WiFi и HTTP клиент (точнее необходимо ковырять чужой код), когда сервер недоступен, происходит сильная задержка, до 40 секунд. Минимум сутки uptime, работает норм.

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021

andycat пишет:

-сброс WDT нужен однозначно из за его идеологии каждый проход loop, иначе зачем вы его вообще используете.
-наверно много задержек в коде используете, поэтому МК и сбрасывается.

Делаев почти нет. Хотя нет, один на 1000 мсек используется. Это у меня из-за вывода остатка времени по millis. Таймеры там у меня. Если вот этот кусок кода убираю, то всё становится на свои места. 

uint32_t previousMillis = 0;
const long interval = 5000; // Считываем каждые 5 секунд.
 
void loop() {
  uint32_t currentMillis = millis();
  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;   
     {
      uint32_t remains = 3 * 3600000 - millis();      // остаток времени в милисекундах (где 3, это 3 часа)
      uint8_t H = remains / 3600000;                  // часы
      uint8_t M = (remains % 3600000) / 60000;        // минуты
      uint8_t S = (remains % 3600000) / 1000 % 60;    // секунды

      if (Auto == "true" && !ledState)
      {
        char buffer[9];                               // задаем кол-во знаков
        sprintf(buffer1, "%02d:%02d:%02d", H1, M, S); // формат чч:мм:cc
        Serial.println(buffer);                       // отправляем обратный остчет времени в монитор
        ws.textAll("buffer=" + String(buffer));       // отправляем обратный остчет времени http клиенту
      }
    }
  }
}

Вот именно сброс WDT и не знаю как правильно сделать.

andycat пишет:

ЗЫ. В последнем проекте убрал WDT поскольку не могу контролировать библиотеки WiFi и HTTP клиент 

Если не выйдет первое, тогда так и поступлю.

sadman41
Offline
Зарегистрирован: 19.10.2016

yield() в цикле.

Или форк на второе ядро.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Не, на esp32 не нужно "отдаваться" другим потокам. Там это успешно делает сама RTOS. 

В вот красивая строчка "backtrace" может оооочень помочь. Яндексим: "Esp exception decoder". Вот , если вдруг яндексу не доверяете https://github.com/me-no-dev/EspExceptionDecoder/releases/tag/2.0.2

И ошибка ваша , скорее всего, потому что отправляете что то клиенту, который уже отвалился.

SAB
Offline
Зарегистрирован: 27.12.2016

То brokly: А если оправлять клиенту который отвалился, то ESP  после такого всегда уходит в ребут?

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021

brokly пишет:

Не, на esp32 не нужно "отдаваться" другим потокам. Там это успешно делает сама RTOS. 

В вот красивая строчка "backtrace" может оооочень помочь. Яндексим: "Esp exception decoder". Вот , если вдруг яндексу не доверяете https://github.com/me-no-dev/EspExceptionDecoder/releases/tag/2.0.2

И ошибка ваша , скорее всего, потому что отправляете что то клиенту, который уже отвалился.

Вот что мне на это ответил "ESP exception decoder"






Decoding stack results
0x40089080: commonErrorHandler_dump at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/esp32/panic.c line 534
0x400892fd: panicHandler at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/esp32/panic.c line 288
0x40145438: ram_phy_get_vdd33 at phy_chip_v7_cal.c line 2349
0x40146d33: esp_vfs_unlink at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/vfs/vfs.c line 518
0x4008bacd: xTaskIncrementTick at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/tasks.c line 2542
0x4008a30e: xPortSysTickHandler at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c line 284

Только еще больще запутался. Причем тут линуксовые директории? ))

В том то и дело, что клиент даже и не думал отваливатся. Отваливается лишь во время ребута ESP. Что естественно. Да и не должен он ребутится не зависимо от того подключен клиент или нет.

sadman41 пишет:

yield() в цикле.

Или форк на второе ядро.

yield()  Не поможет. Он лишь помогает крутить код даже тогда, когда делей всё остальное тормознул. Нет у меня делеев. Про вилку на второе ядро понятия не имею. Почитаю, попробую.

sadman41
Offline
Зарегистрирован: 19.10.2016
Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021

sadman41 пишет:

https://randomnerdtutorials.com/esp32-dual-core-arduino-ide/ << xTaskCreatePinnedToCore

Спасибо, отличный урок! Как раз то что нужно. Буду эсперементировать, потом отпишусь.