Алгоритм обработки прерываний

 

Сигнал запроса на прерывание вырабатывается периферийным устройством при его готовности к обмену информацией. Сигнал может появиться в произвольный момент времени.

Процессорное ядро может реагировать на запросы прерываний по-разному. В каждой архитектуре реализуется своя оригинальная система обслуживания прерываний. Однако общий алгоритм обработки запросов всегда содержит одни и те же действия ядра:

0 при поступлении запроса на прерывание завершается выполнение текущей инструкции программы;

0 записывается в стек содержимое программного счетчика и текущее состояние некоторых наиболее важных регистров общего назначения;

0 идентифицируется прерывающее устройство;

0 осуществляется переход к выполнению подпрограммы обслуживания прерывания для идентифицированного устройства;

0 по окончании подпрограммы восстанавливает состояние прерванной программы за счет извлечения из стека содержимого регистров общегоназначения и программного счетчика;

0 возобновляется выполнение прерванной программы.

 

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

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

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

Наиболее простым является фиксированное распределение приоритетов. При этом каждому из источников запросов присваивается постоянный приоритет, соответствующий его порядковому номеру в схеме.

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