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

Обработчик прерывания вызывает блокирующие функции FreeRTOS

В проекте на FreeRTOS обработчик внешнего прерывания выглядит так:

void EXTI0_IRQHandler(void) {
    Event ev = read_event();
    xQueueSend(evt_queue, &ev, portMAX_DELAY);   // (1)
    vTaskDelay(pdMS_TO_TICKS(10));               // (2)
}

Прошивка периодически уходит в аварийный обработчик или намертво зависает при интенсивном потоке событий. Какая оценка кода верна?

  • Код корректен: очередь потокобезопасна сама по себе, а задержка лишь немного удлиняет время работы обработчика
  • Из прерывания нельзя делать блокирующие вызовы: нужна ISR-версия функции, а задержка задачи тут недопустима
  • Достаточно заменить portMAX_DELAY на 0: после этого обе строки становятся безопасными в контексте прерывания
  • Проблема только в приоритете прерывания: если он лежит в разрешённом планировщиком диапазоне, обе строки допустимы

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

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

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

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