• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Soft WDT reset

AlexTVR

Member
ESP12F.
Внезапно возникла ошибка при отправке почты, причем возникла вдруг, раньше все работало.
Если это убрать, все работает.
Что делать?

if (sendMail(smtpHost, smtpPort, smtpUser, smtpPass, mailTo, mailSubject, message)) {

Serial.print(F("Mail sended through "));
Serial.println(smtpHost);
} else {
Serial.print(F("Error sending mail through "));
Serial.print(smtpHost);
Serial.println('!');
}
}


Soft WDT reset

>>>stack>>>

ctx: cont
sp: 3ffffcc0 end: 3fffffc0 offset: 01a0
3ffffe60: 00000000 00000000 00000000 3ffee794
3ffffe70: 3fff0144 00000000 00000002 401009f3
3ffffe80: 00000002 00000000 3ffefd1c 40209127
3ffffe90: 3fff0144 3ffeeb70 3fffff00 40204399
3ffffea0: 00000100 00000000 000003e8 402067d7
3ffffeb0: 00000000 00000000 00000000 3ffee794
3ffffec0: 3fffff78 0000b120 3fffff24 40206ab4
3ffffed0: 00000000 00000000 3fffff24 4020ed89
3ffffee0: 3fffff78 0000000d 3ffee91c 40201443
3ffffef0: feefeffe feefeffe feefeffe feefeffe
3fffff00: 4020f540 00000000 000003e8 402067d7
3fffff10: 00000000 00000000 00000000 00000000
3fffff20: 3ffeeb70 4020f540 00000000 000003e8
3fffff30: 402067d7 3fff078c 3fff07d4 00000000
3fffff40: 00000000 3ffeeb70 feefeffe feefeffe
3fffff50: feefeffe feefeffe feefeffe feefeffe
3fffff60: feefeffe feefeffe feefeffe 312e0020
3fffff70: 30312f76 81002533 00312e33 feefeffe
3fffff80: feefeffe feefeffe feefeffe feefeffe
3fffff90: feefeffe feefeffe feefeffe 3ffeea48
3fffffa0: 3fffdad0 00000000 3ffeea08 40205818
3fffffb0: feefeffe feefeffe 3ffe8538 40100cad
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

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

load 0x4010f000, len 3584, room 16
tail 0
chksum 0xb0
csum 0xb0
v2843a5ac
~ld
 

AlexTVR

Member
Ответ найден.

Эта конструкция (без yield(); ) приводила к краху:
file = SPIFFS.open("/t2.txt", "r");
while(file.available())
{
message+=file.readStringUntil('\n');
yield();
}

Не понимаю, почему?
 

pvvx

Активный участник сообщества
И что из этого?...
 

pvvx

Активный участник сообщества
Конкретно - без периодического вызова ets_run() будет WDT, даже если вы аппаратно сбрасываете WDT таймер.
 

pvvx

Активный участник сообщества
Исходя из того, что джиттер сигналов WiFi по спекам должен составлять не более 1 мкс, ваш цикл loop() должен укладываться в это время. Вызов SPIFFS недопустим, т.к. время выполнения большинства функций SPIFFS при большой фрагментации составляет более 1 сек, а кое-как понатыканные в либу SPIFFS yeld() этого не исправляют.

Arduino = only игра.
 

CodeNameHawk

Moderator
Команда форума
И что из этого?...
Если бы вы писали комментарии возле ключевых строк то поняли бы сами в чем дело.
//выполнять цикл, до тех пор пока file.available()) не вернет ноль.

Вопрос вам когда она вернет ноль?
 

AlexTVR

Member
"Arduino = only игра". Так вся наша жисть - ИГРА!
Мои поделки прекрасно работают годами, на Ардуино. Для себя. На пром не претендую.
"..джиттер сигналов WiFi по спекам .." - не понимаю.
 

AlexTVR

Member
message+=file.readStringUntil('\n'); эта строчка после чтения последней записи в файле не изменит file.available()?

Где написано, что эта функция не работает?
"..джиттер сигналов WiFi по спекам .." - а эту феню, кто-то может пояснить?
 

AlexTVR

Member
Покажите где вы нашли эту функцию для spiffs.
Просто добавьте в цикл Serial.println(file.available());
Вот:
1. https://arduino-esp8266.readthedocs.io/en/latest/filesystem.html
2.http://wikihandbk.com/wiki/Arduino:%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/SD/%D0%9A%D0%BB%D0%B0%D1%81%D1%81_File/available()

FAT filesystems are supported on the ESP8266 using the old Arduino wrapper “SD.h” which wraps the “SDFS.h” filesystem transparently.
 

CodeNameHawk

Moderator
Команда форума
Покажите скриншотом, где здесь функция SPIFFS.available(), можете просто подчеркнуть красным маркером на экране, а то мой старый комп в упор не видит.
2.http://wikihandbk.com/wiki/Arduino:%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/SD/%D0%9A%D0%BB%D0%B0%D1%81%D1%81_File/available()

FAT filesystems are supported on the ESP8266 using the old Arduino wrapper “SD.h” which wraps the “SDFS.h” filesystem transparently.
SD и SPIFFS это разные вещи, но и для SD функция available() возвращает есть ли в файле байты, доступные для считывания. Наследует у класса Stream.
http://wikihandbk.com/wiki/Arduino:Библиотеки/SD/Класс_File/available()
Сравните с http://arduino.ru/Reference/Serial/Available

Где написано, что эта функция не работает?
https://forum.arduino.cc/index.php?topic=530700.0
 
Последнее редактирование:

AlexTVR

Member
В моем файле несколько записей.
Вот в цикле, как работает (!!!) file.available() .
По мере чтения количество байт уменьшается до нуля и происходит выход из цикла.
Я просто вставил в цикл отчет в сериал.


208
190
155
146
139
121
86
77
70
52
16
7
0

Так что, уважаемый, не вводите публику в заблуждение.
В моем случае происходило следующее:
количество записей было примерно 500.
Разумеется, время выполнения цикла превышало некое значение, после которого аппаратный WDT вводил систему в ступор.
Вот и все.
Поставив внутри цикла yield(), WDT стал сбрасываться после чтения очередной записи, все стало работать.
Знать бы еще некоторые подробности, как этот WDT работает!
 
Сверху Снизу