Справочник программиста на персональном компьютере фирмы IBM. Системные ресурсы
Страница 11. Запрет/разрешение отдельных аппаратных прерываний


 

1.2.2 Запрет/разрешение отдельных аппаратных прерываний.

Программы на аасемблере могут запретить аппаратные прерывания,
перечисленные в [1.2.1]. Это маскируемые прерывания; другие аппа-
ратные прерывания, возникающие при некоторых ошибках (таких как
деление на ноль) не могут быть маскированы. Имеются две причины
для запрета аппаратных прерываний. В первом случае все прерывания
блокируются с тем чтобы критическая часть кода была выполнена
целиком, прежде чем машина произведет какое-либо другое действие.
Например, прерывания запрещают при изменении вектора аппаратного
прерывания, избегая выполнения прерывания когда вектор изменен
только наполовину.
Во втором случае маскируются только определенные аппаратные
прерывания. Это делается когда некоторые определенные прерывания
могут взаимодействовать с операциями, критичными к временам.
Например, точно рассчитанная по времени процедура ввода/вывода не
может себе позволить быть прерванной длительным дисковым прерыва-
нием.

Низкий уровень.

Выполнение прерываний зависит от значения флага прерывания
(бит 9) в регистре флагов. Когда этот бит равен 0, то разрешены
все прерывания, которые разрешает маска. Когда он равен 1, то все
аппаратные прерывания запрещены. Чтобы запретить прерывания,
установив этот флаг в 1, используется инструкция CLI. Для очистки
этого флага и восстановления прерываний - инструкция STI. Избе-
гайте отключения прерываний на длительный период. Прерывание
времени суток происходит 18.2 раза в секунду и если к этому пре-
рыванию был более чем один запрос в то время, когда аппаратные
прерывания были запрещены, то лишние запросы будут отброшены и
системное время будет определяться неправильно.
Имейте ввиду, что машина автоматически запрещает аппаратные
прерывания при вызове программных прерываний и автоматически
разрешает их при возврате. Когда Вы пишете свои программные пре-
рывания, то Вы можете начать программу с инструкции STI, если Вы
можете допустить аппаратные прерывания. Отметим также, что если
за инструкцией CLI не следует STI, то это приведет к остановке
машины, так как ввод с клавиатуры будет заморожен.
Для маскирования определенных аппаратных прерываний нужно
просто послать требуемую цепочку битов в порт с адресом 21H,
который соответствует регистру маски прерываний (IMR). Регистр
маски на второй микросхеме 8259 для AT (IRQ8-15) имеет адрес
порта A1H. Установите те биты регистра, которые соответствуют
номерам прерываний, которые Вы хотите маскировать. Этот регистр
можно только записывать. Нижеприведенный пример блокирует диско-
вое прерывание. Не забудьте очистить регистр в конце программы,
иначе обращение к дискам будет запрещено и после завершения прог-
раммы.
;---маскирование 6-го бита регистра маски прерываний
MOV AL,01000000B ;маскируем бит 6
OUT 21H,AL ;посылаем в регистр маски прерываний
.
MOV AL,0 ;
OUT 21H,AL ;очищаем IMR в конце программы

 
« Предыдущая статья   Следующая статья »