основан на Intel 8259 UART (универсальный асинхронный приемопере-
датчик), имеет порт RS-232C для подключения к модему и, как адап-
тер дисплея, программируется посредством набора регистров. Мик-
ропроцессор имеет доступ к регистрам через ранее определенные
адреса порта ввода/вывода.
Универсальный асинхронный приемопередатчик Intel 8250 управ-
ляется посредством записи в набор восьмибитовых регистров и чте-
ния из них. Эти регистры доступны программисту через адреса пор-
та. Адреса портов задаются последовательно, поэтому достаточно
знать адрес первого порта. Он также известен как базовый адрес
последовательного адаптера. В персональном компьютере IBM PC двум
последовательным портам COM1 и COM2 присвоены базовые адреса пор-
та 3F8h и 2F8h соответственно. Так, для последовательного адапте-
ра COM1 первый регистр имеет адрес 3F8h, следующий 3F9h и так да-
лее.
В 8250 имеется семь физических регистров и они описываются в
порядке возрастания начального номера, начиная с базового адреса.
Как показано на рисунке 8-4, базовый адрес порта имеет один ре-
гистр, который делится на два, как приемный буферный регистр и
регистр хранения передачи (THR), который используется для хране-
ния одного передаваемого или принимаемого символа. Затем следует
регистр разрешения прерываний, который используется для разреше-
ния или блокировки генерации прерываний последовательным адапте-
ром. Третий регистр, называемый регистром идентификации прерыва-
ний, содержит сообщение универсального асинхронного
приемопередатчика об идентичности прерывания. Затем следует ре-
гистр управления линией, используемый для установления различных
связных параметров, таких как длина слова, количество стоповых
битов, четность и скорость передачи в бодах. Пятый регистр - это
регистр управления модемом, который используется для передачи мо-
дему сигналов, таких как DTR (терминал готов) и RTS (запрос на
передачу). Наконец, два последних регистра, регистр состояния ли-
нии и регистр состояния модема, показывают соответственно состоя-
ние линии и модема.
Первые два регистра применяются также для установки скорости
передачи в бодах. Скорость передачи в бодах определяется как
16-битовый делитель тактовой частоты, используемой для последова-
тельного адаптера (1.8432 МГц в большинстве систем MS -DOS). Зна-
чение делителя вычисляется по формуле
1,843,200
делитель= ------------------------------
16 Х скорость передачи в бодах
Чтобы установить скорость передачи в бодах, Вы должны проде-
лать следующее:
1. Установить в 1 наиболее значимый бит регистра управления
линией (он называется битом защелки доступа делителя или
DLAB).
2. Загрузить младший и старший байты делителя соответственно в
приемный буфер и регистр разрешения прерываний.
3. Установить DLAB в 0 для обеспечения нормальной работы уни-
версального асинхронного приемопередатчика.
- 8-7 -
A Приемный буфер/регистр хранения передачи
B ЪДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДД¬
(COM1-3F8¦ 1.¦ ¦ ¦ ¦ ¦ ¦ ¦ 2.¦
COM2-2F8)АДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДЩ
Регистр разрешения прерывания
B+1 ЪДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДД¬
¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 3.¦ 4.¦ 5.¦ 6.¦
АДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДЩ
Установить бит в 1 для разрешения
Регистр идентификации прерывания
B+2 ЪДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДД¬
¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ ¦ ¦ 7.¦
АДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДЩ
АДД3-битовый идентификатор прерывания
110 = состояние линии
100 = приемные данные
010 = буфер передачи свободен
000 = состояние модема
Регистр управления линией
B+3 ЪДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДД¬
¦ 8.¦ ¦ 9. ¦10.¦ 11. ¦
АДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДЩ
АДBREAK: 1 устанавливает линию в SPACE
Регистр управления модемом
B+4 ЪДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДД¬ a. - OUT2
¦ 0 ¦ 0 ¦ 0 ¦12.¦ a.¦ b.¦ c.¦ d.¦ b. - OUT1
АДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДЩ c. - RTS
АДД 13. d. - DTR
Регистр состояния линии
B+5 ЪДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДД¬
¦ 0 ¦14.¦15.¦16.¦17.¦18.¦19.¦20.¦
АДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДЩ
Регистр состояния модема a. - RLSD
B+6 ЪДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДД¬ b. - Delta RLST
¦ a.¦ RI¦DSR¦CTS¦ b.¦ c.¦ d.¦ e.¦ c. - Delta RI
АДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДЩ d. - Delta DSR
Рис.8-4. Регистры в 8250 UART. e. - Delta CTS
A - адрес порта или регистр
B - базовый адрес; 1. - бит 7 данных; 2. - бит 0 данных;
3. - состояние модема; 4. - состояние линии приема;
5. - регистр хранения передачи свободен; 6. - прием данных
разрешен; 7. - 0 означает, что прерывание ждет;
8. - бит доступа к защелке; 9. - четность: 000=нет,
001=нечетность, 011=четность; 10. - число стоповых битов;
11. - длина слова: 10-7, 11-8; 12. - проверка обратного цикла;
13. - должен быть 1 для прерывания ввода/вывода персонального
компьютера; 14. - передача свободна; 15. - регистр хранения пере-
дачи свободен; 16. - обнаружен BREAK; 17. - ошибка кадровой
синхронизации; 18. - ошибка четности; 19. - ошибка выхода за
границы; 20. - данные для приема готовы;
Применяя этот подход Вы можете установить любое значение ско-
рости передачи в бодах. Обратите внимание, что максимально воз-
- 8-8 -
можной скоростью передачи является 1/16 тактовой частоты, или
115,200 бод (для этой скорости передачи делитель равен 1). Этот
предел вытекает из того, что делитель не может быть меньше едини-
цы. Для установки скорости передачи в бодах Вы можете также ис-
пользовать прерывание BIOS 14h. Мы рассмотрим применение BIOS да-
лее в этой главе.
Управляемый прерываниями последовательный ввод/вывод
Существует два общих метода ввода/вывода в любой вычислитель-
ной системе: упорядоченный и управляемый прерываниями. Упорядо-
ченность относится к повторяющейся проверке состояния регистра
устройства ввода/вывода для инициализации требуемой транзакции. В
упорядоченном вводе/выводе программа, запрашивающая символ ввода,
многократно считывает состояние регистра в устройстве ввода/выво-
да до тех пор, пока оно не покажет, что символ доступен для ввода
(или до тех пор, пока программа не решит, что "время закончи-
лось"). Когда состояние указывает, что имеется готовый для работы
символ, программа считывает его из соответствующего регистра уст-
ройства ввода/вывода. Сходная последовательность "ждать, до тех
пор пока не готов, затем писать" используется при выведении сим-
волов на устройство ввода/ вывода. Таким образом, дальнейшее вы-
полнение программы приостанавливается до завершения выполнения
операции ввода/вывода.
Большой проблемой для упорядоченного ввода/вывода через ком-
муникационный порт является то, что при скорости передачи выше
300 бод программе трудно что-либо сделать с получаемым символом
кроме как отображать его на экране. Рассмотрим следующий пример.
Предположим, что мы читаем символы со скоростью 300 бод и имеем
следующие связные параметры: длина слова 7 бит, проверка на чет-
ность и один стоповый бит, который вместе со стартовым битом, до-
бавляет до 10 бит на символ. Вы ожидаете получать около 30 симво-
лов каждую секунду. После чтения символа программа имеет около
1/30 секунды для выполнения других операций. Если Вы не желаете
потерять какие-либо символы,то в это время Вы должны снова начать
упорядочение порта. Что произойдет, когда скорость возрастет до
9600 бод? Временной интервал между символами слишком мал для вы-
ведения символа на экран дисплея, не позволяет интерпретировать
специальные символы и эмулировать терминал.
В подходе, основанном на управлении прерываниями, программа
предоставляет возможность прерываниям устройства ввода/вывода
поступать непосредственно на центральный процессор, который про-
должает выполнять свою работу, не связываясь с устройством. Когда
устройство готово к вводу/выводу, оно сигнализирует об этом цент-
ральному процессору посредством аппаратуры. Получив этот сигнал,
центральный процессор сохраняет свое текущее состояние и вызывает
подпрограмму обслуживания прерываний, адрес которой хранится в
таблице векторов прерываний. Эта подпрограмма выполняет операцию
ввода/вывода, затем восстанавливает состояние машины и возвраща-
ется в прерванную программу. Учитывайте регистр символов, посту-
пающих в коммуникационный порт персонального компьютера. Органи-
зовав где-нибудь некоторые ячейки памяти (буфер), Вы можете
использовать простую подпрограмму обработки прерываний, которая
быстро считывает символ из коммуникационного порта и сохраняет
его в следующей доступной ячейке памяти в буфере. Символы не бу-
дут утеряны в процессе считывания и сохранения символа драйвером
прерываний перед поступлением следующего символа. Эта несложная
- 8-9 -
задача достаточно проста для выполнения в короткие временные ин-
тервалы между поступающими символами при скорости передачи
9600 бод. Прелесть этого метода заключается в том, что время об-
работки главной программой символов, хранящихся в буфере, не име-
ет значения. Конечно, существует риск переполнения буфера, но эта
проблема может быть решена простым увеличением его размера. Если
этот способ не очень хорош, то для избежания переполнения буфера
можно использовать управление потоком с помощью XON/XOFF.
Из наших рассуждений должно стать очевидным, что управляемая
прерываниями буферная связь с использованием управления потоком с
помощью XON/XOFF, предпочтительнее упорядоченной связи.
Прерывания последовательного адаптера
Последовательный адаптер персонального компьютера может быть
запрограммирован для прерывания работы центрального процессора
всякий раз как только происходит одно из четырех событий (смотри
рисунок 8-5). Универсальный асинхронный приемопередатчик присваи-