Программно-управляемый ввод-вывод
Выше сказано, что при организации программно-управляемого ВВ все действия по ВВ выполняются командами прикладной программы.
До выполнения собственно передачи данных МП должен выдать в ПУ приказ о подготовке его к операциям ВВ. Приказ может быть одним битом или полным словом. После этого МП должен проверить готовность устройства и произвести ВВ, когда бит готовности установлен в 1. Поэтому программно-управляемый ВВ обычно включает в себя выполнение следующих действий:
1. в ПУ передается приказ об инициировании действий ВВ.
2. МП считывает состояние устройства
3. Проверяет готовность устройства к обмену данными
4. Если устройство не готово к обмену то пункты 2 и 3 повторяются
5. Если устройство готово к обмену, то МП осуществляет собственно ввод или вывод. Обычно это действие сбрасывает бит готовности ПУ.
Регистровая модель считывателя с перфоленты с использованием ВВ с отображением на память. Адрес FF20 соответствует регистру состояния и управления, который подключается к порту двунаправленного ВВ, а адрес АА21 – регистру данных считывателя, который подключается к порту считывателя.
Ассемблерная программа одного байта информации в аккумулятор:
INBYT: MVI A,1 ; инициирование запуска
STA 0FF20h ; считывателя
WAIT: LDA 0FF20h ; считывание состояния
ORA A ; установка флажков
JP WAIT ; зацикливание до готовности
LDA 0FF21h ; ввод байта данных
Команда MVI загружает в А код 1, а команда STA передает его в регистр состояния и управления, после чего считыватель начинает движение перфокарты. Затем в А вводиться код из регистра состояния и управления, команда вводиться код из регистра состояния и управления, команда ORA A устанавливает флажки в соответствии с введенным кодом, а команда JP (переход, если S=0) зацикливает процесс проверки состояния. После восприятия сигнала готовности (S=1) МП вводит в А из регистра данных считанное с перфокарты слово. Длина фрагмента программы составляет 15 байт.
В изолированном ВВ программа несколько изменяется: адреса портов становятся однобайтными (взяты две последние цифры предыдущих адресов), а ввод-вывод производиться специальными командами:
INBYT: MVI A,1 ; инициирование запуска
OUT 20h ; считывателя
WAIT: IN 20h ; считывание состояния
ORA A ; установка флажков
JP WAIT ; зацикливание до готовности
IN 21h ; ввод байта данных
Длина этого фрагмента на 3 байта короче предыдущего.
Аналогичный вид имеет подпрограмма вывода, но в этой подпрограмме нужно учесть, что если выводимое слово сначала находиться в А, его необходимо временно запомнить в стеке, чтобы освободить А для операции проверки готовности. Пусть бит готовности устройства подключен к старшему биту порта READY, а вывод осуществляется в порт DPORT. Тогда подпрограмма вывода имеет вид:
WRITE: PUSH PSW ; освобождение А
WAIT: IN READY ; считывание состояния
ORA A ; установка флажков
JP WAIT ; зацикливание до готовности
POP PSW ; восстановление выводимого слова
OUT DPORT ; вывод байта данных
Выделять параллельный порт ввода для бита готовности одного ПУ нецелесообразно. Поэтому обычно в 8-битный порт ввода READY упаковывают биты готовности до 8 устройств. После ввода в А упакованного слова состояния нескольких ПУ возникает проблема проверки бита определенного устройства. Она решается с помощью операции поразрядной конъюнкции упакованного слова состояния и слова маски MASK, содержащего единицу в бите, соответствующем подключению нового устройства, и нули в остальных битах.
…
IN READY ; ввод упакованного состояния
ANI MASK ; выделение нужного бита
…
Чтобы несколько сократить непроизводительные потери времени на ожидание готовности ПУ к обмену данными, вводят периодическую проверку готовности устройств.
Блок-схема периодического последовательного опроса нескольких устройств, называемого также полингом. Частота опроса выбирается таким образом, чтобы система обеспечивала работу ПУ с их номинальным быстродействием.
Асинхронная система передачи удобна, надежна, поскольку в организации обмена участвуют оба устройства. Если одно из ПУ неисправно или не включено, то обмен данными не состоится, о чем легко уведомить систему.
Ввод вывод по прерываниям
В программно-управляемом вводе выводе ожидание готовности ПУ к обмену данными значительно уменьшает производительность системы. По этой причине в системах с критичными временными соотношениями организуется ВВ по прерываниям. Главная его особенность заключается в том, что действия по ВВ инициируют сами ПУ, генерируя сигнал прерывания или запроса на обслуживание.
Фактически этот сигнал представляет собой состояние бита готовности устройства. При восприятии сигнала прерывания МП приостанавливает выполнение текущей программы, переходит к подпрограмме обслуживания прерывания (обработку прерывания) соответствующего ПУ, обменивается с ним данными и возобновляет выполнение прерванной программы.
Введение прерываний опирается на тот факт, что пропускная способность МП превышает быстродействие многих ПУ. Например скорость печати пишущих машинок составляет 25 символов/с, скорость ленточного перфоратора 160 символов/с, а скорость считывания с перфоленты 1500 символов/с, а пропускная способность МП в режиме прерывания достигает порядка 10000 символов/с и более. Обслуживая ПУ по их запросам, МП может управлять работой нескольких устройств с их номинальным быстродействием.
Эффективность обработки прерываний является одним из основных критериев выбора МП, особенно систем реального времени.
Внешне реакция МП на прерывание очень похожа на вызов подпрограммы. Однако вызов подпрограммы запланирован и полностью предсказуем, а вызов обработчика прерываний осуществляется внешним сигналом, момент возникновения которого предсказать невозможно.
Тем не менее внешняя аналогия реакции на прерывание и вызова подпрограммы позволяет считать прерывание внешним (аппаратным) вызовом подпрограммы. Действия, выполняемые обработчиком прерывания, ограничены только программными возможностями МП.
Аппаратные средства обработки прерываний в самом МП К580 весьма ограничены. На вход прерывания INT подаются сигналы запросов на обслуживание от ПУ. МП реагирует на них, если установлен внутренний триггер разрешения прерываний и на входе INTE действует H-уровень. В устройстве управления имеется также недоступные программисту триггер прерывания, выполняющий функцию синхронизатора. Реагируя на сигнал INT=1 (при условии что INTE=1), МП завершает выполнение текущей команды и вводит в цикл команды рестарта RST, в результате чего содержимое РС загружается в стек как адрес возврата, а в РС загружается адрес первой команды обработчика прерывания соответствующего ПУ.
Обслуживание запросов только одного ПУ вызывает затруднения, т.к. начальный адрес обработчика прерывания можно зафиксировать аппаратно. Ситуация несколько усложняется, когда на линию INT подключается сигналы прерываний от нескольких ПУ. В системе с несколькими ПУ обязательно приходится присваивать им определенные приоритеты и при одновременном возникновении запросов от нескольких ПУ первым обслуживается устройство с наивысшим приоритетом.
Приоритеты ПУ устанавливаются по максимально допустимому времени ожидания или обслуживания: чем меньше время ожидания, тем выше приоритет ПУ.
При организации В ПМС одноуровневых прерываний обслуживание любого устройства не может быть прервано на обслуживание от других устройств, независимо от приоритета.
При организации многоуровневых прерываний запрос от устройства с большим приоритетом может прервать подпрограмму обслуживания устройства с меньшим приоритетом.
Контроллер пишущей машинки
Рассмотрим сначала особенности обработки прерываний от единственного ПУ – пишущей машинки, на которую вводиться текст. Сигнал «Готовность к печати» фиксируется в RS-триггере контроллера пишущей машинки. Выход Q триггера соединен со входом INT МП. В состав контроллера введены также порт вывода с адресом PRINT для приема выводимого символа и порт ввода для формирования команды RST7.
Пусть в некоторый момент времени пишущая машинка генерирует запрос на обслуживание INT=1 и прерывания разрешены INTE=1.
В результате этих действий сигналом INTA# в регистр команд загружается команда рестарта RST7 (согласно подключению порта ввода в контроллере пишущей машинки биты ААА команды рестарта имеют значения 111). Выполнение команды RST7 состоит из загрузки адреса возврата в стек и передачи адреса 0038h в РС, представляющего собой начальный адрес обработки прерывания пишущей машинки. Вводимый текст хранится в некоторой буферной области памяти и признаком его окончания служит код символа *. Две смежные ячейки CHAR хранят адрес текущего символа буферной области. В процессе инициализации в них записывается начальный адрес буфера текста. При выводе очередного символа потребуется основной указатель памяти МП – регистры HL и А. Следовательно, их текущее содержимое необходимо где то сохранить для последующего восстановления после обслуживания прерывания. В качестве временного хранилища содержимого любых внутренних регистров удобно использовать стек. Ассемблерная программ обработчика прерываний пишущей машинки представлен ниже.
org 0038h ; фрагмент программы начинается с
; адреса 0038h
PUSH PSW ; временное запоминание состояния
PUSH H ; процессора
LHLD CHAR ; адрес символа в регистрах (H, L)
MOV A,M ; символ в А
CPI '*' ; проверка окончания текста
JZ ENDT ; вывод закончен?
OUT PRINT ; нет, вывод символа
INX H ; переход к следующему символу
SHLD CHAR ; восстановление состояния
POP H ; восстановление состояния
POP PSW ; процессора
ENDT: EI ; разрешение прерываний
RET ; к прерванной программе
*** ; реакция на окончание текста
Длина программы составляет 21 байт, время выполнения соответствует 122 периодам синхронизации. При частоте синхронизации 1.5 МГц обслуживание запроса пишущей машинки длиться 90 мкс (с учетом цикла команды RST). Специально отметим наличие команды разрешения прерываний EI, т.к. в цикле команды рестарта МП автоматически запрещает прерывания. Возобновление выполнения прерванной программы осуществляется с помощью команды возврата RETURN.