Программно-управляемый ввод-вывод

Программно управляемый ввод-вывод (полинг) - наиболее простой способ. Ввод-вывод происходит под полным контролем ЦП и реализуется специальной процедурой ввода-вывода. В этой процедуре с помощью команды сообщает модулю ВВ, а через него и внешнему устройству о предстоящей операции. Адрес модуля и ВУ, к которому производится обращение, указывается в адресной части команды ввода-вывода. Модуль исполняет затребованное действие, после чего устанавливает в 1 соответствующий бит в своем регистре состояния. Никаких действий, чтобы уведомить ЦП, модуль не принимает. Следовательно, для определения момента завершения операции или пересылки очередного элемента блока данных процессор должен периодически опрашивать и анализировать содержимое регистра состояния модуля ВВ.

Такой способ еще известен как обращение к порту.

Порт можно определить как точку, через которую осуществляется взаимодействие с каким-либо блоком в системе ввода-вывода, многоразрядный вход или выход устройства. Взаимодействие может осуществляться как программным путем, так и аппаратным (порт – разъем устройства).

Рисунок. Примеры аппаратной реализации портов ввода-вывода

В случае программного взаимодействия совокупность портов нумеруется и представляет собой адресное пространство (т.е. к каждому порту доступ осуществляется по его адресу). Различают порты ввода, вывода и двунаправленные (ввода-вывода). Управление блоками СВВ через порты осуществляется путем записи в них или чтения из них данных. При обращении к порту на линии системного интерфейса выставляется его адрес, который распознается специальным блоком – адресным декодером (или селектором адресов, что то же самое), – расположенным в устройстве, к которому приписан данный порт. Адресный декодер затем инициирует процесс обмена данными (запись или чтение, в зависимости от управляющих сигналов), см. первый пример на рисунке 2. Надо сказать, что кроме наличия «нужного» адреса на линиях системного интерфейса для начала процесса обмена с устройством необходимы еще определенные значения управляющих сигналов («чтение», «запись», «Chip-Select» и т.п.). Одному и тому же устройству может соответствовать несколько портов, идущих друг за другом (диапазон адресов) или иначе (вразброс по адресному пространству портов), через которые осуществляется доступ к разным механизмам устройства или к различным частям одного механизма (например, один порт представляет собой регистр адреса внутренней памяти устройства, а через другой пересылаются данные).

На рисунке изображены два примера взаимодействия с устройством через порты. Первый пример иллюстрирует механизм распознавания номеров (адресов) портов, к которым происходит обращение через системный интерфейс.. Второй пример показывает, как через один и тот же порт может осуществляться доступ к разным ячейкам внутренней памяти устройства. В примере по каждому факту записи через порт адрес ячейки внутренней памяти, в которую будет производиться следующая запись, увеличивается на единицу. Факт записи устанавливается следующим образом: селектором адреса выделяется адрес порта устройства в виде активного сигнала на выходе (т.е. на выходе блока СА), этот сигнал объединяется по «И» с сигналом записи системного интерфейса. На рисунке довольно абстрактно изображена работа с блоком памяти (изображены не все сигналы, не конкретизированы их источники, показано, что из памяти осуществляется чтение из остальной части устройства и т.д.), т.к. это не принципиально для примера, его цель – показать, как можно организовать доступ к разным ресурсам устройства через один и тот же порт. Вместо памяти можно с таким же успехом поставить несколько блоков, которые будут поочередно выбираться тем же счетчиком (СЧ на рисунке), а вместо доступа по записи можно организовать доступ по чтению или двусторонний обмен (чтение и запись).

Необходимо отметить, что формат данных, передаваемых через порт, не ограничивается форматом данных, пересылаемых через системный интерфейс. Под форматом данных подразумевается как их разрядность, так и положение значащих разрядов. Пусть, например, шина данных системного интерфейса имеет разрядность 8 бит, а в порт записываются четырехбитные данные, причем эти четыре бита могут быть выделены маской 00111100b (единицы соответствуют выделяемой тетраде). В этом случае необходимо считать данными при обмене через порт только эти разряды. Или пусть у нас 14-разрядный порт, а шина данных - 8-разрядная: данные будут считаться записанными в порт только тогда, когда по одному и тому же адресу будут записаны сначала младшие 8 разрядов (одна операция с 8-битной шиной данных), а затем – старшие 6 (в виде записи байта, из которого только 6 бит принимаются за данные).