• Система автоматизации с открытым исходным кодом на базе 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.
 
Сверху Снизу