Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
vovk.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
456.19 Кб
Скачать

44. Обробка переривань в ос qnx-6.

Чтобы вызвать прерывание, аппаратура выставляет сигнал на линии прервания. Как только сигнал прерывания выставлен, ядро переключается на участок кода, который настраивает окружение для выполнения подпрограммы обработки прерывания – кода, который определяет, что должно происходить при обнаружении прервыания.

Обработчик прерываний обычно выполняет минимально возможный объем работы и завершается. Когда обработчик перываний завершается, он может либо сообщить ядру, что ничего больше не надо, либо что ядро должо выполнить некоторое действие, вследствие которого некий поток может переключиться в состояние READY.

Neutrino полностью обеспечивает управление аппаратными прерываниями. Для обработки прерываний приложения необходимо привязать нужную функцию обработки к искомому прерыванию, используя вызовы ядра. К одному аппаратному прерыванию могут быть привязаны несколько обработчиков, которые получают управления соотстветсвенно с приоритетом потоков, которым они принадлежать.

Время ожидания прерывания – время от момента появления аппаратного прерывания до выполенния первой команды программы обработки прерывания. Некоторые критические секции кода требуют, чтобы прерывания были временно заблокированы. Максимальное время блокировки прерывания обычно определяет время ожидания пререрывания в наихуджешм случае – у QNX это время составляет 0.5 – 2 мкс.

В некоторых случая, обработчик аппаратного прерывания с низким приоритетом должен ждать выполнение потока с более высоким приоритетом. Время ожидания диспетчеризации – это время между последней командой программы пользователя ы исполнением первой команды потока драйвера. Оно определеят время, которое необходимо, чтобы сохранить конеткст активного потока и восстановить контектс потока драйвера. Время ожидания диспетчеризации больше, чем время ожидания прерывания.

Фунции API для обработки прерываний основаны на системных запросах ядра:

InterruptAttach() – прикрепить функцию к вектору прерывания.

InterruptAttachEvent() – генерировать событие прерывания. Никакая программа обработки прерывания пользователя не выполняется.

InterruptDetach() – отделить функцию от прерывания, используя ID, InterruptAttach(), InterruptAttachEvent().

InterruptWait() – ожидать прерывание.

InterruptEnable() – включить аппаратные прерывания.

InterruptDisable() – отключить аппаратные прерывания.

InterruptMask() – маскировать аппаратное прерваение.

InterruptUnmask() – демаскировать аппаратное прерывание.

InerruptLock() – блокировать критическую секцию кода между программой обработки прерывания и потоком.

InterruptUnlock() - удалить блокирование на критической секции кода.

Используя этот набор API, поток уровня пользователя может вызывать InterruptAttach(), InterruptAttachEvent(). Можно многим обработчикам прерываний обрабатывать каждый номер аппаратного прерывания. Аппаратное устройство, которое сгенерировало прерывание, будет удерживать сигнал прерывания до тех пор, пока не удостоверится в том , что прерывание успешно обработано.

Псевдокод типичного прерывания:

Function ISR begin

Определяем источник прерывания

Очистить источник прерывания

If надо передать работу потоку then

Return(событие);

Else

Return(NULL);

Endif;

end

Событие, которое возвращается, должно быть описано вне ISR, чтобы оно существовало после возврата из ISR или может быть описано в ISR как статическое. При генерации события ядро перепланирует потоки. Если же ISR событие не возвращает, то перепланирование не произойдет и будет выполнятся поток, который был вытеснен ISR .

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]