Вступить в клуб →
сложнаявопросМикроконтроллеры и аппаратные протоколы

Задача уходит в аварийный обработчик после добавления локального буфера

Задача логирования работала стабильно. После добавления локального буфера прошивка стала уходить в аварийный обработчик, а иногда вместо этого портятся данные соседней задачи:

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 задача вытесняет системные задачи и портит их внутренние данные

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела