Предыдущий раздел УПРАВЛЕНИЕ УСТРОЙСТВАМИ С ПРЕРЫВАНИЯМИ Следующий раздел

21.3.1. Пример драйвера - логическая схема

В качестве примера опять рассмотрим драйвер ввода с перфоленты. Для связи с ИУ используются порты 90h (RS) и 91h (RD). Структура RS приведена на рис.68. Допустим, что устройству ввода с перфоленты соответствует вектор прерываний с номером 60h. Кроме того, предположим, что контроллер данного устройства соединен с входом IRQ5 ведущего контроллера прерываний.

Логическая схема драйвера представляет собой активный пакет (данный термин поясняется в прил.3), состоящий из двух интерфейсных логических процедур, логического процесса и трех структур данных (рис.74).

Логическая процедура “Инициализация” без параметров. Она выполняет три действия:

1) делает остальные модули драйвера резидентными;

2) заполняет вектор прерываний с номером EEh (для последующего инициирования резидентной процедуры «Ввести символ»);

3) заполняет вектор прерываний с номером 60h (для последующего инициирования обработчика прерываний от перфоленты).

Логическая процедура «Ввести символ» обслуживает запросы прикладных и системных программ по вводу символов с перфоленты. Обработчик прерываний перфоленты – логический процесс без параметров. Рассмотрим совместную работу перечисленных модулей по логической схеме.

 

  

Рис. 74. Логическая схема асинхронного драйвера с прерываниями

 

После своего вызова логическая процедура «Ввести символ» проверяет значение N. Если N = 0 (в буфере ничего нет), то устанавливаются в «1» биты b0 и b3RS. После этого данная логическая процедура выполняет возврат в вызвавший ее модуль, то есть в прикладную программу, с признаком результата R = 1.

Значение b0 = 1 инициирует работу контроллера (вход 1) по вводу очередного символа. Контроллер помещает код символа в RD (сбрасывая при этом бит b0RS) и оказывается в состоянии “вход 2”. Так как бит разрешения прерывания b3 = 1, то контроллер инициируется по данному входу и выдает сигнал прерывания. Обработчик прерываний считывает код символа из RD в буфер и увеличивает значение N на единицу. Если при этом буфер оказывается полным (N = NMAX), то управление сразу возвращается прерванной программе. Иначе сначала установкой b0 = 1 инициируется работа контроллера по вводу следующего символа. 

Если при вызове логической процедуры «Ввести символ» 0<N<NMAX, то из буфера выбирается очередной символ и устанавливается R = 0. Если N=NMAX, то перед выполнением данных действий устанавливается b0=1 (этот бит не был установлен обработчиком прерываний).

В основе алгоритмов логической процедуры «Ввести символ» и обработчика прерываний лежат операции с буфером. Обычно используют буфер в виде несвязанной циклической очереди. Напомним, что подобно стеку, очередь является линейным списком, исключение элементов из которого производится только из начала списка. Но в отличие от стека добавление нового элемента производится не в начало, а в конец списка. Поэтому для работы с очередью используются два указателя, один из которых S указывает на начало очереди, а второй F – на ее конец. В отличие от обычной несвязанной очереди, циклическая несвязанная очередь позволяет лучше использовать пространство памяти. Поясним ее организацию на примере.

Пусть имеется область памяти длиной десять ячеек, предназначенная для размещения буфера (рис.75). Кроме того, есть две ячейки ОП, являющиеся указателями: F указывает на очередную пустую ячейку буфера, в которую можно занести новый элемент (символ), а S указывает на ячейку, содержащую первый из еще не взятых элементов. Цикличность буфера заключается в том, что при достижении максимального граничного адреса (на рис.75 этот адрес равен 9) указатель корректируется так, что вместо 9 он будет содержать 0 (то есть будет указывать на начало области памяти).

 

 

Рис. 75. Циклический буфер и указатели

 

Заметим, что если указатель «взять» движется в сторону больших адресов (на рис.75 вниз) и становится равным указателю «положить», то очевидно, что буфер пуст, и счетчик элементов равен нулю. А если указатель «положить» «догонит» указатель «взять», то буфер полон и счетчик элементов равен максимально возможному числу (10).

 


Предыдущий раздел В начало Следующий раздел