Почему я получаю причину исключения отладки: сработала сторожевая канарская точка наблюдения (основная)? - PullRequest
1 голос
/ 26 июня 2019

Я пишу программу для 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 Ответ

1 голос
/ 27 июня 2019

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

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

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

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

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

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

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

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

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

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

enter image description here

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

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

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

...