Обработчик прерывания вызывает блокирующие функции 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: после этого обе строки становятся безопасными в контексте прерывания
- Проблема только в приоритете прерывания: если он лежит в разрешённом планировщиком диапазоне, обе строки допустимы
