Перейти к содержанию

Что значит 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-битное чтение с нечётного адреса

Как читать дамп

  1. EXCVADDR — адрес, к которому обращалась программа. 0x00000000 — разыменование NULL; маленькое число вроде 0x00000010 — обращение к полю структуры через NULL-указатель; «мусор» вне областей памяти 0x3fxxxxxx–0x6xxxxxxx — испорченный указатель.
  2. Backtrace — цепочка вызовов. Верхний адрес — место аварии, следующие — откуда её вызвали.
  3. Причина в скобках — по таблице выше.
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.

Источники

  1. 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 переводит адреса трассировки в функции, файлы и строки
  2. 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

Нашли ошибку?