Hello.
I have an ESP32 and use it with ESPHome and it first ran well. I updated its configuration several times with success. And suddenly it began to crash with :
Code: Select all
INFO Successfully uploaded program.
INFO Starting log output from /dev/ttyUSB0 with baud rate 115200
[17:23:58][I][logger:119]: Log initialized
[17:23:58][VV][preferences:036]: LOAD 0: valid=YES, 0=0x00000000 1=0x0DEFE4E3 (Type=233825507, CRC=0x0DEFE4E3)
[17:23:58][C][ota:484]: There have been 0 suspected unsuccessful boot attempts.
[17:23:58][VV][preferences:049]: SAVE 0: 0=0x00000001 1=0x42F4583F (Type=233825507, CRC=0x42F4583F)
[17:23:58][I][application:055]: Running through setup()...
[17:23:58][V][application:056]: Sorting components by setup priority...
[17:23:58][C][wifi:027]: Setting up WiFi...
[17:23:58][V][wifi_esp32:033]: Enabling STA.
[17:23:58]Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
[17:23:58]Core 1 register dump:
[17:23:58]PC : 0x400eafe3 PS : 0x00060230 A0 : 0x800f1c49 A1 : 0x3ffb17a0
INFO Need to fetch platformio IDE-data, please stand by
INFO Running: platformio run -d config/klsesp2 -t idedata
WARNING Decoded 0x400eafe3: _svfprintf_r at /Users/ivan/e/newlib_xtensa-2.2.0-bin/newlib_xtensa-2.2.0/xtensa-esp32-elf/newlib/libc/stdio/../../../.././newlib/libc/stdio/vfprintf.c:1604
[17:24:00]A2 : 0x00000400 A3 : 0x00000000 A4 : 0x3ffb1994 A5 : 0x00000052
[17:24:00]A6 : 0x3ffb1930 A7 : 0x00000001 A8 : 0x00000000 A9 : 0xffffffff
[17:24:00]A10 : 0x00000024 A11 : 0x0000002a A12 : 0xffffffff A13 : 0x3f409df8
[17:24:00]A14 : 0x3ffb17b0 A15 : 0xff000000 SAR : 0x00000016 EXCCAUSE: 0x0000001c
[17:24:00]EXCVADDR: 0x00000008 LBEG : 0x400014fd LEND : 0x4000150d LCOUNT : 0xffffffff
[17:24:00]
[17:24:00]Backtrace: 0x400eafe3:0x3ffb17a0 0x400f1c46:0x3ffb1ab0 0x400f1c7e:0x3ffb1b40 0x400d477e:0x3ffb1b80 0x400d4619:0x3ffb1ba0 0x4008450a:0x3ffb1be0 0x4013799f:0x3ffb1c30 0x40132787:0x3ffb1c70 0x4010fa20:0x3ffb1c90 0x4010fbf6:0x3ffb1cc0 0x400e3bf9:0x3ffb1cf0 0x4012f566:0x3ffb1d10 0x400d7a80:0x3ffb1e10 0x400d6d21:0x3ffb1e40 0x400d3862:0x3ffb1e80 0x400d33b5:0x3ffb1ea0 0x400d22a5:0x3ffb1ef0 0x400dc1b7:0x3ffb1fb0 0x40091245:0x3ffb1fd0
WARNING Found stack trace! Trying to decode it
WARNING Decoded 0x400eafe3: _svfprintf_r at /Users/ivan/e/newlib_xtensa-2.2.0-bin/newlib_xtensa-2.2.0/xtensa-esp32-elf/newlib/libc/stdio/../../../.././newlib/libc/stdio/vfprintf.c:1604
WARNING Decoded 0x400f1c46: _vsnprintf_r at /Users/ivan/e/newlib_xtensa-2.2.0-bin/newlib_xtensa-2.2.0/xtensa-esp32-elf/newlib/libc/stdio/../../../.././newlib/libc/stdio/vsnprintf.c:72
WARNING Decoded 0x400f1c7e: vsnprintf at /Users/ivan/e/newlib_xtensa-2.2.0-bin/newlib_xtensa-2.2.0/xtensa-esp32-elf/newlib/libc/stdio/../../../.././newlib/libc/stdio/vsnprintf.c:41
WARNING Decoded 0x400d477e: esphome::LogComponent::log_vprintf_(int, char const*, char const*, __va_list_tag)
WARNING Decoded 0x400d4619: esp_idf_log_vprintf_(char const*, __va_list_tag)
WARNING Decoded 0x4008450a: esp_log_write at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/log/log.c:215
WARNING Decoded 0x4013799f: pp_create_task
WARNING Decoded 0x40132787: ic_create_wifi_task
WARNING Decoded 0x4010fa20: wifi_init_in_caller_task
WARNING Decoded 0x4010fbf6: esp_wifi_init_internal
WARNING Decoded 0x400e3bf9: esp_wifi_init at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/esp32/wifi_init.c:98
WARNING Decoded 0x4012f566: WiFiGenericClass::mode(wifi_mode_t)
WARNING Decoded 0x400d7a80: esphome::WiFiComponent::wifi_mode_(esphome::optional<bool>, esphome::optional<bool>)
WARNING Decoded 0x400d6d21: esphome::WiFiComponent::setup()
WARNING Decoded 0x400d3862: esphome::Component::call_setup()
WARNING Decoded 0x400d33b5: esphome::Application::setup()
WARNING Decoded 0x400d22a5: setup()
WARNING Decoded 0x400dc1b7: loopTask(void*)
WARNING Decoded 0x40091245: vPortTaskWrapper at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/freertos/port.c:355 (discriminator 1)
[17:24:01]
[17:24:01]Rebooting...
[17:24:01]ets Jun 8 2016 00:22:57
[17:24:01]
[17:24:01]rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
[17:24:01]configsip: 0, SPIWP:0xee
[17:24:01]clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
[17:24:01]mode:DOUT, clock div:2
[17:24:01]load:0x3fff0018,len:4
[17:24:01]load:0x3fff001c,len:928
[17:24:01]ho 0 tail 12 room 4
[17:24:01]load:0x40078000,len:9280
[17:24:01]load:0x40080400,len:5860
[17:24:01]entry 0x40080698
[17:24:01][I][logger:119]: Log initialized
[17:24:01][VV][preferences:036]: LOAD 0: valid=YES, 0=0x00000001 1=0x42F4583F (Type=233825507, CRC=0x42F4583F)
[17:24:01][C][ota:484]: There have been 1 suspected unsuccessful boot attempts.
[17:24:01][VV][preferences:049]: SAVE 0: 0=0x00000002 1=0x13D89D5A (Type=233825507, CRC=0x13D89D5A)
[17:24:01][I][application:055]: Running through setup()...
[17:24:01][V][application:056]: Sorting components by setup priority...
[17:24:01][C][wifi:027]: Setting up WiFi...
[17:24:01][V][wifi_esp32:033]: Enabling STA.
[17:24:01]Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
[17:24:01]Core 1 register dump:
[17:24:01]PC : 0x400eafe3 PS : 0x00060430 A0 : 0x800f1c49 A1 : 0x3ffb17a0
WARNING Decoded 0x400eafe3: _svfprintf_r at /Users/ivan/e/newlib_xtensa-2.2.0-bin/newlib_xtensa-2.2.0/xtensa-esp32-elf/newlib/libc/stdio/../../../.././newlib/libc/stdio/vfprintf.c:1604
[17:24:01]A2 : 0x00000400 A3 : 0x00000000 A4 : 0x3ffb1994 A5 : 0x00000053
[17:24:01]A6 : 0x3ffb1930 A7 : 0x00000001 A8 : 0x00000000 A9 : 0xffffffff
[17:24:01]A10 : 0x00000024 A11 : 0x0000002a A12 : 0xffffffff A13 : 0x3f409df8
[17:24:01]A14 : 0x3ffb17b0 A15 : 0xff000000 SAR : 0x00000002 EXCCAUSE: 0x0000001c
[17:24:01]EXCVADDR: 0x00000008 LBEG : 0x400014fd LEND : 0x4000150d LCOUNT : 0xffffffff
[17:24:01]
[17:24:01]Backtrace: 0x400eafe3:0x3ffb17a0 0x400f1c46:0x3ffb1ab0 0x400f1c7e:0x3ffb1b40 0x400d477e:0x3ffb1b80 0x400d4619:0x3ffb1ba0 0x4008450a:0x3ffb1be0 0x4013799f:0x3ffb1c30 0x40132787:0x3ffb1c70 0x4010fa20:0x3ffb1c90 0x4010fbf6:0x3ffb1cc0 0x400e3bf9:0x3ffb1cf0 0x4012f566:0x3ffb1d10 0x400d7a80:0x3ffb1e10 0x400d6d21:0x3ffb1e40 0x400d3862:0x3ffb1e80 0x400d33b5:0x3ffb1ea0 0x400d22a5:0x3ffb1ef0 0x400dc1b7:0x3ffb1fb0 0x40091245:0x3ffb1fd0
WARNING Found stack trace! Trying to decode it
WARNING Decoded 0x400eafe3: _svfprintf_r at /Users/ivan/e/newlib_xtensa-2.2.0-bin/newlib_xtensa-2.2.0/xtensa-esp32-elf/newlib/libc/stdio/../../../.././newlib/libc/stdio/vfprintf.c:1604
WARNING Decoded 0x400f1c46: _vsnprintf_r at /Users/ivan/e/newlib_xtensa-2.2.0-bin/newlib_xtensa-2.2.0/xtensa-esp32-elf/newlib/libc/stdio/../../../.././newlib/libc/stdio/vsnprintf.c:72
WARNING Decoded 0x400f1c7e: vsnprintf at /Users/ivan/e/newlib_xtensa-2.2.0-bin/newlib_xtensa-2.2.0/xtensa-esp32-elf/newlib/libc/stdio/../../../.././newlib/libc/stdio/vsnprintf.c:41
WARNING Decoded 0x400d477e: esphome::LogComponent::log_vprintf_(int, char const*, char const*, __va_list_tag)
WARNING Decoded 0x400d4619: esp_idf_log_vprintf_(char const*, __va_list_tag)
WARNING Decoded 0x4008450a: esp_log_write at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/log/log.c:215
WARNING Decoded 0x4013799f: pp_create_task
WARNING Decoded 0x40132787: ic_create_wifi_task
WARNING Decoded 0x4010fa20: wifi_init_in_caller_task
WARNING Decoded 0x4010fbf6: esp_wifi_init_internal
WARNING Decoded 0x400e3bf9: esp_wifi_init at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/esp32/wifi_init.c:98
WARNING Decoded 0x4012f566: WiFiGenericClass::mode(wifi_mode_t)
WARNING Decoded 0x400d7a80: esphome::WiFiComponent::wifi_mode_(esphome::optional<bool>, esphome::optional<bool>)
WARNING Decoded 0x400d6d21: esphome::WiFiComponent::setup()
WARNING Decoded 0x400d3862: esphome::Component::call_setup()
WARNING Decoded 0x400d33b5: esphome::Application::setup()
WARNING Decoded 0x400d22a5: setup()
WARNING Decoded 0x400dc1b7: loopTask(void*)
WARNING Decoded 0x40091245: vPortTaskWrapper at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/freertos/port.c:355 (discriminator 1)
[17:24:01]
[17:24:01]Rebooting...
The configuration file is :
Code: Select all
esphome:
name: klsesp2
platform: ESP32
board: nodemcu-32s
wifi:
ssid: "zzzzz"
password: "xxxxx"
domain: ".yyyyy.lan"
# Enable logging
logger:
level: VERY_VERBOSE
# Enable Home Assistant API
api:
ota:
What is happening ? Is my ESP broken ?
Thank you in advance, it’s a bit panic here…
esp32 Решение ошибки медитации гуру
Guru Meditation
- Этот раздел будет напечатан на
Guru Meditation Error: Core panic'ed
Причины ошибок в скобках будут объяснены одна за другой.
IllegalInstruction
Это исключение ЦП означает, что текущая выполняемая инструкция не является допустимой. Распространенные причины этой ошибки:
- Функция задачи в FreeRTOS вернулась. В FreeRTOS, если вы хотите завершить функцию задачи, вам нужно вызвать
vTaskDelete()
Функция освобождает ресурсы текущей задачи вместо прямого возврата. - Не удается загрузить следующую инструкцию из SPI Flash, обычно это происходит:
- Прикладная программа перенастраивает контакты SPI Flash на другие функции (такие как GPIO, UART и т. Д.). Для получения подробной информации о выводах SPI Flash, пожалуйста, обратитесь к руководству по проектированию оборудования и спецификации микросхемы / модуля.
- Некоторые внешние устройства случайно подключаются к контактам SPI Flash, что мешает обмену данными между ESP32 и SPI Flash.
InstrFetchProhibited
Это исключение ЦП означает, что ЦП не может загрузить инструкцию, потому что адрес инструкции не находится в допустимой области IRAM или IROM.
Обычно это означает, что в коде вызывается указатель функции, который не указывает на действительный блок кода. В этом случае вы можете проверитьPC
(Программный счетчик) значение регистра и сделайте дальнейшее суждение: если это 0 или другое недопустимое значение (то есть, если оно не0x4xxxxxxx
Обстоятельства) подтверждается, что это действительно причина.
Если указатель ПК указывает на недопустимую область в большом масштабе, возможная причина дамп памятиПлохой контакт на булавкеИ другие причины.
Для получения подробной информации вы можете проверить карту esp32 ниже, чтобы определить положение указателя компьютера (не ограничиваясь этим разделом).
LoadProhibited, StoreProhibited
Этот тип исключения ЦП возникает, когда приложение пытается прочитать или записать в недопустимую область памяти. Такие недопустимые адреса памяти могут быть сброшены в регистрEXCVADDR
Нашел в. Если адрес равен нулю, это обычно означает, что приложение пытается разыменоватьNULL
указатель. Если адрес близок к нулю, это обычно означает, что приложение пытается получить доступ к члену структуры, но указатель структурыNULL
, Если адрес является другим недопустимым значением (не в0x3fxxxxxx
— 0x6xxxxxxx
В пределах диапазона) это может означать, что указатель, используемый для доступа к данным, не инициализирован или поврежден.
IntegerDivideByZero
Приложение пыталось разделить целое число на ноль.
LoadStoreAlignment
Ячейка памяти, которую приложение пытается читать / писать, не соответствует требованиям к размеру с выравниванием по байтам для инструкций загрузки / сохранения. Например, 32-разрядная инструкция загрузки может обращаться только к 4-разрядным адресам памяти, в то время как 16-разрядная инструкция загрузки может обращаться только к 2-байтовый адрес памяти с выравниванием.
LoadStoreError
Приложение пытается выполнить 8-битные или 16-битные операции загрузки / сохранения из области памяти, которая поддерживает только 32-битную загрузку / сохранение, например, разыменование области памяти команд.char*
Указатель вызовет такую ошибку.
Unhandled debug exception
Обычно за этим следует сообщение:
Debug exception reason: Stack canary watchpoint triggered (task_name)
Эта ошибка указывает на то, что позиция, записанная приложением, находится за концом стека задач имя_задачи. Обратите внимание, что эта ошибка не запускается каждый раз при переполнении стека. Задача может обойти канарейку стека (stack canary) для доступа к стеку, в этом случае точка мониторинга не будет запущена.
Interrupt wdt timeout on CPU0 / CPU1
Это указывает на то, что истекло время ожидания сторожевого таймера прерывания.
Cache disabled but cached memory region accessed
@ С этой проблемой сталкивались многие люди, особенно здесь, чтобы подвести итог, эта часть контента благодарна Чжану, которому неудобно раскрывать свое имя, за его помощь
Причина этой проблемы в том, что во время отключения кеша (например, при использовании spi_flash API для чтения / записи / стирания / отображения SPI Flash) возникает прерывание IRAM-Safe, и программа прерывания обращается к ресурсам флэш-памяти. Обычно это происходит, когда обработчик прерывания вызывает программу во флэш-памяти и ссылается на константы во флэш-памяти. Стоит отметить, что при использовании в обработчике прерыванияdouble
Переменная типа из-заdouble
Реализация операции переменной типаПрограммная реализацияДа, поэтому часть реализации также хранится во флэш-памяти (например, операции приведения).
Решение:
- Добавить к функции, доступ к которой осуществляется в прерывании
IRAM_ATTR
Модификатор - Добавить к константе, доступ к которой осуществляется в прерывании
DRAM_ATTR
Модификатор - Не используется в обработчике прерывания
double
Тип операция
- нужно знать:
1. Это исключение возникает только в прерывании IRAM-Safe, то есть при использованииESP_INTR_FLAG_IRAM
Зарегистрированный обработчик прерывания.
2. Это исключение будет возникать только при отключении кеша, поэтому оно не произойдет, если кеш не отключен, другими словами, исключение является случайным.
3. Компилятор может поместить некоторые переменные, которые не будут изменены, в раздел .rodata, даже если программист не добавит модификатор const. Для приложений ESP32 .rodata означает, что деталь находится во флэш-памяти. Для строковых переменных эту ситуацию легко обнаружить, но для некоторых констант обнаружить не так просто. Например, следующая ситуация
static timg_dev_t *TG[2] = {&TIMERG0, &TIMERG1};
Здесь определяется массив указателей TG.Элемент массива является первым адресом регистра двух аппаратных таймеров 0 и 1. Элемент массива указателей не будет изменен, поэтому он будет помещен в .rodata компилятором. В это время TG работает в прерывании от таймера, и это прерывание происходит во время запретного периода кеширования, тогда ЦП генерирует исключение.
- Навыки отладки проблемы
- Когда ЦП выдает этот тип исключения, обычно местоположение исключения является местоположением ошибки, и вам нужно внимательно изучить
Guru Meditation Error: Core 1 panic'ed (Cache disabled but cached memory region accessed)
Core 1 register dump:
PC : 0x4011b808 PS : 0x00060034 A0 : 0x8008c664 A1 : 0x3ffbeca0
0x4011b808: __fixunsdfdi at /builds/idf/crosstool-NG/.build/src/gcc-5.2.0/libgcc/config/xtensa/ieee754-df.S:2041
A2 : 0x0099fd28 A3 : 0x00000000 A4 : 0x3ffbf6a0 A5 : 0x3f7909f1
A6 : 0x00000000 A7 : 0x00013ffc A8 : 0x80086136 A9 : 0x3ffbec80
A10 : 0xfffffffc A11 : 0x40ddd57f A12 : 0x000007fe A13 : 0x00000000
A14 : 0x65580000 A15 : 0x00000000 SAR : 0x00000014 EXCCAUSE: 0x00000007
EXCVADDR: 0x00000000 LBEG : 0x4000c2e0 LEND : 0x4000c2f6 LCOUNT : 0x00000000
Core 1 was running in ISR context:
EPC1 : 0x40086914 EPC2 : 0x00000000 EPC3 : 0x00000000 EPC4 : 0x4011b808
0x40086914: spi_flash_enable_interrupts_caches_and_other_cpu at /home/chenzhengwei/esp/esp-idf/components/spi_flash/cache_utils.c:147
0x4011b808: __fixunsdfdi at /builds/idf/crosstool-NG/.build/src/gcc-5.2.0/libgcc/config/xtensa/ieee754-df.S:2041
Backtrace: 0x4011b808:0x3ffbeca0 0x4008c661:0x3ffbecd0 0x4008c69d:0x3ffbecf0 0x400857e5:0x3ffbed10 0x40086911:0x3ffd0970 0x40086cc9:0x3ffd0990 0x40117789:0x3ffd09e0 0x4011785e:0x3ffd0a10 0x401179ea:0x3ffd0a30 0x40116c51:0x3ffd0aa0 0x40117109:0x3ffd0b20 0x40116729:0x3ffd0b90 0x40105c36:0x3ffd0bd0 0x401057d7:0x3ffd0c10 0x401058ce:0x3ffd0c40 0x4008dfb5:0x3ffd0c90
0x4011b808: __fixunsdfdi at /builds/idf/crosstool-NG/.build/src/gcc-5.2.0/libgcc/config/xtensa/ieee754-df.S:2041
0x4008c661: gpio_isr_loop at /home/chenzhengwei/esp/esp-idf/components/driver/gpio.c:433
0x4008c69d: gpio_intr_service at /home/chenzhengwei/esp/esp-idf/components/driver/gpio.c:433
0x400857e5: _xt_lowint1 at /home/chenzhengwei/esp/esp-idf/components/freertos/xtensa_vectors.S:1154
0x40086911: spi_flash_enable_interrupts_caches_and_other_cpu at /home/chenzhengwei/esp/esp-idf/components/spi_flash/cache_utils.c:147
...
В этом примере место возникновения исключения —0x4011b808
, вот__fixunssfdi
Место хранения функции, и это место находится во внешней памяти (см. Раздел 1.3.3 esp32_technical_reference_manual). Эта функция используется для преобразования числа с плавающей запятой в 64-битное целое число без знака, что означает, что обработчик прерывания используетdouble
Тип операции приведения данных. Эта операция не разрешена, когда кеш отключен.
- Если вы не знаете, находится ли переменная в разделе .data / .bss или .rodata, вы можете использовать команду readelf для просмотра сведений о символах в .elf
# Перезаписать таблицу символов в build / empty-project.elf в файл empty-project.out
readelf -a build/empty-project.elf > empty-project.out
Используйте команду readelf для извлечения таблицы символов в файле elf. Чтобы узнать, как просмотреть таблицу символов, обратитесь к структуре хранения переменных языка C. С помощью таблицы символов вы можете точно увидеть место хранения и размер каждой переменной и функции. С помощью этой информации вы можете проверить, находятся ли переменные и функции, используемые в обработчике прерываний IRAM-Safe, во флэш-памяти.
Hardware:
Board: ESP 32 DEVKIT v1
Core Installation/update date: 21/10/2018
IDE name: Arduino IDE
Flash Frequency: 80Mhz
Upload Speed: 9600
Computer OS: Windows 10/7
Description:
I have set up an Acess point on ESP 32. It is successfully configuring. But, while trying to connect to access point I am getting Guru meditation exception
Sketch:
#include <WiFi.h> #include "SPIFFS.h" #include <EEPROM.h> #include <WebServer.h> #include <DNSServer.h> #define EEPROM_SIZE 512 WebServer server(80); const byte DNS_PORT = 53; DNSServer dnsServer; //*********SSID and Pass for AP**************/ const char *ssidAP = "ESPuser"; //********** Variable for SSID and Pass*************/ String STATION_SSID; String STATION_PASSWORD; String DEVICE_ID; String HOST_ID; //*********Static IP Config**************/ IPAddress ap_local_IP(192,168,1,4); IPAddress ap_gateway(192,168,1,254); IPAddress ap_subnet(255,255,255,0); //*********AP Timer**************/ unsigned long apTimer =0; unsigned long apInterval = 120000; void setup() { Serial.begin(9600); while(!Serial); WiFi.mode(WIFI_AP); Serial.println(WiFi.softAPConfig(ap_local_IP, ap_gateway, ap_subnet) ? "access point onfigured...":"Not connected"); Serial.print("Setting soft-AP ... "); Serial.println(WiFi.softAP(ssidAP) ? "SoftAp Setup": "Failed to connect"); dnsServer.start(DNS_PORT, "*", ap_local_IP); if (!EEPROM.begin(EEPROM_SIZE)) { Serial.println("failed to initialise EEPROM"); } SPIFFS.begin(); server.on("/", handleRoot); server.begin(); apTimer = millis(); while(millis()-apTimer<= apInterval) { dnsServer.processNextRequest(); server.handleClient(); } InitWifi(); } void loop() { } ////**************Connect to local WiFi************/ void InitWifi(){ WiFi.mode(WIFI_STA); WiFi.disconnect(); char ssid[30]; char pass[30];char device[30]; String string_Ssid= read_string(30,0); String string_Password= read_string(30,60); String device_id = read_string(30,120); string_Ssid.toCharArray(ssid,sizeof(string_Ssid)+1); string_Password.toCharArray(pass,sizeof(string_Ssid)+1); device_id.toCharArray(device,sizeof(string_Ssid)+1); Serial.println("ssid: "+ string_Ssid); Serial.println("Password: "+ string_Password); WiFi.begin(ssid,pass); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(WiFi.localIP()); } //****************************HANDLE ROOT***************************// void handleRoot() { if (server.hasArg("ssid")&& server.hasArg("password") && server.hasArg("device") && server.hasArg("connect") ) { handleSubmit(); } else {File file = SPIFFS.open("/webform.html", "r"); server.streamFile(file,"text/html"); file.close(); } } //**************************SUBMIT RESPONSE**************************// void handleSubmit(){//dispaly values and write to memmory String response="<p>The ssid is "; response += server.arg("ssid"); response +="<br>"; response +="And the password is "; response +=server.arg("password"); response +="<br>"; response +="the Connection String is "; response +=server.arg("connect"); response +="<br>"; response +="the device Id is "; response +=server.arg("device"); response +="</P><BR>"; response +="<H2><a href="/">go home</a></H2><br>"; server.send(200, "text/html", response); ROMwrite(String(server.arg("ssid")),String(server.arg("password")), String(server.arg("device"))); ROMconnectWrite(String(server.arg("connect"))); } //**************WRITE Connect String TO EEPROM******************// void ROMconnectWrite(String conn){ conn+="!"; write_EEPROM(conn,200); EEPROM.commit(); } //**************WRITE RESPONSE TO EEPROM******************// void ROMwrite(String s, String p, String d){ s+=";"; write_EEPROM(s,0); p+=";"; write_EEPROM(p,60); d+=";"; write_EEPROM(d,120); } //******************WRITE TO EEPROM**********************// void write_EEPROM(String x,int pos){ for(int n=pos;n<x.length()+pos;n++){ EEPROM.write(n,x[n-pos]); } EEPROM.commit(); } //*****************READ STRING**********************// String read_string(int l, int p){ String temp; for (int n = p; n < l+p; ++n) { if(char(EEPROM.read(n))!=';'){ temp += String(char(EEPROM.read(n))); }else n=l+p; } return temp; } //*****************READ CONN STRING**********************// String read_conn_string(int l, int p){ String temp; for (int n = p; n < l+p; ++n) { if(char(EEPROM.read(n))!='!'){ temp += String(char(EEPROM.read(n))); }else n=l+p; } return temp; }
Debug Messages:
Guru Meditation Error: Core 1 panic'ed (InstrFetchProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x00000000 PS : 0x00060430 A0 : 0x800fc409 A1 : 0x3ffb5670
A2 : 0x3ffbbc90 A3 : 0x3ffbcf6c A4 : 0x3ffbb9c8 A5 : 0x3ffbb954
A6 : 0x0501a8c0 A7 : 0x0f01a8c0 A8 : 0x800fc2a8 A9 : 0x3ffb5630
A10 : 0x3ffbbca0 A11 : 0x3ffbcf6c A12 : 0x3ffb567c A13 : 0x00000044
A14 : 0x00000001 A15 : 0x00000006 SAR : 0x00000010 EXCCAUSE: 0x00000014
EXCVADDR: 0x00000000 LBEG : 0x4000c349 LEND : 0x4000c36b LCOUNT : 0x00000000
Backtrace: 0x00000000:0x3ffb5670 0x400fc406:0x3ffb56b0 0x40104389:0x3ffb56d0 0x40106f35:0x3ffb5710 0x4010cede:0x3ffb5730 0x400fb805:0x3ffb5750
Decoded Messages:
PC: 0x00000000
EXCVADDR: 0x00000000
Decoding stack results
0x400fc406: handle_dhcp at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/lwip/apps/dhcpserver.c line 1035
0x40104389: udp_input at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/lwip/core/udp.c line 417
0x40106f35: ip4_input at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/lwip/core/ipv4/ip4.c line 705
0x4010cede: ethernet_input at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/lwip/netif/ethernet.c line 176
0x400fb805: tcpip_thread at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/lwip/api/tcpip.c line 143
Webform:
<!DOCTYPE HTML>
<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="content-type">
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0, maximum-scale = 1.0, user-scalable=0">
<title>Mesh</title>
<style>
body { background-color: #F7F9F9 ; font-family: Arial, Helvetica, Sans-Serif; Color: #000000; }
input[type=text], select {
width: 100%;
padding: 12px 20px;
margin: 8px 0;
display: inline-block;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
}
</style>
</head>
<body>
<center>
<h1 style="color:#3498DB; font-family:verdana">WebCzar</h1>
<h2 style="color:#3498DB; font-family:Times New Roman">Enter Your User credentials</h2>
<FORM action="/" method="post">
<P>
<label style="font-family:Times New Roman"><b>SSID</b></label><br>
<input maxlength="30" name="ssid"><br>
</P>
<P>
<label style="font-family:Times New Roman"><b>PASSWORD</b></label><br>
<input maxlength="30" name="password"><br>
</P>
<INPUT type="submit" value="Submit your form">
<style>
input[type="submit"]{
background-color: #3498DB; /* Green */
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
}
</style>
<INPUT type="reset">
<style>
input[type="reset"]{
background-color: #3498DB; /* Green */
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
}
</style>
</FORM>
</center>
</body>
Страница 1 из 2
-
При совместной работе IRremote и NVS Esp32 вываливается в перезагрузку с вот таким сообщением:
Guru Meditation Error: Core 1 panic’ed (Cache disabled but cached memory region accessed)
Register dump:
PC : 0x400d0c90 PS : 0x00060034 A0 : 0x400822b4 A1 : 0x3ffc0bf0
A2 : 0x00000001 A3 : 0x00000002 A4 : 0x000000ff A5 : 0x40085b54
A6 : 0x00000000 A7 : 0x3ffcf000 A8 : 0x80081140 A9 : 0x3ff5f024
A10 : 0x3ffc1038 A11 : 0x20000000 A12 : 0x00000400 A13 : 0x00000002
A14 : 0x00000003 A15 : 0x00060d23 SAR : 0x00000013 EXCCAUSE: 0x00000007
EXCVADDR: 0x00000000 LBEG : 0x4000c2e0 LEND : 0x4000c2f6 LCOUNT : 0xffffffffBacktrace: 0x400d0c90:0x3ffc0bf0 0x400822b1:0x3ffc0c10 0x40087b97:0x00000000
Rebooting…
ets Jun 8 2016 00:22:57rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
modeIO, clock div:1
load:0x3fff0010,len:4
load:0x3fff0014,len:716
load:0x40078000,len:0
load:0x40078000,len:11572
entry 0x40078a14Использую простейший скетч (см ниже) — получаю код с пульта — записываю и читаю байт из NVS
По отдельности все работает. Вместе — не хочет.
Перепробовал кучу разных библиотек — не работает.
На форумах ничего полезного не нашел.
Неужели никто не сталкивался? Или я не то делаю? Но все же элементарно….Тема для многих может быть актуальной.
Прошу помощи!
Заранее благодарен всем откликнувшимся.вот сам скетч:
/////////////////////////////////////////////////////////////////////////////////
#include <Preferences.h>
#include <IRremote.h>byte RECV_PIN = 26; //IR приемник
IRrecv irrecv(RECV_PIN);
decode_results results;void setup() {
Serial.begin(115200); // устанавливаем скорость Com порта
delay(100);
irrecv.enableIRIn(); // Start the IR receiver
} // setupvoid loop() {
if (irrecv.decode(&results)) //если в IR Port поступили данные
{
IRComHandler(&results); // читаем результат
irrecv.resume();
}
} // loop
/////////////////////////////////////////////////////////////////////////////////
// Обработчик команд от IR датчика
void IRComHandler(decode_results *results)
{
int irp=results->value;
Serial.println(«ir=» + String(irp));
// NVS_RW(); // пишу-читаю в NVS
}void NVS_RW()
{
byte b;
Preferences prefs; // создаем объект
// Инициализируем хранилище с идентификатором «nvs».
// false относится в выбору режима чтение/запись, в данном случае и чтение и запись.
prefs.begin(«nvs1», false);
prefs.putInt(«p1», 65); //Сохраняем байт под именем «p1r»
b = prefs.getInt(«p1», 0); // Читаем сохранённый байт из p1
prefs.remove(«nvs1»); // Удаляем хранилище.Serial.println(«p1″=»+String(b));
} -
Оформи код правильно, а я потом тебя расстрою.
-
-
Прошу прощения за неправильно оформленный код — исправился
#include <Preferences.h>
#include <IRremote.h>byte RECV_PIN = 26; //IR приемник
IRrecv irrecv(RECV_PIN);
decode_results results;void setup() {
Serial.begin(115200); // устанавливаем скорость Com порта
delay(100);
irrecv.enableIRIn(); // Start the IR receiver
} // setupvoid loop() {
if (irrecv.decode(&results)) //если в IR Port поступили данные
{
IRComHandler(&results); // читаем результат
irrecv.resume();
}
} // loop
/////////////////////////////////////////////////////////////////////////////////
// Обработчик команд от IR датчика
void IRComHandler(decode_results *results)
{
int irp=results—>value;
Serial.println(«ir=» + String(irp));
// NVS_RW(); // пишу-читаю в NVS
}void NVS_RW()
{
byte b;
Preferences prefs; // создаем объект
// Инициализируем хранилище с идентификатором «nvs».
// false относится в выбору режима чтение/запись, в данном случае и чтение и запись.
prefs.begin(«nvs1», false);
prefs.putInt(«p1», 65); //Сохраняем байт под именем «p1r»
b = prefs.getInt(«p1», 0); // Читаем сохранённый байт из p1
prefs.remove(«nvs1»); // Удаляем хранилище.Serial.println(«p1»=«+String(b));
} -
Спасибо!
Теперь о плохом. Так обозначаются системные ошибки. Они возникают вследствие багов SDK, а не ошибок вашего кода.
Не скажу, что их нельзя обойти, но в проблему надо лезть очень глубоко.
-
@nsv2018, возможно нужно закрывать preferences
prefs.begin(«nvs1», false);
……………….
prefs.end(); -
Пробовал. Не помогает!
Да,уж!! Очень неожиданно!
В любом случае Большая благодарность всем откликнувшимся.
Но очень Странно.
Для подобных модулей классическая ситуация, когда с пульта управляется, а в NVS запоминаются параметы.
И еше, в интернете об этом ничего не нашел!
Неужели никто не решал подобной задачи?
Ведь она типовая!Завис красивый проект.
Очень прошу — если хоть какая то информация имеется — сообщите пож-ста.
Заранее благодарен. -
А если перед доступом к хранилищ глушить приёмик ИК?
Что то типа irrecv.disableIRIn();// -
ОНО это irrecv.disableIRIn(); не понимает
Заметил — если prefs.begin(«nvs1», false); (см скетч выше) , то все нормально — но не записывет.
т.е. ошибка возникает только при записи данных -
Я бы одно проверил — чтобы ничего за пределы массивов не вылетало если они есть в библиотеках.
-
Там наверняка идет прием, разбор сигнала и запись его в массив или в строку по указателю. Если места под него в библиотеке выделено недостаточно и нет контроля длины записи — может быть такая фигня.
-
Посмотрел на гитхабе код Arduino-IRremote. В IRremote.cpp вызывается в прерывании функция IRTimer() без атрибута IRAM_ATTR, по моему обязательного для прерываний.Функция дергается каждые 50мкс, в итоге при использовании библиотеки Preferences (небыстрое сохранение данных во флэш-память) валится в панику. Да и функциям NVS_RW() и IRComHandle() можно добавить этот атрибут.
//Interrupt Service Routine — Fires every 50uS
#ifdef IR_TIMER_USE_ESP32
void IRAM_ATTR IRTimer() //я бы добавил для проверки
#else
ISR (TIMER_INTR_NAME)
#endif -
Как это сделать?
Функция disableIRIn() в библиотеке отсутствует.
нашел в Гугле — https://github.com/markszabo/IRremoteESP8266/issues/57
но добавить функции в библиотеку не получилось.
До Гуру мне пока далековато, рано еще лезть в библиотеки -
Это я так, на вскидку написал. как идею. Наверняка есть функции отключающие ик
-
На мой взляд предложение от Mitrandir разумное — на момент передачи останавливать IRremote.
Но вот как это сделать — пока не знаю, подобная функция в библиотеке IRremote отсутствуетПроверил — не помогло!
-
По ссылке что вы дали на гитхаб есть такая фуНкция.
// main class for receiving IR
class IRrecv {
public:
explicit IRrecv(uint16_t recvpin, uint16_t bufsize = RAWBUF,
uint8_t timeout = TIMEOUT_MS,
bool save_buffer = false); // Constructor
~IRrecv(); // Destructor
bool decode(decode_results *results, irparams_t *save = NULL);
void enableIRIn();
void disableIRIn(); -
ох уж эта динамическая загрузка-выгрузка на сях…
-
попробуйте воспользоваться библиотекой марга что вы нашли
-
1. Воспользоваться этой библиотекой ее удается — ругается на отсутствие модуля gpio.h.
Она, похоже, для 8266 с соотв набором модулей в библиотеках.
2. Попытался в библиотеку добавить функцию void disableIRIn ().
Для этого:1. В модуль IRremote.h добавил void disableIRIn ();
// Main class for receiving IR
//
class IRrecv
{
public:
IRrecv (int recvpin) ;
IRrecv (int recvpin, int blinkpin);void blink13 (int blinkflag) ;
int decode (decode_results *results) ;
void enableIRIn ( ) ;
[B]void disableIRIn ();[/B]
bool isIdle ( ) ;
void resume ( ) ;2. В модуль irRecv.cpp добавил опимание функции void disableIRIn()
///////////////////////////////////////////////////////////////////////////////
void IRrecv::disableIRIn()
{
// irReadTimer.Stop();
// os_timer_disarm(&irReadYimer);
ETS_INTR_LOCK();
ETS_GPIO_INTR_DISABLE();
}Теперь ругается что не понимает
ETS_INTR_LOCK();
ETS_GPIO_INTR_DISABLE();
Где они описывется пока не нашел.
Куда двигаться дальше.Или, альтернативный вариант останова IRremote.
В сети ничего не нашел
Страница 1 из 2
Содержание
- Русские Блоги
- [esp32] Анализ ошибок медитации гуру и решения
- esp32 Решение ошибки медитации гуру
- Guru Meditation
- IllegalInstruction
- InstrFetchProhibited
- LoadProhibited, StoreProhibited
- IntegerDivideByZero
- LoadStoreAlignment
- LoadStoreError
- Unhandled debug exception
- Debug exception reason: Stack canary watchpoint triggered (task_name)
- Interrupt wdt timeout on CPU0 / CPU1
- Cache disabled but cached memory region accessed
- Что такое ошибка 502 Bad Gateway и как ее исправить
- Что означает ошибка 502 Bad Gateway
- Что делать, если вы пользователь
- Перезагрузить страницу
- Проверить подключение к интернету
- Очистить кэш и cookies
- Очистить кэш DNS
- Попробовать зайти с другого браузера
- Отключить плагины и расширения
- Зайти на страницу позже
- Читайте также
- Что делать, если вы администратор сайта
- Проверка журнала ошибок
- Проверка плагинов
- Проверка сети CDN
- Ошибка 502 на виртуальном хостинге VPS/VDS
- Запустить команду top
- Посмотреть логи Apache и nginx
- Увеличить объем памяти
- Проверить лимиты на php-cgi процессы
- Обратиться к службе технической поддержки
Русские Блоги
[esp32] Анализ ошибок медитации гуру и решения
esp32 Решение ошибки медитации гуру
Guru Meditation
- Этот раздел будет напечатан на Guru Meditation Error: Core panic’ed Причины ошибок в скобках будут объяснены одна за другой.
IllegalInstruction
Это исключение ЦП означает, что текущая выполняемая инструкция не является допустимой. Распространенные причины этой ошибки:
- Функция задачи в FreeRTOS вернулась. В FreeRTOS, если вы хотите завершить функцию задачи, вам нужно вызвать vTaskDelete() Функция освобождает ресурсы текущей задачи вместо прямого возврата.
- Не удается загрузить следующую инструкцию из SPI Flash, обычно это происходит:
- Прикладная программа перенастраивает контакты SPI Flash на другие функции (такие как GPIO, UART и т. Д.). Для получения подробной информации о выводах SPI Flash, пожалуйста, обратитесь к руководству по проектированию оборудования и спецификации микросхемы / модуля.
- Некоторые внешние устройства случайно подключаются к контактам SPI Flash, что мешает обмену данными между ESP32 и SPI Flash.
InstrFetchProhibited
Это исключение ЦП означает, что ЦП не может загрузить инструкцию, потому что адрес инструкции не находится в допустимой области IRAM или IROM.
Обычно это означает, что в коде вызывается указатель функции, который не указывает на действительный блок кода. В этом случае вы можете проверить PC (Программный счетчик) значение регистра и сделайте дальнейшее суждение: если это 0 или другое недопустимое значение (то есть, если оно не 0x4xxxxxxx Обстоятельства) подтверждается, что это действительно причина.
Если указатель ПК указывает на недопустимую область в большом масштабе, возможная причина дамп памятиПлохой контакт на булавкеИ другие причины.
Для получения подробной информации вы можете проверить карту esp32 ниже, чтобы определить положение указателя компьютера (не ограничиваясь этим разделом).
LoadProhibited, StoreProhibited
Этот тип исключения ЦП возникает, когда приложение пытается прочитать или записать в недопустимую область памяти. Такие недопустимые адреса памяти могут быть сброшены в регистр EXCVADDR Нашел в. Если адрес равен нулю, это обычно означает, что приложение пытается разыменовать NULL указатель. Если адрес близок к нулю, это обычно означает, что приложение пытается получить доступ к члену структуры, но указатель структуры NULL , Если адрес является другим недопустимым значением (не в 0x3fxxxxxx — 0x6xxxxxxx В пределах диапазона) это может означать, что указатель, используемый для доступа к данным, не инициализирован или поврежден.
IntegerDivideByZero
Приложение пыталось разделить целое число на ноль.
LoadStoreAlignment
Ячейка памяти, которую приложение пытается читать / писать, не соответствует требованиям к размеру с выравниванием по байтам для инструкций загрузки / сохранения. Например, 32-разрядная инструкция загрузки может обращаться только к 4-разрядным адресам памяти, в то время как 16-разрядная инструкция загрузки может обращаться только к 2-байтовый адрес памяти с выравниванием.
LoadStoreError
Приложение пытается выполнить 8-битные или 16-битные операции загрузки / сохранения из области памяти, которая поддерживает только 32-битную загрузку / сохранение, например, разыменование области памяти команд. char* Указатель вызовет такую ошибку.
Unhandled debug exception
Обычно за этим следует сообщение:
Debug exception reason: Stack canary watchpoint triggered (task_name)
Эта ошибка указывает на то, что позиция, записанная приложением, находится за концом стека задач имя_задачи. Обратите внимание, что эта ошибка не запускается каждый раз при переполнении стека. Задача может обойти канарейку стека (stack canary) для доступа к стеку, в этом случае точка мониторинга не будет запущена.
Interrupt wdt timeout on CPU0 / CPU1
Это указывает на то, что истекло время ожидания сторожевого таймера прерывания.
Cache disabled but cached memory region accessed
@ С этой проблемой сталкивались многие люди, особенно здесь, чтобы подвести итог, эта часть контента благодарна Чжану, которому неудобно раскрывать свое имя, за его помощь
Причина этой проблемы в том, что во время отключения кеша (например, при использовании spi_flash API для чтения / записи / стирания / отображения SPI Flash) возникает прерывание IRAM-Safe, и программа прерывания обращается к ресурсам флэш-памяти. Обычно это происходит, когда обработчик прерывания вызывает программу во флэш-памяти и ссылается на константы во флэш-памяти. Стоит отметить, что при использовании в обработчике прерывания double Переменная типа из-за double Реализация операции переменной типаПрограммная реализацияДа, поэтому часть реализации также хранится во флэш-памяти (например, операции приведения).
Решение:
- Добавить к функции, доступ к которой осуществляется в прерывании IRAM_ATTR Модификатор
- Добавить к константе, доступ к которой осуществляется в прерывании DRAM_ATTR Модификатор
- Не используется в обработчике прерывания double Тип операция
- нужно знать:
1. Это исключение возникает только в прерывании IRAM-Safe, то есть при использовании ESP_INTR_FLAG_IRAM Зарегистрированный обработчик прерывания.
2. Это исключение будет возникать только при отключении кеша, поэтому оно не произойдет, если кеш не отключен, другими словами, исключение является случайным.
3. Компилятор может поместить некоторые переменные, которые не будут изменены, в раздел .rodata, даже если программист не добавит модификатор const. Для приложений ESP32 .rodata означает, что деталь находится во флэш-памяти. Для строковых переменных эту ситуацию легко обнаружить, но для некоторых констант обнаружить не так просто. Например, следующая ситуация
Здесь определяется массив указателей TG.Элемент массива является первым адресом регистра двух аппаратных таймеров 0 и 1. Элемент массива указателей не будет изменен, поэтому он будет помещен в .rodata компилятором. В это время TG работает в прерывании от таймера, и это прерывание происходит во время запретного периода кеширования, тогда ЦП генерирует исключение.
- Навыки отладки проблемы
- Когда ЦП выдает этот тип исключения, обычно местоположение исключения является местоположением ошибки, и вам нужно внимательно изучить
В этом примере место возникновения исключения — 0x4011b808 , вот __fixunssfdi Место хранения функции, и это место находится во внешней памяти (см. Раздел 1.3.3 esp32_technical_reference_manual). Эта функция используется для преобразования числа с плавающей запятой в 64-битное целое число без знака, что означает, что обработчик прерывания использует double Тип операции приведения данных. Эта операция не разрешена, когда кеш отключен.
- Если вы не знаете, находится ли переменная в разделе .data / .bss или .rodata, вы можете использовать команду readelf для просмотра сведений о символах в .elf
Используйте команду readelf для извлечения таблицы символов в файле elf. Чтобы узнать, как просмотреть таблицу символов, обратитесь к структуре хранения переменных языка C. С помощью таблицы символов вы можете точно увидеть место хранения и размер каждой переменной и функции. С помощью этой информации вы можете проверить, находятся ли переменные и функции, используемые в обработчике прерываний IRAM-Safe, во флэш-памяти.
Источник
Что такое ошибка 502 Bad Gateway и как ее исправить
Загружая страницу, браузер отправляет кучу запросов другим серверам. Они обрабатывают все запросы, затем возвращают код ответа HTTP с определенным результатом. Если в процессе этого возникнет какой-то сбой, на экране браузера отобразится ошибка. И одна из таких ошибок – 502 Bad Gateway. Я расскажу, что она означает, по каким причинам выходит, а еще опишу способы ее устранения.
Что означает ошибка 502 Bad Gateway
Ошибки, принадлежащие серии 5xx, означают появление проблем на стороне сервера. Если взять конкретно ошибку 502 Bad Gateway, то ее появление будет означать получение неправильного ответа сервера. «Виновниками» в такой ситуации обычно являются прокси, DNS или хостинг-серверы.
Что делать, если вы пользователь
Ошибка 502 Bad Gateway может появиться на любом сайте. Пользователю для начала следует проверить, не является ли причиной проблемы какие-то неполадки с его стороны. Сделать это можно указанными ниже способами.
Перезагрузить страницу
Возможно, на момент загрузки число запросов на сайт превышает определенный лимит, устанавливаемый владельцем сайта. Если это действительно так, тогда простая перезагрузка страницы вполне будет уместна. Я рекомендую обновить страницу как минимум три раза в течение 2-3 минут и только потом приступать к следующим способам.
Проверить подключение к интернету
Стоит проверить работу модема и попробовать загрузить другие страницы. Убедитесь, что подключение к интернету стабильное. Еще вариант – перезапустить маршрутизатор и попробовать снова загрузить проблемный сайт.
Очистить кэш и cookies
Нередко причиной появления данной ошибки могут быть неверно загруженные cookies и кэш. В таких случаях необходимо просто очистить данные в настройках интернет-обозревателя.
Для любого браузера актуально – зайти в историю просмотров и найти ссылку «Очистить историю». В новом окне отметить пункты с кэшем и cookies, затем подтвердить действие. Как только данные будут удалены, надо вновь попробовать загрузить страницу. Не помогло? Идем дальше!
Очистить кэш DNS
Допустимо, что в кэше установлено неправильное значение IP-адреса. Для таких случаев можно использовать сброс DNS кэша. В ОС Windows необходимо открыть инструмент «Командная строка» (вводим в поисковую строку название программы и выбираем запуск от имени администратора).
Далее следует ввести вот такую команду и активировать ее нажатием на клавишу Enter:
Нужно подождать некоторое время, пока операция не завершится. Как только действие будет завершено, на экране выйдет подтверждение, что кэш был очищен.
Для Linux действие примерно схоже, но команда выглядит иначе. Открываю утилиту «Терминал» и ввожу в поле вот такой запрос:
Для других дистрибутивов:
Попробовать зайти с другого браузера
Проблема 502 Bad Gateway может быть актуальна и для конкретного браузера. Если у вас на компьютере есть другой интернет-обозреватель, попробуйте открыть сайт через него.
Отключить плагины и расширения
На загрузку некоторых страниц могут влиять установленные в браузер плагины и расширения. Особенно это касается VPN-сервисов и блокировщиков рекламы. Попробуйте поочередно отключать их и перезапускать страницу. Не исключено, что виновник будет найден.
Зайти на страницу позже
Когда ничего из вышеперечисленного не помогло, значит, проблема все же кроется на стороне сервера. Вам остается только подождать некоторое время, пока разработчики не устранят ошибку на сайте. Вы также можете написать владельцу и сообщить о проблеме.
Читайте также
Что делать, если вы администратор сайта
Обычно такие проблемы самостоятельно решать не рекомендуется. Лучше сразу же обратиться в службу технической поддержки и описать проблему. Но есть пара действий, которые все же могут помочь определить источник проблемы.
Проверка журнала ошибок
Актуально в случаях, при которых ошибка 502 Bad Gateway появляется после внесения изменений или обновления. Определить это очень просто, нужно лишь проверить журнал ошибок. В CMS WordPress можно включить запись возникающих ошибок, добавив в файл wp-config.php вот такие строки:
После этого все записи начнут отображаться в файле debug.log. Храниться он будет в директории wp-content. Понадобится некоторое время, чтобы причины ошибок были записаны. Потом можно тщательно изучить записи и уже на основе их предпринимать конкретные изменения.
Проверка плагинов
Следует проверить, не влияют ли какие-либо плагины на работу сайта. Для этого можно поочередно отключать их, просто переименовывая папку интересующего плагина. Для этого надо выделить папку, затем нажать на меню «Файл» и в нем выбрать пункт «Переименовать».
Проверка сети CDN
Сети CDN и службы предотвращения DoS тоже могут влиять на работу сайта. Обычно виновник проблемы указывается на странице с кодом ошибки. Например, если под кодом 502 Bad Gateway есть строка cloudflare-nginx, значит, для исправления ошибки надо обратиться в службу поддержки CloudFlare. Можно отключить данный сервис, но потом придется долго ждать обновления DNS (это может занять несколько часов).
Ошибка 502 на виртуальном хостинге VPS/VDS
Ошибка 502 Bad Gateway возникает из-за превышения лимита трафика пользователей, «шалостей» бота, скачивания сайта или даже DoS‑атаки. Решение данной проблемы кроется в ограничениях памяти.
Запустить команду top
Данный запрос в терминале поможет установить наличие свободной памяти. Этим же способом можно проверить, работает ли Apache.
Посмотреть логи Apache и nginx
Обычно в этих логах отображается активность пользователей. Если есть что-то подозрительное, можно предпринять действия. К примеру, забанить определенные IP-адреса, настроить Fail2ban или подключить систему защиты от DoS-атак.
Если после этого количество запросов к серверу снизилось, необходимо перезапустить Apache.
Увеличить объем памяти
Бывает, что с логами все нормально, но памяти на обработку запросов все равно не хватает. Узнать об этом просто – при проверке командой top будет выдана ошибка OOM (out of memory). В таких случаях можно просто увеличить ее объем. Можно просто заказать другой тариф, в котором количество предоставляемой памяти больше. Подробнее об этом.
Проверить лимиты на php-cgi процессы
Если после проверки командой top показано, что свободной памяти еще достаточно, значит, на php-cgi процессы установлены лимиты. Для решения надо открыть конфигурационный файл Apache – httpd.conf, найти секцию модуля FastCGI (mod_fascgi или mod_fastcgid) и увеличить лимит.
Обратиться к службе технической поддержки
Если вышеперечисленные способы исправления ошибки 502 на виртуальном сервере не помогут, придется обращаться в техподдержку хостинга. При этом обязательно надо упомянуть, что вы уже предприняли и как проводили все действия.
Источник