Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "Общие вопросы по esp8266", создана пользователем Paul_B, 2 сен 2019.

  1. Paul_B

    Paul_B Новичок

    Сообщения:
    149
    Симпатии:
    3
    Более месяца мучился с проблемой спонтанной перезагрузки ESP8266 (ESP-07 с 1МБ памяти и ESP-12E с 4МБ памяти). Скетч обкатывался на 10 модулях и характер перезагрузки был одинаков - модули работали около 3 часов, потом происходила перезагрузка. И так по кругу. Причем объем свободной оперативной памяти не уменьшался и был всегда в пределах 18-20МБ.
    Сам скетч не буду приводить, он довольно большой, его структура имеет вид:
    Код (Text):
    1.  
    2. ESP8266WebServer server(80);
    3.  
    4. void setup(void)
    5. {
    6.   Serial.begin(115200);
    7.  
    8. // код инициализации
    9. }
    10.  
    11. void loop()
    12. {
    13.   server.handleClient();
    14.   if (millis() - Time_Connect_Station> 1000)
    15.   {
    16. // мой код
    17. Time_Connect_Station=millis();
    18.  }
    19. }
    Причем как показывали маяки, перезагрузка всегда происходила после моего кода, т.е. в момент выполнения server.handleClient(); Модули работали 12300-12700 циклов (1 цикл приблизительно 1 секунда) и уходили в перезагрузку, точной причины не было.
    Что только я не делал, пока вчера не наткнулся на совет - перед подключением к WiFi-сети вставить WiFi.mode (это не помогло) и исключить режим DHCP , т.е. прописать статические IP-адреса. У меня и так были прописаны статические адреса, но была процедура была - сначала создавалось DHCP-подключение к сети, потом проверялся статический IP-адрес по маске, если адрес подходил, то происходило переподключение со статическим IP-адресом, если статический адрес указан не для этой сети, то подключение оставалось DHCP. Это было в самом начале, потом 3-4 часа все работало идеально, потом спонтанно происходила перезагрузка.
    Короче, убрал DHCP-подключение, сделал сразу подключение со статическим адресом (жаль, всегда стараюсь делать универсальность процедур) и О! ЧУДО, все модули уже работают сутки без перезагрузки. Вот приблизительное содержание стека при перезагрузке:

    Код (Text):
    1. Exception (29):
    2. epc1=0x4022ecc8 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
    3.  
    4. ctx: sys
    5. sp: 3ffffc70 end: 3fffffb0 offset: 01a0
    6.  
    7. >>>stack>>>
    8. 3ffffe10:  00000004 3fff72e4 3fff3774 00000001
    9. 3ffffe20:  4025432a 3ffef468 3fff3774 3ffef468
    10. 3ffffe30:  00000002 00000000 00000020 3fff72e4
    11. 3ffffe40:  3fff3594 00000000 3fff3590 4022ed79
    12. 3ffffe50:  4023247a 3ffeb478 3fff3590 4023267c
    13. 3ffffe60:  00000000 3ffffe90 00040000 3ffef468
    14. 3ffffe70:  3ffeb478 3ffeb478 3fff3590 402326aa
    15. 3ffffe80:  3fff4354 3fff3590 3fff3648 402348d7
    16. 3ffffe90:  c0a80108 40101f8c 3fffc200 00000022
    17. 3ffffea0:  00000000 000000f9 3fff731e 3fff366e
    18. 3ffffeb0:  000000f5 3fff3648 000000f0 00000004
    19. 3ffffec0:  00000004 00000004 00000000 3fff72e4
    20. 3ffffed0:  00000224 40264465 00000000 3fff72e4
    21. 3ffffee0:  3fff3678 3fff7316 3fff439c 3fff72e4
    22. 3ffffef0:  3fff3678 3fff7316 3fff439c 4023293c
    23. 3fffff00:  00000000 00000043 3fff3590 00000000
    24. 3fffff10:  00000000 0000024e 3fffff80 3fff7302
    25. 3fffff20:  3fff3590 3fff72e4 3fff3678 40235de0
    26. 3fffff30:  00000014 00000004 00000004 3fff3590
    27. 3fffff40:  3fffdc80 3fff3c2c 3fff36bc 3fff3c74
    28. 3fffff50:  00000008 3fff3590 3fff72e4 4022f0dd
    29. 3fffff60:  3fffdc80 3fff3c2c 3fff36bc 4010453c
    30. 3fffff70:  40258176 3fff3c2c 3fff36bc 40258188
    31. 3fffff80:  3fff72f4 3fff72e4 00000002 3fff1f50
    32. 3fffff90:  4025306f 00000000 3fff36bc 4025a51f
    33. 3fffffa0:  40000f49 3fffdab0 3fffdab0 40000f49
    34. <<<stack<<<
    35.  
    36. ets Jan  8 2013,rst cause:2, boot mode:(1,6)
    37.  
    38.  
    39. ets Jan  8 2013,rst cause:4, boot mode:(1,6)
    40.  
    41. wdt reset
    42.  
    Вот расшифровка через EspExceptionDecoder:

    Код (Text):
    1. Exception 29: StoreProhibited: A store referenced a page mapped with an attribute that does not permit stores
    2. Decoding 19 results
    3. 0x4022ecc8: netif_disable at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/glue-esp/lwip-esp.c line 529
    4. 0x4025432a: pp_attach at ?? line ?
    5. 0x4022ed79: netif_init_ap at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/glue-lwip/lwip-git.c line 346
    6. 0x4023247a: pbuf_copy at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/pbuf.c line 1306
    7. 0x4023267c: netif_issue_reports at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/netif.c line 711
    8. 0x402326aa: netif_set_ipaddr at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/netif.c line 711
    9. 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
    10. :  (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
    11. 0x40101f8c: wDev_ProcessFiq at ?? line ?
    12. 0x40264465: get_sar_dout at ?? line ?
    13. 0x4023293c: udp_input at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/udp.c line 463
    14. 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)
    15. 0x4022f0dd: ethernet_input_LWIP2 at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/netif/ethernet.c line 107
    16. 0x4010453c: esp2glue_ethernet_input at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/glue-lwip/lwip-git.c line 433
    17. 0x40258176: pbuf_free at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/glue-esp/lwip-esp.c line 725
    18. 0x40258188: pbuf_free at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/glue-esp/lwip-esp.c line 728
    19. 0x4025306f: ppPeocessRxPktHdr at ?? line ?
    20. 0x4025a51f: ets_strchr at ?? line ?
    21.  
    Дебаг стека, кстати, помогла провести версия EspExceptionDecoder-1.0.6, другие версии, даже более поздние, говорили, что неправильный вид стека. Отсутствующий, как правило, файл xtensa-lx106-elf-gdb.exe в архиве.
     

    Вложения:

  2. nikolz

    nikolz Гуру

    Сообщения:
    4.698
    Симпатии:
    452
    похоже на исповедь.
    ---------------
    прощаю, иди с миром.
     
  3. Paul_B

    Paul_B Новичок

    Сообщения:
    149
    Симпатии:
    3
    Я же написал - делюсь опытом.
     
  4. nikolz

    nikolz Гуру

    Сообщения:
    4.698
    Симпатии:
    452
    и в чем смысл этого опыта?
    Вы написали что не смогли сделать нормально с DHCP и выкинули его.
    У меня например работает алгоритм который вы хотели сделать
    более того ESP еще определяет есть ли соединение когда просыпается
    и подключается либо статически либо динамически.
    Ваш опыт говорит лишь об низком уровне ваших знаний.
     
  5. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.618
    Симпатии:
    180
    О большое достижение целые сутки без перезагрузки, об этом надо сразу писать в интернет.
    А если перезагрузиться через 10 суток напишите?
    Применили костыль, вместо попытки разобраться, что мешает нормальной работе есп.
    Не видно попыток посмотреть лог состояния есп перед перезагрузкой.
     
  6. Paul_B

    Paul_B Новичок

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

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.618
    Симпатии:
    180
    Не надо никуда лезть, считайте что они отлажены ардуино сообществом.
    Не ищите ошибок в чужом коде, ищите вначале у себя.

    Дано
    в итоге остается
    тут бы не помешало разобраться.

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

    Paul_B Новичок

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

    Paul_B Новичок

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

    Paul_B Новичок

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

    Paul_B Новичок

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

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.618
    Симпатии:
    180
    И одкуда в ней столько оперативной памяти, если учесть, что постоянной только 4МБ.
     
  13. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.618
    Симпатии:
    180
    И нафига такая логика работы, или одно или другое.
    Не знаю как в есп, обычно DHCP выделяет адрес на какое то время, возможно после этого времени у вас и происходит ошибка, например из за потери связи, не видно у вас автопереподключения.
     

Поделиться этой страницей