вает приоритет каждому из четырех событий. В таблице 8-1 перечис-
лены четыре прерывания.
Таблица 8-1
Прерывания последовательного адаптера
ДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Приоритет ¦ Идентификатор прерывания
ДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
1 ¦ Состояние приемной линии (RLS)
2 ¦ Доступность данных для приема (RDA)
3 ¦ Регистр хранения передачи свободен (THRE)
4 ¦ Состояние модема (MS)
ДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Символы ASCII
ЪДВДВДВДВДВДВДВД¬ ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
АДБДБДБДБДБДБДБДЩ ¦ Регистр разрешения 1 2 3 4 ¦
¦ прерывания ЪДВДВДВД¬ ¦
¦ АДБДБДБДЩ ¦
¦ ¦ ¦
¦ ¦
¦ Идентификация ЪДВДВДВД¬ ¦
¦ прерывания АДБДБДБДЩ ¦
Последовательный ¦ ЪДДДДДДДДЩ ¦
адаптер АДДДДДДДДДДДДДД¬ ¦
¦ ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ ¦
АДББББББББББББББББДЩ
ЪД¬
Прерывание к 8259A ДЩ АДД
Рис.8-5. Прерывания последовательного адаптера
Событием высшего приоритета является прерывание "состояние
приемной линии" (RLS), которое обрабатывается чтением регистра
состояния линии. Прерывание RLS имеет место, когда происходит од-
но из следующих событий:
- Линия отключается (логический 0) на период времени больше
требуемого для получения символа.
- 8-10 -
- Символ получен до того, как был считан предыдущий (ошибка
выхода за границы).
- Ошибка при проверке на четность.
- При восстановлении символа из полученных битов не обнаружен
стоповый бит (ошибка кадровой синхронизации).
Затем следует прерывание "доступность данных для приема"
(RDA), которое возникает при готовности символа для чтения из
приемного буферного регистра. Оно может быть сброшено путем счи-
тывания символа из регистра.
Следующий приоритет имеет прерывание "регистр хранения пере-
дачи свободен" (THRE). Как следует из имени прерывания, оно имеет
место, когда регистр, хранящий символ, предназначенный для пере-
дачи (имеет тот же адрес порта, что и регистр приемного буфера),
свободен. Прерывание обрабатывается записью в этот регистр или
чтением из регистра идентификации прерывания. Необходим другой
метод сброса этого прерывания, так как иногда даже через прерыва-
ния универсального асинхронного приемопередатчика сообщается, что
буфер передачи пуст и, возможно, отсутствует информация для пере-
дачи.
Самый низкий приоритет имеет прерывание "состояние модема"
(MS). Оно имеет место, когда модем:
- Получает (посылает) сигнал "открыт для передачи" (CTS).
- Показывает свою готовность установкой линии "набор данных
готов" (DSR).
- Получает сигнал, устанавливающий линию "индикатор кольца"
(RI) в логическую 1.
- Определяет сигнал переноса (тот тон, который Вы слышите,
когда вызываете номер и модем отвечает), устанавливая линию
"определение сигнала приемной линии" (RLSD) в 1.
Прерывание состояния модема может быть сброшено чтением регистра
состояния модема.
Эти прерывания могут включаться и выключаться индивидуально
установкой соответствующих битов в регистре разрешения прерыва-
ний. В последовательно-параллельном адаптере фирмы IBM (также как
и в асинхронном адаптере фирмы IBM) бит с именем OUT2 в регистре
управления модемом должен быть установлен в 1 до того, как преры-
вания универсального асинхронного приемопередатчика могут достичь
центральный процессор. Когда имеют место прерывания, последова-
тельный адаптер собирает их согласно приоритету и направляет пре-
рывание высшего приоритета в регистр идентификации прерывания.
Адаптер прекращает отвечать на последующие прерывания равного или
меньшего приоритета до тех пор, пока не определит, что текущее не
обслужено подпрограммой обслуживания прерываний. Программируемый
контроллер прерываний 8259A.
В системах MS-DOS центральный процессор (микропроцессор
80х86) непосредственно не принимает прерывания, поступающие от
аппаратных средств, таких как последовательный адаптер. Прерыва-
ния аппаратуры сначала обслуживаются чипом программируемого конт-
роллера прерываний Intel 8259A. 8259A действует как "приемщик"
центрального процессора. Контроллер 8259A, как программируемое
устройство, принимает до восьми различных прерываний и может мас-
кировать (игнорировать) прерывания индивидуально. 8259A отвечает
на каждое незамаскированное или разрешенное прерывание и направ-
ляет его центральному процессору при условии, что никакое другое
- 8-11 -
прерывание высшего приоритета не обслуживается в настоящее время.
Как контроллер 8259A присваивает приоритеты? Как и универ-
сальный асинхронный приемопередатчик имеет свой метод определения
приоритетов прерываний последовательного адаптера, 8259A обладает
своей схемой присваивания приоритетов прерываниям. Последователь-
ный адаптер является только одним из аппаратных средств, которые
могут направлять прерывания контроллеру 8259A. Каждое устройство
жестко смонтировано или соединено проводниками с различными вход-
ными устройствами, известными как входные устройства запроса пре-
рываний (IRQ) контроллера 8259A. Поэтому, обычно говорят об IRQ,
присвоенном аппаратному прерыванию. Другой характеристикой, свя-
занной с IRQ прерывания, является номер прерывания, используемый
для обращения к отдельному прерыванию. В персональном компьютере
IBM PC этот номер равен восьми плюс IRQ. Когда имеет место преры-
вание, центральный процессор использует его номер в качестве ин-
декса в таблице, известной как таблица векторов прерываний (рас-
положена в начале памяти), которая содержит адрес подпрограммы
обработки данного прерывания. Так как контроллер 8259A связывает
высшие приоритеты с низкими IRQ, аппаратные устройства, требующие
максимального внимания, имеют низкие IRQ. Таким образом, систем-
ный таймер имеет IRQ0, клавиатура имеет IRQ1 и так далее.
Несмотря на то, что MS-DOS 3.3 поддерживает четыре коммуни-
кационных порта, с COM1 по COM4, эта поддержка не означает ничего
кроме обладания четырьмя драйверами с этими именами, каждый из
которых поддерживается безбуферно и только упорядоченным вво-
дом/выводом. Так как мы интересуемся управляемыми прерываниями
последовательным вводом/выводом, детали поддержки системой MS-DOS
коммуникационных портов не относятся к данному вопросу.
В персональном компьютере IBM PC только два первых порта,
COM1 и COM2, имеют определенные номера IRQ и номера прерываний.
Другие последовательные порты, такие как COM3 и COM4 могут быть
использованы для управляемого прерываниями ввода/вывода после ус-
тановки адаптеров и присваивания номеров IRQ посредством соот-
ветствующей установки перемычек. Как только станет известен номер
IRQ, программирование портов COM3 и COM4 выполняется таким же об-
разом, как и портов COM1 и COM2. Более того, до конца этой главы
мы будем рассматривать только порты COM1 и COM2.
Двум последовательным портам COM1 и COM2 присвоены соответс-
твенно IRQ4 и IRQ3, то есть номера прерываний 12 и 11 (десятич-
ные). Между прочим, номера прерываний должны быть известны, так
как функциональные вызовы DOS (посредством программного прерыва-
ния 21h) с функциональными номерами 35h и 25h могут быть исполь-
зованы соответственно для получения и установки векторов прерыва-
ний.
Есть еще несколько моментов, о которых необходимо упомянуть
перед началом разговора о программировании последовательных пор-
тов для управляемого прерываниями ввода/вывода. Микропроцессор
80х86 автоматически делает невозможными все прерывания в то время,
когда он передает управление обслуживающей подпрограмме текущего
прерывания. Несмотря на то, что контроллер 8259A во время обслу-
живания прерывания задерживает последующие прерывания того же или
меньшего приоритета, прерывания старшего приоритета все еще полу-
чают подтверждение о приеме, если установлен флаг прерывания. Ес-
ли мы вновь немедленно не разрешим прерывание до начала обслужи-
вания прерывания от последовательного порта, многие жизненно
важные системные функции, передаваемые прерываниями (такие как
системный таймер, клавиатура и контроллер диска), обслуживаться
- 8-12 -
не будут. Важно, поэтому, используя команду STI (установить флаг
прерывания) переключить прерывание как только обслуживающая под-
программа примет на себя управление. Это предоставит возможность
таймеру, клавиатуре и контроллеру диска прерывать подпрограмму
обслуживания последовательного порта, позволяя функционировать
другим устройствам.
Как мы сможем сообщить контроллеру 8259A о том, что обработка
последовательного прерывания завершена? Наша служебная подпрог-
рамма должна направить 8259A команду "конец прерывания" (EIO) пе-
ред возвращением управления центральному процессору. Несмотря на
то, что существуют способы требования EIO для различных IRQ, для
схемы приоритета, используемой в персональном компьютере, доста-
точно направить контроллеру 8259A то, что известно как "неспеци-
фический" EOI (код 20h). Название "неспецифический" вытекает из
того, что эта команда не определяет, какое прерывание обслужива-
лось. Она просто говорит контроллеру, что обслуживание прерывания
высшего приоритета завершено. Это разрешает обслуживание прерыва-
ний того же или высшего IRQ.
Программирование контроллера 8259A
Управляемый прерываниями ввод/вывод требует правильной уста-
новки контроллера 8259A. В противном случае, прерывания, генери-
руемые последовательным адаптером, никогда не будут приняты мик-