• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 выделяет адрес на какое то время, возможно после этого времени у вас и происходит ошибка, например из за потери связи, не видно у вас автопереподключения.
 
Сверху Снизу