Я использую эту библиотеку (https://github.com/SensorsIot/Sonoff-POW), и она работает очень хорошо, однако время от времени я получаю исключение, и sonoff перезагружается.
Я реализовал простой эскиз, который считывает значения мощности и отправляет их с помощью веб-клиента. Части веб-клиента прекрасно работают без кода POWER, поэтому я предполагаю, что это может быть связано с прерыванием из библиотеки POWER
Это ошибка стека, отображаемая на мониторе последовательного порта ...
подключение к xxxxx.xxx.me
Exception 0: Illegal instruction
Decoding 29 results
0x402034f4: ESP8266PowerClass::measureVoltageFreq() at C:\Users\Sergio\Documents\SERGIO\libraries\Sonoff_POW-master/power.cpp line 294
0x40107018: interrupt_handler at C:\Users\Sergio\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/core_esp8266_wiring_digital.c line 119
0x4010177d: ppEnqueueRxq at ?? line ?
0x40101433: ppProcessTxQ at ?? line ?
0x40106fe0: interrupt_handler at C:\Users\Sergio\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/core_esp8266_wiring_digital.c line 113
0x40103d19: lmacProcessTXStartData at ?? line ?
0x4010707c: interrupt_handler at C:\Users\Sergio\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/core_esp8266_wiring_digital.c line 135
0x401055c1: ets_timer_disarm at ?? line ?
0x40106fe0: interrupt_handler at C:\Users\Sergio\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/core_esp8266_wiring_digital.c line 113
0x4020954c: pm_get_sleep_type at ?? line ?
0x40105b26: spi_flash_read at ?? line ?
0x401074b8: pvPortZalloc at C:\Users\Sergio\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/heap.c line 33
0x4020901d: pm_set_sleep_time at ?? line ?
0x402094b2: pm_get_sleep_type at ?? line ?
0x4020955f: pm_get_sleep_type at ?? line ?
0x4021ac3d: ets_timer_handler_isr at ?? line ?
0x4021ac82: ets_timer_handler_isr at ?? line ?
Перезагрузка всегда происходит в этом коде:
Serial.print("connecting to ");
Serial.print(host);
// Use WiFiClient class to create TCP connections
WiFiClient client;
// const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("....connection failed");
return;
}
Serial.println("....connected!");
Сразу после того, как я вижу печать в последовательном порту сообщения «соединение с хостом», но я не получаю печать «подключен».
Есть ли вероятность, что библиотека что-то делает во время "client.connect", что вызывает исключение:
Причины исключений (EXCCAUSE) EXCCAUSE Код Причина Имя Причина
Описание Обязательный параметр EXCVADDR Loaded
0 IllegalInstructionCause Недопустимая инструкция Исключение №
Я не ожидаю просмотреть всю библиотеку, но, может быть, некоторые указания о том, почему это может происходить.
возможно я могу отсоединить прерывания во время запроса клиента?
Может быть, реализовать некоторый код, чтобы остановить этот таймер, а затем вызвать его снова? (я не знаю, как это сделать)
извлечено из библиотеки:
void ESP8266PowerClass::startMeasure(void)
{
os_timer_setfn(&myTimer, (os_timer_func_t *)&ESP8266PowerClass::timerCallback, NULL);
os_timer_arm(&myTimer, 1, true); // every ms
}
спасибо за помощь