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