Обработка прерываний асинхронного адаптера
Последовательный асинхронный адаптер можно запрограммировать таким образом, что он будет вызывать соответствующее аппаратное прерывание. Прерывания могут вырабатываться асинхронным адаптером в следующих случаях:
Изменилось состояние линии приемника: произошло переполнение приемника, произошла ошибка четности или синхронизации, линия перешла в состояние BREAK
Данные приняты и доступны для чтения через регистр данных. Обработчик прерывания должен прочитать их и сохранить в буфере для дальнейшей обработки
Регистр передатчика пуст. Обработчик прерывания может записать в COM-порт следующий байт
Изменилось состояние модема: изменилось состояние линий CTS, RI, DCD, DSR. Состояние этих линий позволяет программе определить, установлена ли связь с удаленным модемом, есть ли звонок на телефонной линии и т. д.
Вы можете отдельно запрещать или разрешать эти прерывания. Для этого необходимо установить соответствующие биты в регистре управления прерываниями.
Как мы указывали ранее, каждому COM-порту соответствует, кроме базового адреса его регистров, линия IRQ (см. главы "Последовательный асинхронный адаптер" и "COM-порт и номера IRQ"):
COM-порт | Линия IRQ | Прерывание
| |||
COM1 | IRQ4 | INT 0Ch | |||
COM2 | IRQ3 | INT 0Bh | |||
COM3 | IRQ4 | INT 0Ch | |||
COM4 | IRQ3 | INT 0Bh |
Заметим, что в данной таблице представлен только один возможный вариант соответствия номеру COM-порта линии IRQ. Некоторые платы асинхронных адаптеров и некоторые внутренние модемы имеют перемычки для выбора номера COM-порта (адреса базового регистра) и номера линии IRQ.
Что представляет из себя обработчик прерываний асинхронного адаптера? На рисунке 6.1 мы привели блок схему такого обработчика прерываний.
Рис. 6.1. Блок схема обработчика прерываний
Теперь опишем алгоритм обработки прерываний от асинхронного последовательного адаптера. Этот алгоритм реализован в программе CHATINT, представленной ниже.