Контроллер прерываний 8259

Приоритеты прерываний

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

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

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

В IBM PC совместимых устройствах используется микросхема программируемого котроллера прерываний Intel 8259 (отечественный аналог КР580ВН59 или КР1810ВН59А) для обслуживания запросов прерываний от различных устройств. Контроллер обеспечивает восемь векторов.

Запрос на прерываниеобозначается как IRQ(Interrupt Request) с соответствующим порядковым номером. Для IBM PC XT существует 8 уровней приоритетов, а для IBM PC AT и последующих серий – 16. Обращения к соответствующим уровням обозначаются сокращениями от IRQ0 до IRQ7 (или от IRQ0 до IRQ15), что означает запрос на прерывание.

Микросхемы контроллера прерываний можно объединять (каскадировать) для увеличения количества уровней приоритетов. При этом общее число уровней прерываний будет достигать 64. Запросы на прерывание 0-7 соответствуют векторам прерываний от 8H до 0FH, запросы на прерывания 8-15 – векторами от 70H до 77H. В табл. 92 приведены назначения этих прерываний.

 

 

Табл. 92. Аппаратные прерывания в порядке приоритета.

Номер IRQN Описание прерывания
IRQ0 Прерывание таймера, возникает с частотой 18.2 Гц.
IRQ1 Прерывание от клавиатуры. Генерируется при нажатии и отпускании клавиши. Используется для чтения данных от клавиатуры.
A IRQ2 Каскадирование аппаратных прерываний.
IRQ8 Прерывание от часов реального времени.
IRQ9 Прерывание от контроллера видеоадаптера.
IRQ10 Зарезервировано.
IRQ11 Зарезервировано.
IRQ12 Зарезервировано.
IRQ13 Прерывание от математического сопроцессора.
IRQ14 Прерывание от контроллера жесткого диска.
IRQ15 Зарезервировано.
B IRQ3 Прерывание асинхронного порта COM2.
C IRQ4 Прерывание асинхронного порта COM1.
D IRQ5 Прерывание от контроллера жесткого диска.
E IRQ6 Прерывание контроллера флоппи-диска по завершении операции.
F IRQ7 Прерывание принтера. Генерируется принтером, когда он готов к выполнению очередной операции.

 

 

Микросхема 8259 имеет три однобайтовых регистра, которые управляют 8 линиями аппаратных прерываний (рис. 42). Регистр запроса на прерывание IRR (Interrupt Request Register) устанавливает соответствующий бит, когда линия прерывания сигнализирует о запросе. Затем проверяется, не обрабатывается ли другое прерывание. Для этого контроллер запрашивает информацию от регистра обслуживания ISR (Interrupt Service Register). Регистр использует адреса портов 20h и A0h для первого и второго контроллера 8259 соответственно.

Перед вызовом прерывания проверяется регистр маски прерываний (Interrupt Mask Register, IMR), чтобы узнать, разрешено ли в данный момент прерывание данного уровня. Проверка связана с тем, что некоторые программы нежелательно прерывать, и они могут запретить аппаратные прерывания. Запрещение всех аппаратных прерываний необходимо при выполнении критических участков программного кода, а также при изменении вектора прерывания, чтобы избежать выполнения прерывания, когда вектор изменен только наполовину.

 

 

 


Рис. 42. Схема обработки аппаратного прерывания.

 

 

Регистр IMR определен за адресами 21h или A1h и предназначен только для записи. Если бит в этом порту установлен в 1, то прерывание с соответствующим номером будет запрещено. Для запрета определенных аппаратных прерываний следует установить биты регистра IMR, соответствующие номерам прерываний, выбранным для маскирования.

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

Регистр ISR позволяет получить содержимое регистров ISR и IRR. Код команды чтения регистра ISR равен 0Ah, регистра IRR – 0Bh. После выполнения команд содержимое регистров ISR и IRR доступно из портов 20h и A0h соответственно. Для получения содержимого регистра IMR необходимо выполнить чтение портов с адресами 21h или A1h.