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

Делюсь опытом Спонтанная перезагрузка ESP8266 по коду Exception (29)

Paul_B

Member
Более месяца мучился с проблемой спонтанной перезагрузки ESP8266 (ESP-07 с 1МБ памяти и ESP-12E с 4МБ памяти). Скетч обкатывался на 10 модулях и характер перезагрузки был одинаков - модули работали около 3 часов, потом происходила перезагрузка. И так по кругу. Причем объем свободной оперативной памяти не уменьшался и был всегда в пределах 18-20МБ.
Сам скетч не буду приводить, он довольно большой, его структура имеет вид:
Код:
ESP8266WebServer server(80);

void setup(void)
{
  Serial.begin(115200);

// код инициализации
}

void loop()
{
  server.handleClient();
  if (millis() - Time_Connect_Station> 1000)
  {
// мой код
Time_Connect_Station=millis();
 }
}
Причем как показывали маяки, перезагрузка всегда происходила после моего кода, т.е. в момент выполнения server.handleClient(); Модули работали 12300-12700 циклов (1 цикл приблизительно 1 секунда) и уходили в перезагрузку, точной причины не было.
Что только я не делал, пока вчера не наткнулся на совет - перед подключением к WiFi-сети вставить WiFi.mode (это не помогло) и исключить режим DHCP , т.е. прописать статические IP-адреса. У меня и так были прописаны статические адреса, но была процедура была - сначала создавалось DHCP-подключение к сети, потом проверялся статический IP-адрес по маске, если адрес подходил, то происходило переподключение со статическим IP-адресом, если статический адрес указан не для этой сети, то подключение оставалось DHCP. Это было в самом начале, потом 3-4 часа все работало идеально, потом спонтанно происходила перезагрузка.
Короче, убрал DHCP-подключение, сделал сразу подключение со статическим адресом (жаль, всегда стараюсь делать универсальность процедур) и О! ЧУДО, все модули уже работают сутки без перезагрузки. Вот приблизительное содержание стека при перезагрузке:

Код:
Exception (29):
epc1=0x4022ecc8 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

ctx: sys
sp: 3ffffc70 end: 3fffffb0 offset: 01a0

>>>stack>>>
3ffffe10:  00000004 3fff72e4 3fff3774 00000001 
3ffffe20:  4025432a 3ffef468 3fff3774 3ffef468 
3ffffe30:  00000002 00000000 00000020 3fff72e4 
3ffffe40:  3fff3594 00000000 3fff3590 4022ed79 
3ffffe50:  4023247a 3ffeb478 3fff3590 4023267c 
3ffffe60:  00000000 3ffffe90 00040000 3ffef468 
3ffffe70:  3ffeb478 3ffeb478 3fff3590 402326aa 
3ffffe80:  3fff4354 3fff3590 3fff3648 402348d7 
3ffffe90:  c0a80108 40101f8c 3fffc200 00000022 
3ffffea0:  00000000 000000f9 3fff731e 3fff366e 
3ffffeb0:  000000f5 3fff3648 000000f0 00000004 
3ffffec0:  00000004 00000004 00000000 3fff72e4 
3ffffed0:  00000224 40264465 00000000 3fff72e4 
3ffffee0:  3fff3678 3fff7316 3fff439c 3fff72e4 
3ffffef0:  3fff3678 3fff7316 3fff439c 4023293c 
3fffff00:  00000000 00000043 3fff3590 00000000 
3fffff10:  00000000 0000024e 3fffff80 3fff7302 
3fffff20:  3fff3590 3fff72e4 3fff3678 40235de0 
3fffff30:  00000014 00000004 00000004 3fff3590 
3fffff40:  3fffdc80 3fff3c2c 3fff36bc 3fff3c74 
3fffff50:  00000008 3fff3590 3fff72e4 4022f0dd 
3fffff60:  3fffdc80 3fff3c2c 3fff36bc 4010453c 
3fffff70:  40258176 3fff3c2c 3fff36bc 40258188 
3fffff80:  3fff72f4 3fff72e4 00000002 3fff1f50 
3fffff90:  4025306f 00000000 3fff36bc 4025a51f 
3fffffa0:  40000f49 3fffdab0 3fffdab0 40000f49 
<<<stack<<<

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


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

wdt reset
Вот расшифровка через EspExceptionDecoder:

Код:
Exception 29: StoreProhibited: A store referenced a page mapped with an attribute that does not permit stores
Decoding 19 results
0x4022ecc8: netif_disable at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/glue-esp/lwip-esp.c line 529
0x4025432a: pp_attach at ?? line ?
0x4022ed79: netif_init_ap at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/glue-lwip/lwip-git.c line 346
0x4023247a: pbuf_copy at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/pbuf.c line 1306
0x4023267c: netif_issue_reports at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/netif.c line 711
0x402326aa: netif_set_ipaddr at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/netif.c line 711
0x402348d7: dhcp_parse_reply at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/ipv4/dhcp.c line 836
:  (inlined by) dhcp_recv at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/ipv4/dhcp.c line 1731
0x40101f8c: wDev_ProcessFiq at ?? line ?
0x40264465: get_sar_dout at ?? line ?
0x4023293c: udp_input at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/udp.c line 463
0x40235de0: ip4_input at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/ipv4/ip4.c line 580 (discriminator 1)
0x4022f0dd: ethernet_input_LWIP2 at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/netif/ethernet.c line 107
0x4010453c: esp2glue_ethernet_input at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/glue-lwip/lwip-git.c line 433
0x40258176: pbuf_free at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/glue-esp/lwip-esp.c line 725
0x40258188: pbuf_free at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/glue-esp/lwip-esp.c line 728
0x4025306f: ppPeocessRxPktHdr at ?? line ?
0x4025a51f: ets_strchr at ?? line ?
Дебаг стека, кстати, помогла провести версия EspExceptionDecoder-1.0.6, другие версии, даже более поздние, говорили, что неправильный вид стека. Отсутствующий, как правило, файл xtensa-lx106-elf-gdb.exe в архиве.
 

Вложения

nikolz

Well-known member
Я же написал - делюсь опытом.
и в чем смысл этого опыта?
Вы написали что не смогли сделать нормально с DHCP и выкинули его.
У меня например работает алгоритм который вы хотели сделать
более того ESP еще определяет есть ли соединение когда просыпается
и подключается либо статически либо динамически.
Ваш опыт говорит лишь об низком уровне ваших знаний.
 

CodeNameHawk

Moderator
Команда форума
О большое достижение целые сутки без перезагрузки, об этом надо сразу писать в интернет.
А если перезагрузиться через 10 суток напишите?
Применили костыль, вместо попытки разобраться, что мешает нормальной работе есп.
Не видно попыток посмотреть лог состояния есп перед перезагрузкой.
 

Paul_B

Member
Можете удалить тему. Лезть в кишки перечисленных в дебагере файлов я не собираюсь. За месяц я случайно обнажил такую же проблему и путь ее решения
 

CodeNameHawk

Moderator
Команда форума
Лезть в кишки перечисленных в дебагере файлов я не собираюсь.
Не надо никуда лезть, считайте что они отлажены ардуино сообществом.
Не ищите ошибок в чужом коде, ищите вначале у себя.

Дано
ESP8266 (ESP-07 с 1МБ памяти и ESP-12E с 4МБ памяти).
в итоге остается
Причем объем свободной оперативной памяти не уменьшался и был всегда в пределах 18-20МБ.
тут бы не помешало разобраться.

Причем как показывали маяки, перезагрузка всегда происходила после моего кода, т.е. в момент выполнения server.handleClient();
А вот тут нет ничего удивительного, скорее всего, перед server.handleClient();, у вас нет проверки подключена ли есп к "роутеру", а пока нет подключения не стоит запускать server.handleClient();.
И вполне может случиться, что server.handleClient(); может не успеть обработаться за секунду(нп. клиент тормознул на другой стороне), а у вас через секунду новый вызов server.handleClient();
 

Paul_B

Member
А вот тут нет ничего удивительного, скорее всего, перед server.handleClient();, у вас нет проверки подключена ли есп к "роутеру", а пока нет подключения не стоит запускать server.handleClient();.
Вообще-то раз в секунду запускается мой блок, а server.handleClient(); крутится постоянно.
DHCP реализуется
Код:
WiFi.config(IPAddress(0, 0, 0, 0), IPAddress(0, 0, 0, 0), IPAddress(0, 0, 0, 0), IPAddress(0, 0, 0, 0));
Статическое подключение
Код:
WiFi.config(ROM.ip, ROM.gateway, subnet, ROM.gateway);
Я уж не знаю как можно по-другому реализовать DHCP.
Меня смущало, что 3-4 часа разные ESP работают нормально, а потом вдруг перегружаются.
 

Paul_B

Member
тут бы не помешало разобраться.
Имеется ввиду оперативная память. При начале работы скетча свободной оперативной памяти 19-20МБ. В процессе работы она может уменьшаться до 12МБ, но потом восстанавливается к 19 МБ. Модули 10 штук образуют сеть с любой степенью вложенности, часть подключены к домашенй сети и гоняют между собой сообщения. Могу через эту сеть управлять выводами любой ESP, как мануально, так и при определенных условиях (температура, уровень напряжения, время пинга и проч.)
 

Paul_B

Member
а пока нет подключения не стоит запускать server.handleClient();.
Любая ESP либо сама к чему-то подключена, либо к ней кто-то подключен. server.handleClient() обрабатывает запросы, как матери, так и дочки. Запросы валятся кучами, если бы были сбои в моем коде, то не было бы такой закономерности в перезагрузках.
Ладно, для меня это в прошлом, двое суток прошло - полет нормальный, перезагрущок нет. Я вопрос задал в новой теме - как организовать передачу файлов между ESP.
 

Paul_B

Member
Проэкспериментировал. Если создается подключение сразу либо со статическим IP, либо с DHCP, то работает без проблем, а связка сначала установить DHCP соединение, проверить IP по маске, если он подходит, то разорвать DHCP-соединение и установить со статическим IP вот дает такой "долгоиграющий" глюк, который проявляется спустя 3 часа работы.
 

CodeNameHawk

Moderator
Команда форума
Если создается подключение сразу либо со статическим IP, либо с DHCP, то работает без проблем, а связка сначала установить DHCP соединение, проверить IP по маске, если он подходит, то разорвать DHCP-соединение и установить со статическим IP вот дает такой "долгоиграющий" глюк, который проявляется спустя 3 часа работы
И нафига такая логика работы, или одно или другое.
Не знаю как в есп, обычно DHCP выделяет адрес на какое то время, возможно после этого времени у вас и происходит ошибка, например из за потери связи, не видно у вас автопереподключения.
 
Сверху Снизу