Автор работы: Пользователь скрыл имя, 27 Февраля 2013 в 12:53, лекция
Прерыванием называют сигнал, генерируемый источником, таким как устройство ввода/вывода или программа системного программного обеспечения, который вызывает прерывание выполнения текущей программы. Управление передается другой программе таким образом, что выполнение первоначальной программы после обработки прерывания может быть возобновлено.
Однако, сигнал прерывания того же (или более низкого) уровня может придти между командой OUT 20h, AL и командой IRET. Поскольку блокировка нижележащих уровней в контроллере уже снята, возникает вложенное прерывание и повторный вход в ту же программу. Чтобы избежать этого, перед командой EOI выполняют команду запрета всех прерываний CLI. В результате вложенные прерывания запрещаются до выхода из обработчика. Прерывания не останутся запрещенными навсегда, т.к. команда IRET восстанавливает не только адрес возврата в регистры CS и IP, но и содержимое регистра флагов на момент прерывания. Если при этом содержимом регистра флагов возникло прерывание, значит флаг IF был установлен. Получается, что команда IRET в программе обработки аппаратного прерывания всегда восстанавливает установленное состояние флага IF, т.е. разрешает прерывания.
Запросы на прерывания, поступающие в ведущий контроллер (уровни IRQ0…IRQ7) блокируют только ведущий контролер, однако, запросы на прерывания, поступающие в ведомый контроллер (уровни IRQ8..IRQ15) блокируют уровни не только низших приоритетов в ведомом контроллере, но и уровни IRQ2..IRQ7 в ведущем контроллере. Поэтому в обработчиках прерываний уровней 8..15 следует предусматривать посылку команды конца прерываний в оба контроллера:
mov al, 20h
out 20h, al
out A0h, al
Типичными значениями масок для ведущего и ведомого контроллеров являются: B8h и 9Dh соответственно. При отладке взаимодействия с компьютером аппаратуры, работающей в режиме прерываний, приходится анализировать содержимое внутренних регистров контроллера прерываний. Для этого существуют специальные команды контроллера. Если в порт 20h контроллера прерываний послать код 0Ah, то разрешается чтение входного регистра контроллера – регистра запросов IRR. Чтение осуществляется через порт 20h. Читая содержимое IRR, можно определить, на какие входы контроллера поступают сигналы аппаратуры. При этом надо иметь в виду, что регистрация процессором сигнала прерывания приводит к сбросу запроса соответствующего уровня в регистре запросов. Поэтому наблюдение запросов в регистре IRR следует выполнять либо при замаскированных, либо при запрещенных прерываниях.
Код 0Bh, посланный в тот же порт 20h, разрешает чтение регистра обслуживаемых запросов ISR. Чтение осуществляется через порт 20h. Т.о., можно установить, проходит ли сигнал прерывания в процессор (поскольку установка битов регистра ISR выполняется сигналом INTA, поступающим из процессора в контроллер после регистрации им сигнала прерывания).