Глава 1. Системные ресурсы.

Раздел 2. Управление прерываниями.

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

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

Во втором случае маскируются только определенные аппаратные прерывания. Это делается когда некоторые определенные прерывания могут взаимодействовать с операциями, критичными к временам. Hапример, точно рассчитанная по времени процедура ввода/вывода не может себе позволить быть прерванной длительным дисковым прерыванием.

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

Выполнение прерываний зависит от значения флага прерывания (бит 9) в регистре флагов. Kогда этот бит равен 0, то разрешены все прерывания, которые разрешает маска. Kогда он равен 1, то все аппаратные прерывания запрещены. Чтобы запретить прерывания, установив этот флаг в 1, используется инструкция CLI. Для очистки этого флага и восстановления прерываний - инструкция STI. Избегайте отключения прерываний на длительный период. Прерывание времени суток происходит 18.2 раза в секунду и если к этому прерыванию был более чем один запрос в то время, когда аппаратные прерывания были запрещены, то лишние запросы будут отброшены и системное время будет определяться неправильно.

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

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


<~-1.2.1 Программирование контроллера прерываний 8259.
Содержание
1.2.3 Hаписание собственного прерывания.-~>

Сайт управляется системой uCoz