Глубина стека задач FreeRTOS
Вполне вероятно, это вызвано переполнением стека в вашей задаче FreeRTOS.
Увеличение глубины стека
Первое, что я хотел бы сделать, это увеличить глубину стека для вашей задачи FreeRTOS.Например, если вы создали свою задачу с размером стека configMINIMAL_STACK_SIZE
, это может быть всего 768 байт - что недостаточно для многих общих требований.
Сколько нужно увеличитьглубина стека на?
Ответить на это нелегко, но - в этом случае - может быть достаточно просто увеличить его, пока у вас больше не будет переполнения стека.Если вас беспокоит бесполезная трата памяти, FreeRTOS включает механизм , позволяющий узнать, насколько близко задача подошла к переполнению своего стека.
Буферы и канареи
канарейка - это просто маркер в конце буфера, который периодически проверяется.Если это значение отличается от значения по умолчанию, это означает, что программа попыталась выполнить запись за пределами буфера, т.е. произошел переполнение буфера .
Обнаружение переполнения стека с помощьюcanaries включается в ESP IDF путем изменения двух параметров в конфигурации (в разделе Component Config
-> FreeRTOS
):
- 'Проверка на переполнение стека' -> 'с использованием канареечных байтов'
- 'Установить контрольную точку отладки как проверку переполнения стека' -> включено
Если вы отключите второй параметр, вы будетевместо этого получите ошибку медитации Гуру - исключение LoadProhibited
- в случае переполнения стека.
xTaskCreate()
и глубины стека
Имейте в виду, что версия xTaskCreate()
вESP IDF отличается от оригинальной FreeRTOS.В оригинальном FreeRTOS глубина стека указана в словах .В ESP IDF это , указанное в байтах .A очень важное различие!