• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Про сторожевой таймер. Имеет ли смысл?

Slacky

Member
В общем понял я, что ESP.wdtEnable(1000) не работает.

Но работает ESP.wdtDisable(). После этого, где-то секунд через 6-8 срабатывает аппаратный wdt.

Но при этом, если ничего не делать и запустить пустой цикл - while(1), то срабатывает софтовый wdt.

Вопрос - имеет ли заморачиваться с выключением софтового wdt и периодического сброса аппаратного командой - ESP.wdtFeed()?

Или забить? Потому что скетч

Код:
void setup() {
while (1){};
}
void loop(){}
Приводит все равно к перезагрузке ...

Что собственно хочется - если устройство подвиснет, то сработал wdt.

Не знаю, несколько сумбурно, но надеюсь, понятно :))

Спасибо.
 

pvvx

Активный участник сообщества
В общем понял я, что ESP.wdtEnable(1000) не работает.

Но работает ESP.wdtDisable(). После этого, где-то секунд через 6-8 срабатывает аппаратный wdt.
Управление в Arduino WDT не работает.
Таймеров WDT задействовано три: сам WDT, счетчик системного времени с защелками (аппаратный 64 битный с шагом 1 us для TSF WiFi), обычный софтовый таймер... Проверяются условие выполнения за период некоторых процедур...
Что собственно хочется - если устройство подвиснет, то сработал wdt.
Нереально. Вы не первый, кто этого хочет, но не решил.
Примеры аналогичных тем по поиску найдете с десяток...
Для себя я переписал все процедуры WDT в Web-свалке... Но проблема у ESP8266 не в WDT, а в зависоне после его софт-перезагрузки...
Ставьте внешний MCU, который будет устанавливать не менее 4-х пинов для правильной загрузки, отключать питание ESP8266 (в крайнем случае дергать RESET с установкой пинов в правильный режим), контролировать плавные включения питания (BOR у ESP тоже дурит), как-то вылавливать сбой-отваливание station WiFi (программно имеет всего один метод это понять - пинг внешнего сервера, и ни какие софт-сбросы ESP8266 не помогают), ну и осуществлять главную необходимую функцию - WDT. Тогда "хочется - если устройство подвиснет, то сработал wdt." может и получится.
Без внешних костылей у ESP с WDT всё плохо...

У ESP и так всего пару проблем, которые теперь только и обсуждают, но решения их нет:

1) Нормальный старт (правильные установки пинов для старта загрузкой с Flash)
2) Отваливание station при приеме “неподходящих для ESP :)” пакетов по WiFi c большим уровнем сигнала, при этом всё ПО говорит, что она подключена, а чип или занят глушением эфира или иногда, очень редко, слетает в протектед.
3) Невозможность соединений SSL на современных требованиях (где размер ключа более 128 бит)

Ну и мелкие глюки, как раз связанные с вашей темой – не всегда работает soft reset функция. Два варианта – или сразу, вместо перезагрузки виснет навеки, или ESP стартует не в том режиме. Например, в режим "программирования" и так в нем и живет, пока не сбросят. При этом команда перехода в deep-sleep на несколько ms, используемая вместо 2-х имеющихся soft reset функций в SDK, перебрасывает ESP значительно более стабильнее, если сделаны правильные соединения и подтяжки. Но имеет другой баг – при рестарте не всегда ESP понимает, что был перезапуск по deep-sleep, т.к. в последних командах процедуры выхода в deep-sleep имеется ошибка – проц улетает в область отключенной Flash по команде ret и исполняет команды пустой шины с шумовыми значениями, и часто, до срабатывания внутреннего устройства отключения (видимо оно тактируется низкочастотным RC генератором RTC), успевает нарваться на протектед и записать это в память RTC вместо deep-sleep…

Espressif эти все баги не чинит уже более года и похоже не собирается...

Это к тому, с чем вам придется столкнуться ради излечения WDT у ESP8266.
 
Последнее редактирование:

Slacky

Member
Спасибо, как всегда очень доходчиво.

Управление в Arduino WDT не работает.
Таймеров WDT задействовано три: сам WDT, счетчик системного времени с защелками (аппаратный 64 битный с шагом 1 us для TSF WiFi), обычный софтовый таймер... Проверяются условие выполнения за период некоторых процедур...
Я тут на коленке балуюсь с Wemos D1 Mini.

Вот такой код приводит к перезагрузке примерно через 8 секунд.

Код:
int i = 0;

void setup() {
  // put your setup code here, to run once:

  Serial.begin(115200);

  ESP.wdtDisable();

}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(i++);
  delay(1000);
}
В сериале

Код:
6
7
8

ets Jan  8 2013,rst cause:4, boot mode:(3,6)

wdt reset
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v09f0c112
~ld
⸮0
1
2
3
4
5
6
7
8

ets Jan  8 2013,rst cause:4, boot mode:(3,6)

wdt reset
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v09f0c112
~ld
⸮0
1
Вот такой - через 12.

Код:
int i = 0;

void setup() {
  // put your setup code here, to run once:

  Serial.begin(115200);

  ESP.wdtDisable();

}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(i++);
  delay(1000);
  if (i < 5) ESP.wdtFeed();
}
Код:
12

ets Jan  8 2013,rst cause:4, boot mode:(3,7)

wdt reset
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v09f0c112
~ld
⸮0
1
2
3
4
5
6
7
8
9
10
11
12

ets Jan  8 2013,rst cause:4, boot mode:(3,7)

wdt reset
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v09f0c112
~ld
⸮0
1
2
А вот такой - не перегружается вообще

Код:
int i = 0;

void setup() {
  // put your setup code here, to run once:

  Serial.begin(115200);

  ESP.wdtDisable();

}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(i++);
  delay(1000);
  ESP.wdtFeed();
}
Код:
rd
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Причем второй вариант проработал всю ночь, послушно перегружаясь каждый раз.

Ладно, спасибо еще раз, оставим эту тему ...
 
Последнее редактирование:

Lom

New member
Всем добрый день!
Вот увидеть бы эту тему пораньше ... :)

Прекрасно все писалось и отлично работало на Wemos D1 Mini ... пока не включил WDT ...

Теперь модуль после включения начинает в цикле писать
Код:
ts Jan 8 2013,rst cause:2, boot mode:(3,7)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v3ffe90d0
~ld
и привычным способом из Arduino IDE прошить его не получается o_O

По прочтении статьи понял, что куда проще будет навесить внешнюю ИС WDT, чем иметь подобные перспективы ..

Прошу подсказать с направлением действий - как можно вернуть модуль обратно в строй
Заранее благодарен.
 

CodeNameHawk

Moderator
Команда форума
Вот такой код приводит к перезагрузке примерно через 8 секунд.
Код:
int i = 0;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  ESP.wdtDisable();
}
void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(i++);
  delay(1000);
}
Попробуйте уменьшить задержку например до 100 мс, перестанет ли вылетать?

Information about the WatchDog Timers. · Issue #2942 · esp8266/Arduino · GitHub
It's not a good practice to spend more than a few hundred milliseconds without yielding to the wifi stack.
 
Сверху Снизу