Почему я получаю причину исключения отладки: сработала сторожевая канарская точка наблюдения (основная)?
Я пишу программу для 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 он указывается в байтах. Очень важное различие!