День добрый всем!
Есть такая проблема, которая иногда всплывает на англоязычных сайтах, но решения пока не нашел.
Постараюсь максимально коротко.
У меня в наличии модуль ESP-01.
Прошил прошивкой, которая вешает прерывание на GPIO2, слушает входящие импульсы и инкрементирует счетчик. На тестовой плате собран генератор импульсов, порядка 300 имп/мин. (для тестирования, кнопкой много не понажимаешь)))
Отключаюсь от wifi:
wifi_station_set_auto_connect(false);
wifi_station_disconnect();
Запускаю циклический таймер (1 раз в мин.), кот. делает простую вещь, а именно выводит на консоль значение счетчика и обнуляет его (все):
os_timer_disarm(&impulse_timer);
os_timer_setfn(&impulse_timer, (os_timer_func_t *)interval_cb, (void *)0);
os_timer_arm(&impulse_timer, DELAY, 1);
Данная прошивка работает без сбоев сутками.
---------------------------------------------------
В следующем варианте прошивки, подкючаюсь к WIFI в режиме STATION_MODE.
WIFI_Connect(STA_SSID, STA_PASS, wifiConnectCb);
Функция взята из exemples-ов, проект esp_mqtt.
Отдельно, без прерываний тестировал, проблем не обнаружил (корректно подключается к AP, переподкючается после потери связи, работает долгое время...)
---------------------------------------------------
А вот проблема возникает, когда прерывания обрабатываются вместе с поддержкой сетевого соединения. Стабильно, где то раз в час, вываливается исключение:
6:05:28.132, Fatal exception 0(IllegalInstructionCause):
6:05:28.132, epc1=0x40244c04, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000
6:05:28.132,
6:05:28.132, ets Jan 8 2013,rst cause:4, boot mode3,7)
6:05:28.132,
6:05:28.132, wdt reset
причем ВСЕГДА по одному и тому же адресу.
Если дизассемблировать app.out, то по этому адресу находится следующее:
40244c04 <gpio_intr_dispatcher>:
40244c04: fffa31 l32r a3, 40244bec <WIFI_Connect+0xa0>
Если в процессе работы модуля отключаю генератор импульсов, то и исключения перестают возникать.
Понимаю, что возникновение исключения как то связано с обработкой прерываний и одновременной поддержкой коннекта. Понимаю, что кол-во прерываний ОТНОСИТЕЛЬНО велико. Если бы надо было только отправлять данные, то от сети можно было бы отключаться, а по надобности подключаться и передавать данные. Но в перспективе должен получать управляющие команды с MQTT сервера, поэтому коннект нужен всегда.
Пользуюсь UDK Версия 2.0.9
Заранее очень благодарен за помощь.
Есть такая проблема, которая иногда всплывает на англоязычных сайтах, но решения пока не нашел.
Постараюсь максимально коротко.
У меня в наличии модуль ESP-01.
Прошил прошивкой, которая вешает прерывание на GPIO2, слушает входящие импульсы и инкрементирует счетчик. На тестовой плате собран генератор импульсов, порядка 300 имп/мин. (для тестирования, кнопкой много не понажимаешь)))
Отключаюсь от wifi:
wifi_station_set_auto_connect(false);
wifi_station_disconnect();
Запускаю циклический таймер (1 раз в мин.), кот. делает простую вещь, а именно выводит на консоль значение счетчика и обнуляет его (все):
os_timer_disarm(&impulse_timer);
os_timer_setfn(&impulse_timer, (os_timer_func_t *)interval_cb, (void *)0);
os_timer_arm(&impulse_timer, DELAY, 1);
Данная прошивка работает без сбоев сутками.
---------------------------------------------------
В следующем варианте прошивки, подкючаюсь к WIFI в режиме STATION_MODE.
WIFI_Connect(STA_SSID, STA_PASS, wifiConnectCb);
Функция взята из exemples-ов, проект esp_mqtt.
Отдельно, без прерываний тестировал, проблем не обнаружил (корректно подключается к AP, переподкючается после потери связи, работает долгое время...)
---------------------------------------------------
А вот проблема возникает, когда прерывания обрабатываются вместе с поддержкой сетевого соединения. Стабильно, где то раз в час, вываливается исключение:
6:05:28.132, Fatal exception 0(IllegalInstructionCause):
6:05:28.132, epc1=0x40244c04, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000
6:05:28.132,
6:05:28.132, ets Jan 8 2013,rst cause:4, boot mode3,7)
6:05:28.132,
6:05:28.132, wdt reset
причем ВСЕГДА по одному и тому же адресу.
Если дизассемблировать app.out, то по этому адресу находится следующее:
40244c04 <gpio_intr_dispatcher>:
40244c04: fffa31 l32r a3, 40244bec <WIFI_Connect+0xa0>
Если в процессе работы модуля отключаю генератор импульсов, то и исключения перестают возникать.
Понимаю, что возникновение исключения как то связано с обработкой прерываний и одновременной поддержкой коннекта. Понимаю, что кол-во прерываний ОТНОСИТЕЛЬНО велико. Если бы надо было только отправлять данные, то от сети можно было бы отключаться, а по надобности подключаться и передавать данные. Но в перспективе должен получать управляющие команды с MQTT сервера, поэтому коннект нужен всегда.
Пользуюсь UDK Версия 2.0.9
Заранее очень благодарен за помощь.