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

Нужна помощь Exception (28), wdt reset при загрузке скетча

Cadil

New member
Работая над кодом метеостанции я протестировал некоторые варианты сохранения значений переменных, которые задаются по воздуху - через Wi-Fi.
Потом я занялся подключением других датчиков в схему метеостанции, в которых не было необходимости в сохранении значений переменных через Wi-Fi. После возврата к старому ранее работавшему скетчу выяснилось, что он и его варианты перестали работать, а именно: после загрузки в ESP на монитор Arduino IDE выводится сообщение: wdt reset.
На этом форуме прочитал, что причиной wdt reset может быть:
  • переполнение оперативной памяти,
  • кривые или "прожорливые" библиотеки,
  • кривой пользовательский код,
  • слишком навороченная программа, с которой ESP не справляется.
В приложении есть скетч OLED_Blynk_4t.
В этом скетче я максимально уменьшил количество переменных и упростил код. Глобальные переменные используют 39972 байт (48%) динамической памяти, оставляя 41948 байт для локальных переменных.

Скетч работает, если в коде закомментировать строку 220 : strcpy(mail_address, json["mail_address"]);

Причиной этой проблемы может быть автообновление библиотек в Arduino IDE, которое я остановил с опозданием. Тестирование скетча со старыми версиями некоторых библиотек ничего не дало - как только расскомметирую строку 220 strcpy(mail_address, json["mail_address"]), то все то же - wdt reset. Не могу сообразить - как выйти на работающую комбинацию разных версий библиотек, если причина проблемы в библиотеках.
Ниже - информация с монитора Arduino IDE при загрузке проблемного скетча и декодировка стека, которая мне ни о чем не говорит. Возможно она что-то прояснит.

Что думаете?

Код:
⸮*WM: Adding parameter
*WM: blynk_token
*WM: Adding parameter
*WM: mail_address
*WM:
*WM: AutoConnect
*WM: Connecting as wifi client...
*WM: Using last saved values, should be faster
*WM: Connection result:
*WM: 3
*WM: IP Address:
*WM: 192.168.1.103
WiFi connected
IP address: 192.168.1.103
Load config...

Exception (28):
epc1=0x4000bf0e epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

ctx: cont
sp: 3fff0f30 end: 3fff1230 offset: 01a0

>>>stack>>>
3fff10d0:  3fffdad0 3fff0148 3fff2a34 4020c5e9
3fff10e0:  3ffe89d8 3fff10e0 3fff10ec 3fff10fc
3fff10f0:  3fff2a34 00000002 3fff2a41 00000000
3fff1100:  3fff2a51 00000002 3fff2a5d 40201c2c
3fff1110:  00000018 00000008 3ffefa44 40201d40
3fff1120:  3ffeffa8 3ffefa44 3ffefaa8 402015c9
3fff1130:  3fff1180 00000000 3ffefa44 4020ba34
3fff1140:  00000009 00000011 3fff0148 40201e06
3fff1150:  19082e00 00ffffff 0101a8c0 00000000
3fff1160:  00000007 0000000f 3ffefa44 40201ea3
3fff1170:  00000007 00000007 3ffefa44 4020ba64
3fff1180:  3ffeff48 00070010 3ffefa44 40201834
3fff1190:  3fff1b76 0000005a 3ffefa44 3fff0204
3fff11a0:  3fffdad0 00000010 3ffefa44 00000028
3fff11b0:  3ffe9490 00000000 000003e8 4010020c
3fff11c0:  3fff29f4 3fff1b6c 3fff11f0 4010068c
3fff11d0:  3ffe889c 3ffe889c 3ffefa44 3fff0204
3fff11e0:  3fffdad0 3ffe889c 3fff0148 4020d231
3fff11f0:  00000000 00000000 00000000 feefeffe
3fff1200:  feefeffe feefeffe feefeffe 3fff0204
3fff1210:  3fffdad0 00000000 3fff01fc 40214efc
3fff1220:  feefeffe feefeffe 3fff0210 40100718
<<<stack<<<

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

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

wdt reset
стек:
Код:
Decoding 14 results
0x4020c5e9: get at D:\Users\VB\Documents\Arduino\libraries\ArduinoJson\src/../include/ArduinoJson/JsonObject.ipp line 23
: (inlined by) as at D:\Users\VB\Documents\Arduino\libraries\ArduinoJson\src/../include/ArduinoJson/JsonObjectSubscript.hpp line 45
: (inlined by) as at D:\Users\VB\Documents\Arduino\libraries\ArduinoJson\src/../include/ArduinoJson/Internals/../JsonVariantBase.hpp line 64
: (inlined by) ArduinoJson::JsonVariantBase >::operator char const*() const at D:\Users\VB\Documents\Arduino\libraries\ArduinoJson\src/../include/ArduinoJson/Internals/../JsonVariantBase.hpp line 45
: (inlined by) loadConfig() at D:\Users\VB\Documents\Arduino\OLED_Blynk_4t/OLED_Blynk_4t.ino line 220
0x40201c2c: u8x8_i2c_data_transfer at D:\Users\VB\Documents\Arduino\libraries\U8g2lib/u8x8_cad.c line 382
0x40201d40: u8x8_cad_ssd13xx_i2c at D:\Users\VB\Documents\Arduino\libraries\U8g2lib/u8x8_cad.c line 432
0x402015c9: u8g2_font_decode_glyph at D:\Users\VB\Documents\Arduino\libraries\U8g2lib/u8g2_font.c line 880
0x4020ba34: u8x8_cad_EndTransfer at D:\Users\VB\Documents\Arduino\libraries\U8g2lib/u8x8_cad.c line 111
0x40201e06: u8x8_d_ssd1306_sh1106_generic at D:\Users\VB\Documents\Arduino\libraries\U8g2lib/u8x8_d_ssd1306_128x64_noname.c line 220
0x40201ea3: u8x8_d_ssd1306_128x64_noname at D:\Users\VB\Documents\Arduino\libraries\U8g2lib/u8x8_d_ssd1306_128x64_noname.c line 252
0x4020ba64: u8x8_DrawTile at D:\Users\VB\Documents\Arduino\libraries\U8g2lib/u8x8_display.c line 116
0x40201834: u8g2_draw_string at D:\Users\VB\Documents\Arduino\libraries\U8g2lib/u8g2_font.c line 880
0x4010020c: _umm_free at C:\Users\VB\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0-rc2\cores\esp8266\umm_malloc/umm_malloc.c line 1287
0x4010068c: free at C:\Users\VB\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0-rc2\cores\esp8266\umm_malloc/umm_malloc.c line 1733
0x4020d231: setup at D:\Users\VB\Documents\Arduino\OLED_Blynk_4t/OLED_Blynk_4t.ino line 309
0x40214efc: loop_wrapper at C:\Users\VB\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0-rc2\cores\esp8266/core_esp8266_main.cpp line 56
0x40100718: cont_norm at C:\Users\VB\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0-rc2\cores\esp8266/cont.S line 109
 
Последнее редактирование:

Алексей.

Active member
strcpy(mail_address, json["mail_address"]);
Вы вызываете индексный оператор у объекта json, никак не контролируете возвращаемое значение, вряд ли получаете нулевой указатель на строку, а вот указатель на строку, длина которой превышает размер того буфера куда копируете (mail_address), вполне возможна.
попробуйте сначала получить указатель, const char* p = json["mail_address"]; проверить не равен ли он нулю, если нет, получить длину строки на которую он указывает и вывести в лог.
Если будет падать на const char* p = json["mail_address"]; значит json["mail_address"] возвращающий ссылку на String вернул нулевую ссылку и при вызове оператора const char* у этой String благополучно падаем.
Предварительно можно проверить есть ли этот ключ "mail_address" в джейсоне, вызвать containsKey у него, несли вернул false, то и вызывать json["mail_address"] смысла нет.
Если интересно, источник libraries/ArduinoJason/src/JsonObject.hpp
 
Последнее редактирование:

CodeNameHawk

Moderator
Команда форума
Если длину не превышаете, попробуйте
strcpy(mail_address, json["mail_address"].as<const char*>()
);
 

Cadil

New member
Предварительно можно проверить есть ли этот ключ "mail_address" в джейсоне, вызвать containsKey у него, несли вернул false, то и вызывать json["mail_address"] смысла нет.
Благодарю за предметный и развернутый ответ. Ваше предположение относительно отсутствия ключа подтвердил и автор скетча метеостанции, который я взял за основу. Он предложил и решение этой проблемы - предварительный сброс ESP до заводских настроек. Кому интересно - детали тут.
 
Сверху Снизу