Почему я получаю причину исключения отладки: сработала сторожевая канарская точка наблюдения (основная)?

Я пишу программу для esp32-wroom-32 с помощью esp-idf-v3.0,
Я пытаюсь добавить логи, которые будут сохранены в FATFS.
После некоторых логов я получаю:

21:54:21.306 -> Debug exception reason: Stack canary watchpoint triggered (main) 
21:54:21.306 -> Register dump:
21:54:21.306 -> PC      : 0x40089827  PS      : 0x00060b36  A0      : 0x40082179  A1      : 0x3ffd3860  
21:54:21.340 -> A2      : 0x3ff40000  A3      : 0x00000033  A4      : 0x00000033  A5      : 0x00000000  
21:54:21.340 -> A6      : 0x00000024  A7      : 0xff000000  A8      : 0xe37fc000  A9      : 0x0000007e  
21:54:21.340 -> A10     : 0x00000000  A11     : 0xffffffff  A12     : 0x00000004  A13     : 0x00000001  
21:54:21.340 -> A14     : 0x00000005  A15     : 0x00000000  SAR     : 0x00000004  EXCCAUSE: 0x00000001  
21:54:21.340 -> EXCVADDR: 0x00000000  LBEG    : 0x400014fd  LEND    : 0x4000150d  LCOUNT  : 0xfffffff6  

Почему это происходит с главным?

1 ответ

Глубина стека задач FreeRTOS

Скорее всего, это вызвано переполнением стека в вашей задаче FreeRTOS.

Увеличьте глубину стека

Первое, что я сделал бы, это увеличил глубину стека для вашей задачи FreeRTOS. Например, если вы создали свою задачу с размером стекаconfigMINIMAL_STACK_SIZE, это может быть всего 768 байт, чего недостаточно для многих общих требований.

Насколько увеличить глубину стека?

На этот вопрос нелегко ответить, но - в этом случае - может быть достаточно просто увеличить его до тех пор, пока не исчезнет переполнение стека. Если вы беспокоитесь о том, чтобы не тратить память напрасно, FreeRTOS включает механизм, позволяющий узнать, насколько близка задача к переполнению своего стека.

Буферы и канарейки

Канарейка просто маркер в конце буфера - который проверяется периодически. Если оно отличается от значения по умолчанию, это означает, что программа попыталась выполнить запись за пределами конца буфера, т.е. произошло переполнение буфера.

Обнаружение переполнения стека с использованием канареек включено в ESP IDF путем изменения двух параметров в конфигурации (в Component Config -> FreeRTOS раздел):

  • 'Проверить переполнение стека' -> 'используя канареечные байты'
  • 'Установить точку наблюдения за отладкой как проверку переполнения стека' -> включено

Если вы отключите вторую опцию, вместо этого вы получите ошибку Guru Meditation - a LoadProhibited исключение - в случае переполнения стека.

xTaskCreate() и глубина стека

Имейте в виду, что версия xTaskCreate()в ESP IDF отличается от исходного FreeRTOS. В исходной FreeRTOS глубина стека указывается словами. В ESP IDF он указывается в байтах. Очень важное различие!

Другие вопросы по тегам