
- •7. Ввод-вывод
- •7.1. Доступ к устройствам ввода-вывода
- •7.2. Прерывания
- •7.2.1. Аппаратное обеспечение для поддержки прерываний
- •7.2.2. Запрет и разрешение прерываний
- •7.2.3. Обслуживание нескольких устройств
- •7.2.4. Управление запросами устройств
- •7.2.5. Исключения
- •7.2.6. Прерывания в операционных системах
- •7.3. Механизм прерываний процессора Pentium
- •7.4. Прямой доступ к памяти
7.2.4. Управление запросами устройств
До сих пор мы предполагали, что интерфейс устройства ввода-вывода генерирует запрос прерывания, когда устройство готово к операции пересылки данных, например, когда флаг SIN на рис. 7.3 устанавливается в значение 1. При этом важно гарантировать, что запросы прерываний будут генерироваться только теми устройствами ввода-вывода, которые используются данной программой. Не задействованные на данный момент устройства не должны генерировать запросов прерываний, даже если они готовы выполнить операции ввода-вывода. Таким образом, в интерфейсных схемах устройств ввода-вывода должен быть заложен механизм, определяющий, когда можно, а когда нельзя генерировать запросы прерываний.
Обычно для этого используется один разряд, разрешающий или запрещающий прерывания, как, например, флаг разрешения прерывания от клавиатуры KEN и флаг разрешения прерывания от дисплея DEN в регистре CONTROL на рис. 7.3. Когда такой флаг установлен, устройство генерирует запрос прерывания, как только устанавливается соответствующий флаг в регистре STATUS. Одновременно интерфейсная схема устанавливает разряд KIRQ или DIRQ, указывая таким образом, что данное устройство запросило прерывание. Если флаг разрешения прерывания равен 0, интерфейсная схема не генерирует запросов прерываний независимо от того, какой флаг состояния активен.
Существует два независимых механизма управления запросами прерывания. Со стороны устройства решение о том, можно ли ему генерировать запросы прерывания, зависит от состояния разряда разрешения на прерывание. Со стороны процессора решение о том, будет ли принят запрос на прерывание, зависит либо от разряда разрешения прерываний в регистре FX, либо от системы приоритетов.
Пример 7.3___________________________________________________________________
Рассмотрим процессор, в котором используется векторная схема прерываний. Начальный адрес подпрограммы обработки прерываний хранится в памяти по адресу INTVEC. Прерывания разрешаются установкой разряда разрешения прерываний IF (9 разряда) в слове состояния процессора. Клавиатура и дисплей, подключенные к этому процессору, имеют регистры состояния и данных, а также управляющий регистр (рис. 7.3).
Предположим, что в некоторой точке главной программы требуется прочитать введенную с клавиатуры строку и сохранить составляющие ее символы в последовательности байтов в памяти компьютера начиная с адреса LINE. Для выполнения данной операции с помощью прерываний нам нужно будет инициализировать процесс прерываний. Вот как это делается.
1. Загружаем начальный адрес программы обработки прерывания по адресу INTVEC.
2. Загружаем адрес LINE в память по адресу PNTR. Программа обработки прерываний будет использовать его в качестве указателя для сохранения вводимых символов в памяти.
3. Разрешаем прерывания от клавиатуры, для чего устанавливаем в 1 второй разряд регистра CONTROL.
4. Разрешаем прерывания в процессоре, для чего устанавливаем в 1 разряд IF в регистре состояния процессора FLAGS.
После такой инициализации в ответ на ввод символа с клавиатуры интерфейсная схема клавиатуры будет генерировать запрос прерывания. Выполняемая в данный момент программа будет прервана и управление будет передано программе обработки прерываний, которая должна выполнить целый ряд действий.
1. Прочитать из регистра входных данных клавиатуры введенный символ. В ответ интерфейсная схема удалит свой запрос прерывания.
2. Сохранить символ в памяти компьютера по адресу, указанному в PNTR, и увеличить значение PNTR.
3. По достижении конца строки запретить прерывания от клавиатуры и проинформировать об этом программу Main.
4. Выполнить команду возврата из процедуры обработки прерывания.