Перевод может содержать ошибки. Читайте первоисточник: Deferred Interrupt Handling
Назад: [Более подробно...] | Вверх: [Более подробно...] | Вперёд: [Более подробно...] |
Во FreeRTOS обработчик отложенного прерывания является задачей ОС, которая разблокируется (запускается) обработчиком прерывания (ISR), поэтому обработка, вызванная прерыванием (ISR), может выполняться в разблокированной задаче, а не в самом обработчике прерывания (ISR) (мдя... типа, русский язык?). Механизм отличается от стандартной обработки прерываний, в которой вся обработка выполняется внутри обработчика прерываний, потому что бОльшая часть обработки откладывается до выхода из обработчика прерывания (ISR).
Стандартная обработка прерывания обычно подразумевает запись причины прерывания, очистку аппаратного флага прерывания, а затем выполнение всей обработки, связанной с прерыванием. И всё это внутри обработчика прерывания.
Обработка отложенного прерывания как правилв включает в себя запись причины прерывания и очистку прерывания внутри обработчика прерывания (ISR), но после этого разблокируется задача ОС и вся последующая необходимая обработка осуществляется уже в разблокированной задаче, а не внутри обработчика прерывания (ISR).
Если у задачи, которой передаётся отложенная обработка прерывания, достаточно высокий приоритет, из обработчика прерывания (ISR) будет осуществлён возврат сразу к разблокированной задаче. Т.е. прерывание прервёт одну задачу, но затем вернёт управление уже в другую. Это приведёт к тому, что вся обработка прерывания будет выполнена непрерывно во времени (без зазора), как если бы вся обработка выполнялась внутри обработчика прерывания (ISR). Это показано на рисунке ниже, где вся обработка прерывания выполняется между моментами времени t2 и t4, даже с учётом того, что часть обработки выполняется задачей ОС.
Пояснения к изображению:
Большинство разработчиков встраиваемых приложений стремится минимизировать время нахождения в обработчике прерывания, чтобы уменьшить джиттер в системе, разрешить другие прерывания с таким же или более низким приоритетом, сократить время отклика на прерывание и т.д.. И применение отложенной обработки прерывания является удобным способом достижения этого. Однако механизм сначала разблокировки а затем переключения на задачу ОС также требует некоторого колчества времени, поэтому, как правило, выигрыш при обработке прерываний можно получить, если приложение: только если обработка:
Методы перекладывания обработки прерывания на задачу делятся на две категории:
Централизованная обработка отложенных прерываний называется так потому что каждое прерывание, которое использует этот метод, выполняется в контексте одной и той же задачи демона ОС. Задача демона ОС создаётся самой FreeRTOS, и также называется "задача обслуживания таймеров".
Чтобы отложить обработку прерывания для задачи демона ОС, нужно передать указатель на функцию обработки прерывания в качестве параметра xFunctionToPend при вызове функции API xTimerPendFunctionCallFromISR(). Работающий пример есть на странице документации по функции xTimerPendFunctionCallFromISR().
Преимуществом централизованной отложенной обработки прерываний является минимальное использование ресурсов, т.к. каждый обработчик отложенных прерываний использует одну и ту же задачу.
К недостаткам централизованной обработки отложенных прерываний относятся:
Управляемая приложением обработка отложенных прерываний называется так потому, что каждое прерывание, использующее этот метод, выполняется в контексте задачи, созданной разработчиком приложения. Рабочий пример есть на странице Использование уведомлений задаче в качестве легковесных счётных семафоров.
Преимущества управляемой приложением обработки отложенных прерываний:
Недостатком использования управляемой приложением обработки отложенных прерываний является большее потребность в ресурсах, т.к. как правило требуется больше отдельных задач.