Что значит Guru Meditation Error (LoadProhibited) на ESP32?
Обновлено Редакция GAW
«Guru Meditation Error» — так обработчик паники ESP-IDF называет любую фатальную ошибку. Главное — слово в скобках после panic'ed: оно называет причину.
Частые причины (ESP-IDF Fatal Errors)
| В скобках | Что произошло | Типичная причина |
|---|---|---|
| LoadProhibited | чтение по недопустимому адресу | NULL-указатель, неинициализированный указатель |
| StoreProhibited | запись по недопустимому адресу | то же, переполнение массива |
| InstrFetchProhibited | переход по адресу вне кода | испорченный указатель на функцию |
| IllegalInstruction | неверная команда | задача FreeRTOS вернулась, заняты выводы флеш-памяти |
| IntegerDivideByZero | деление на ноль | целочисленное деление |
| LoadStoreAlignment | невыровненный доступ | 32-битное чтение с нечётного адреса |
Как читать дамп
- EXCVADDR — адрес, к которому обращалась программа.
0x00000000— разыменование NULL; маленькое число вроде0x00000010— обращение к полю структуры через NULL-указатель; «мусор» вне областей памяти 0x3fxxxxxx–0x6xxxxxxx — испорченный указатель. - Backtrace — цепочка вызовов. Верхний адрес — место аварии, следующие — откуда её вызвали.
- Причина в скобках — по таблице выше.
struct sensor *s = find_sensor(id); // returns NULL when nothing is found
float t = s->temperature; // LoadProhibited, EXCVADDR = offset of the field
Наш пример: если поле temperature лежит на смещении 8 байт от начала структуры, EXCVADDR будет 0x00000008 — «почти ноль», как описывает Espressif.
Похожие аварии на Cortex-M называются HardFault — разбор вызова по неверному указателю есть в ответе «HardFault при вызове по указателю на функцию». Переполнение стека ESP-IDF тоже обрабатывает как фатальную ошибку, а предупреждения сторожа задач разобраны в ответе «Task watchdog got triggered».
Похожие вопросы
Как превратить адреса Backtrace в строки кода?
IDF Monitor делает это сам: по документации Espressif он переводит адреса в имена функций, файлы и номера строк и дописывает их под трассировкой. В других средах адреса переводят утилитой addr2line из того же тулчейна по ELF-файлу этой сборки.
Почему ESP32 сразу перезагружается и я не успеваю прочитать сообщение?
Так настроено по умолчанию: печать регистров, трассировки и перезапуск. Чтобы чип остановился, выберите CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT или задайте задержку перезапуска CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS.
Что значит IllegalInstruction сразу после запуска?
Чаще всего — функция задачи FreeRTOS завершилась через return вместо vTaskDelete(), либо программа переназначила выводы, к которым подключена флеш-память, и процессор не может прочитать следующую команду. Ещё одна причина — функция C++ с возвращаемым значением, но без return.
Источники
- Espressif. ESP-IDF Programming Guide v5.4 (ESP32): Fatal Errors — обработчик паники печатает причину в скобках после «Guru Meditation Error: Core N panic'ed»; по умолчанию CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT — регистры, трассировка и перезапуск; место ошибки — верхняя строка после Backtrace; LoadProhibited/StoreProhibited — чтение или запись по недопустимому адресу, адрес в EXCVADDR: ноль — NULL-указатель, близко к нулю — поле структуры по NULL-указателю, мусор вне 0x3fxxxxxx–0x6xxxxxxx — неинициализированный или испорченный указатель; IllegalInstruction — вернувшаяся задача FreeRTOS, переназначенные выводы флеш-памяти, функция C++ без return; InstrFetchProhibited — вызов по указателю на функцию вне кода (PC = 0 или не 0x4xxxxxxx); IntegerDivideByZero, LoadStoreAlignment; к фатальным ошибкам относятся также сторож прерываний, переполнение стека и срабатывание детектора просадки; IDF Monitor переводит адреса трассировки в функции, файлы и строки
- Espressif. ESP-IDF v5.4, components/esp_system/Kconfig — choice ESP_SYSTEM_PANIC «Panic handler behaviour», по умолчанию ESP_SYSTEM_PANIC_PRINT_REBOOT — печать регистров и перезапуск; ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS — задержка перезапуска 0–99 с, по умолчанию 0
Нашли ошибку?
Смотрите также
- Почему ESP32 пишет «Task watchdog got triggered»?Цикл без vTaskDelay блокирует задачу простоя; тайм-аут по умолчанию 5 с
- HardFaultИсключение Cortex-M при необработанной ошибке
- СтекОбласть ОЗУ для адресов возврата и локальных переменных
- Почему вызов функции по указателю даёт HardFault на Cortex-M?Указатель NULL или без бита Thumb: INVSTATE, в кадре стека PC = адрес вызова
- Можно ли отключить детектор просадки питания (brownout) на ESP32?Технически да, но порог 2,43 В уже ниже 3,0 В — после отключения сбои станут тише и хуже