Задача уходит в аварийный обработчик после добавления локального буфера
Задача логирования работала стабильно. После добавления локального буфера прошивка стала уходить в аварийный обработчик, а иногда вместо этого портятся данные соседней задачи:
static void log_task(void *arg) {
char line[512];
for (;;) {
snprintf(line, sizeof(line), "t=%lu st=%u", get_ticks(), get_state());
uart_write(line);
vTaskDelay(pdMS_TO_TICKS(100));
}
}
xTaskCreate(log_task, "log", configMINIMAL_STACK_SIZE, NULL, 2, NULL);
Что произошло?
- Массив нужно объявить volatile, иначе планировщик переиспользует занятую им память при переключении задач
- Функции форматирования из стандартной библиотеки нельзя вызывать в задачах FreeRTOS, нужна собственная реализация
- Буфер лежит в стеке задачи, а стек создан минимального размера: snprintf переполняет его и затирает соседнюю память
- Слишком высокий приоритет: с приоритетом 2 задача вытесняет системные задачи и портит их внутренние данные
