PersCom — Компьютерная Энциклопедия Компьютерная Энциклопедия

Купить готовые проекты домов в стиле фахверк Индивидуальный дом. Антикварные латунные самовары.

Ввод-вывод

Ввод-вывод

Периферийные устройства

Термином “периферийное устройство” (ПУ) будем называть устройства самой разнообразной природы, которые являются внешними по отношению к вычислительному ядру (процессор + память) и которые по скорости своей работы не согласованы с процессором. Таким естественным образом согласована по скорости работы с процессором основная память. Для лучшего согласования используются дополнительные структурные элементы, такие, как КЭШ-память, дополнительные локальные шины для доступа к памяти и др. (см. более подробно в предыдущих разделах). Как правило, периферийные устройства "работают" медленнее процессора, т.е. передают или принимают данные медленнее, чем это в состоянии делать процессор, обмениваясь по магистрали (например, с памятью). Но, с точки зрения передачи информации по магистрали в рамках упрощенной схемы ЦВМ, периферийное устройство, подключенное к магистрали ОЗУ, мало отличается от памяти.

Приведем два примера простых периферийных устройств персонального компьютера.

1. Таймер. Его основная функция — обеспечить программе возможность, читая содержимое таймера, получать информацию о истекшем времени, подобно тому, как человек получает ее, поглядывая на часы. Таймер в том или ином виде реализован практически в любой вычислительной системе.
Основной элемент таймера — счетчик, на счетный вход которого постоянно поступает последовательность импульсов от генератора стабильной частоты. Вследствие этого, содержимое счетчика таймера постоянно изменяется во времени. Программа может прочитать содержимое счетчика таймера (скопировать это значение в переменную).
Таймер персонального IBM PC-совместимого компьютера содержит три почти одинаковых канала. Счетчик каждого канала имеет 16 двоичных разрядов. Таким образом, программа может считать из канала таймера значение.

2. Последовательный (коммуникационный) интерфейс (иначе называемый COM-портом). Это периферийное устройство на самом деле включает два отдельных независимых узла: передатчик и приемник. Байт, записанный программой в регистр данных передатчика, немедленно после записи начинает бит за битом передаваться через последовательный интерфейс.

Описание сигналов шины

OSC: Генератор. Высокочастотные импульсы с периодом 70 нс(14.31818 МГц).

CLOCK: Системная частота (от процессора).

RESET DRV: Этот сигнал используется для сброса или инициализации системной логики при включении питания или при низком уровне напряжения на линии. Он синхронизирован с задним фронтом CLOCK и имеет активный высокий уровень (от процессора ).

SA0-SA19: Биты адреса с 0 по 19. Эти линии используются для адресации памяти и устройств ввода/вывода в системе. 20 адресных линий позволяют адресовать до 1 Мбайта памяти. SA0 — это младший значащий разряд, а SA19 — старший значащий разряд. Сигналы генерируются либо процессором или устройством ПДП. Они имеют активный высокий уровень. (от процессора ).

SD0-SD15: Биты данных с 0 по 15. Эти сигналы служат для передачи данных между процессором, памятью и внешними устройствами. D0 — это младший разряд, а D15- старший. Они имеют активный высокий уровень (двунаправлен).

BALE:Разрешение селекции адреса. Этот сигнал вырабатывается контроллером шины 82288 и используется на системной плате для защелкивания верного значения адреса от процессора. Он доступен на канале ввода/вывода как индикатор того, что значение адреса на магистрали верное (если используется вместе с AEN). Адрес защелкивается по заднему фронту сигнала (двунаправлен).

I/O CH CK: Проверка канала. Этот сигнал обеспечивает процессор информацией об ошибках четности памяти или внешних устройств в канале. Когда этот сигнал переходит в низкое состояние, регистрируется ошибка четности (в процессор).

I/O CHRDY: Готовность канала. Этот сигнал, обычно высокий, — переводится в низкое состояние памятью или внешним устройством для продления цикла обращения. Он дает возможность с минимальными затратами присоединять к системе устройства с низким быстродействием. Любое медленное устройство, используя этот сигнал, должно держать его в низком состоянии до тех пор, пока оно не проведет операцию распознавания адреса и не выполнит команду чтения или записи. Однако этот сигнал не должен оставаться в низком состоянии дольше 10 циклов синхронизации системы. Цикл обращения к памяти или внешнему уст-ройству увеличивается на целое число циклов синхронизации (в процессор).

IRQ3- IRQ15: Запрос на прерывание 3-15. Эти сигналы используются для передачи сообщения процессору о том, что устройство требует обслуживания. Они имеют разный приоритет. IRQ3 — с наивысшим приоритетом, а IRQ15 — с низшим. Запрос на прерывание вырабатывается при переходе сигнала из низкого состояния в высокое и удержании его до распознавания процессором (в процессор ).

IOR: Команда чтения из устройства. Данный сигнал указывает внешнему устройству на необходимость выставить свои данные на шину данных. Он может вырабатываться процессором или устройством ПДП. Активный уровень сигнала — низкий (от процессора ).

IOW: Команда записи в устройство. Этот сигнал сообщает устройству о необходимости ввода данных с магистрали. Он может вырабатываться как процессором, так и внешним устройством. Активный уровень сигнала — низкий (от процессора ).

SMEMR: Команда чтения памяти из пространства 1 Мбайт. Этот сигнал указывает памяти, что она должна выставить свои данные на шину. Он может вырабатываться как процессором, так и устройством ПДП. Активный уровень сигнала — низкий (от процессора ).

SMEMW: Команда записи в память из пространства 1 Мбайт. Данный сигнал указывает памяти на необходимость прочитать данные, выставленные на шину данных. Он может вырабатываться как процессором, так и устройством ПДП . Активный уровень сигнала -низкий (от процессора ).

MEMR : Команда чтения памяти: Этот сигнал указывает памяти, что она должна выставить свои данные на шину. Он может вырабатываться как процессором, так и устройством ПДП. Активный уровень сигнала — низкий (от процессора ).

MEMW: Команда записи в память. Данный сигнал указывает памяти на необходимость прочитать данные, выставленные на шину данных. Он может вырабатываться как процессором, так и устройством ПДП. Активный уровень сигнала — низкий (от процессора ).

DRQ0-DRQ3 DRQ5-DRQ7: Запрос ПДП 0-7. Данные сигналы являются асинхронными запросами канала периферийными устройствами для выполнения операций ПДП. Они имеют различный приоритет. DRQ7 — низший, а DRQ0 — высший. Запрос генерируется переводом соответствующего сигнала в активное (высокое) состояние. Сигнал должен удерживаться в высоком состоянии до тех пор, пока не станет активной соответствующая линия DACK (в процессор).

DACK0 — DACK7: Подтверждение ПДП 0-7. Эти сигналы используются для ответа на соответствующие запросы ПДП (0-7). Они имеют низкий активный уровень (от процессора).

AEN: Разрешение адреса. Данный сигнал используется для отключения процессора и других устройств от канала для проведения цикла ПДП. Когда этот сигнал активен (высокий), контроллер ПДП получает шину адреса, шину данных, а также линии чтения и записи (от процессора).

T/C: Счетчик завершения. На этой линии появляется импульс, когда достигнуто состояние счетчика завершения какого-либо устройства ПДП (от процессора).

REFRESH: Запрос на регенерацию динамической памяти (от процессора).

LA17-LA23: Незащелкиваемые адресные линии А17-А23 (двунаправлен).

SBHE: Показывает что старший байт данных находится на старшей шине данных SD8-SD15 (двунаправлен).

0WS: Сигнал показывает процессору что текущий цикл шины может быть выполнен без дополнительных тактов ожидания (в процессор).

MASTER: Сигнал перехвата управления внешним устройством системной магистрали (в процессор).

MEM CS16: Сигнал, подтверждающий то, что процессор может работать с этой памятью 16-разрядными словами без побайтовой распаковки (в процессор).

IO CS16: Аналогично, только с устройствами ввода/вывода (в процессор).

Помимо описанных сигналов, в канале ввода/вывода имеется ряд линий питания для устройств, подключенных к каналу.

Примеры внешних процессов, с которыми хочется синхронизировать программу

Существует много ситуаций, когда требуется синхронизация выполнения программы с внешним событием. Такие ситуации возникают, прежде всего, при обмене данными с периферийными устройствами, в частности, с устройствами ввода-вывода.

!Примеры:

• Прежде, чем прочитать принятый байт из регистра данных COM- порта, программа должна убедиться, что процесс приема байта завершился.
 
• При выводе данных на принтер программа печати должна проверить, что предыдущая порция данных напечатана (печать происходит довольно долго) и принтер способен принять новую порцию.
 
• При считывании данных с диска сектор аппаратно (гораздо медленнее, чем способен оттуда читать процессор) читается в буфер контроллера, программа должна "узнать", что буфер заполнен, прежде чем читать оттуда.

В многозадачной операционной среде одна из выполняемых программ может ожидать данных, подготавливаемых другой программой. В этом случае требуется синхронизация продолжения первой программы с завершением второй. Хотя обе программы работают на одном процессоре под одной ОС, они могут ничего не "знать" друг о друге. В этом случае событие, состоящее в завершении программы, ничем не отличается для программы1 от внешнего события.

Возможны другие (обратные) ситуации, когда наоборот, при наступлении события нельзя продолжать выполнение текущей программы.

!Примеры:
 
• Произошло деление на нуль, и следующую операцию, которая должна использовать результат деления, выполнить невозможно.
 
•Пользователь нажал Ctrl-Break, и выполнять программу дальше не следует.
 

Общим в приведенных примерах является то, что в определенные моменты программа должна прореагировать на некоторое событие, причем, во всех приведенных примерах реакция есть передача управления по условию наступления внешнего события.

Рассмотрим далее, каким образом программа может "узнать" о наступлении события.

Прерывание

Один из возможных подходов к обслуживанию устройств — создание системной очереди на обслуживание. Этот подход предполагает некую очередь, в которую «выстраиваются» запросы на обслуживание от устройств. Микропроцессор периодически просматривает эту очередь и выполняет обслуживание запросов в ней. Этот вариант, хотя и лучше предыдущего, но тоже не оптимальный. В современных микропроцессорах, каковыми являются микропроцессоры фирмы Intel, принят подход, основанный на понятии  прерывания. Прерывание — инициируемый определенным образом процесс, временно переключающий микропроцессор на выполнение другой программы с последующим возобновлением выполнения прерванной программы. Что дает использование механизма прерываний? Он позволяет обеспечить наиболее эффективное управление не только внешними устройствами, но, как мы увидим далее, и программами. Нажимая клавишу на клавиатуре, вы фактически инициируете посредством прерывания немедленный вызов программы, которая распознает нажатую клавишу, заносит ее код в буфер клавиатуры, откуда он в дальнейшем считывается некоторой другой программой или операционной системой. На время такой обработки микропроцессор прекращает выполнение некоторой программы и переключается на так называемую процедуру обработки прерывания. После того как данная процедура выполнит необходимые действия, прерванная программа продолжит выполнение с точки, где было приостановлено ее выполнение. Некоторые операционные системы используют механизм прерываний не только для обслуживания внешних устройств, но и для предоставления своих «услуг». Так, хорошо известная и до сих пор достаточно широко используемая операционная система MS-DOS взаимодействует с системными и прикладными программами преимущественно через систему прерываний.

Исходя из вышеприведенных рассуждений, можно сказать, что прерывания могут быть внешними и внутренними.
Внешние прерывания вызываются внешними по отношению к микропроцессору событиями. На рис. ниже схематически изображена подсистема прерываний компьютера на базе микропроцессора Intel.

 

На рисунке видно, что у микропроцессора есть два физических контакта —  INTR и NMI. На них и формируются внешние по отношению к микропроцессору сигналы, возрастающие фронты которых извещают микропроцессор о том, что некоторое внешнее устройство просит уделить ему внимание. Вход INTR (INTerrupt Request) предназначен для фиксации запросов от различных периферийных устройств, например таких, как системные часы, клавиатура, жесткий диск и т. д. Вход NMI (NonMaskable Interrupt) — немаскируемое прерывание. Этот вход используют для того, чтобы сообщить микропроцессору о некотором событии, требующем безотлагательной обработки, или катастрофической ошибке. Внешние прерывания относятся, естественно, к непланируемым прерываниям. Внутренние прерывания возникают внутри микропроцессора во время вычислительного процесса. К их возбуждению приводит одна из двух причин:

  • ненормальное внутреннее состояние микропроцессора, возникшее при обработке некоторой команды программы. Такие события принято называть исключительными ситуациями, или просто исключениями. Этот вид прерываний отчасти также можно отнести к непланируемым;
  • обработка машинной команды int xx. Этот тип прерываний называется программным. Это — планируемые прерывания, так как с их помощью программист обращается в нужное для него время за обслуживанием своих запросов либо к операционной системе, либо к BIOS, либо к собственным программам обработки прерываний.

Далее мы рассмотрим особенности обработки прерываний. Как уже отмечалось, микропроцессоры Intel имеют два режима работы — реальный и защищенный. В этих режимах обработка прерываний осуществляется принципиально разными методами. Поэтому на данном уроке мы дадим характеристику реального режима и рассмотрим обработку прерываний в этом режиме. На следующем уроке будет рассмотрен защищенный режим работы микропроцессора, и на последнем уроке мы рассмотрим обработку прерываний в этом режиме. Для глубокого понимания процессов, происходящих в компьютере при осуществлении прерывания, необходимо узнать о том, какие ресурсы компьютера при этом задействуются, каковы их характеристики и принципы функционирования.
В общем случае система прерываний — это совокупность программных и аппаратных средств, реализующих механизм прерываний.
К аппаратным средствам системы прерываний относятся:

  • выводы микропроцессора:
    • INTR - вывод для входного сигнала внешнего прерывания. На этот вход поступает выходной сигнал от микросхемы контроллера прерываний 8259А;
    • INTA - вывод микропроцессора для выходного сигнала подтверждения получения сигнала прерывания микропроцессором. Этот выходной сигнал поступает на одноименный вход INTA микросхемы контроллера прерываний 8259А;
    • NMI - вывод микропроцессора для входного сигнала немаскируемого прерывания;
  • микросхема программируемого контроллера прерываний 8259А. Она предназначена для фиксирования сигналов прерываний от восьми различных внешних устройств. В силу ее важной роли при работе всей вычислительной системы мы ее подробно рассмотрим ниже;
  • внешние устройства: таймер, клавиатура, магнитные диски и т. д.

К программным средствам системы прерываний реального режима относятся:

  • таблица векторов прерываний. В этой таблице в определенном формате, который зависит от режима работы микропроцессора, содержатся указатели на процедуры обработки соответствующих прерываний;
  • следующие флаги в регистре флагов flags\eflags:
    • IF (Interrupt Flag) — флаг прерывания. Предназначен для так называемого маскирования (запрещения) аппаратных прерываний, то есть прерываний по входу INTR. На обработку прерываний остальных типов флаг IF влияния не оказывает. Если IF = 1, микропроцессор обрабатывает внешние прерывания, если IF = 0, микропроцессор игнорирует сигналы на входе INTR;
    • TF (Trace Flag) — флаг трассировки. Единичное состояние флага TF переводит микропроцессор в режим покомандной работы. В режиме покомандной работы после выполнения каждой машинной команды в микропроцессоре генерируется внутреннее прерывание с номером 1, и далее следуют действия в соответствии с алгоритмом обработки данного прерывания;
  • машинные команды микропроцессора: int, into, iret, cli, sti.


Программирование контроллера прерываний i8259А

Большая популярность применения этой микросхемы в качестве диспетчера аппаратных прерываний в компьютерах на базе микропроцессоров Intel объясняется наличием большого количества различных режимов ее работы, что позволяет сделать подсистему прерываний достаточно гибкой и эффективной. Действительно, если посмотреть на развитие аппаратной части компьютеров, начиная, например, с i8088/8086, то видно, что менялись самые разные компоненты, но подсистема прерываний, основанная на микросхеме i8259А, так и осталась неизменной.
В процессе загрузки компьютера и в дальнейшем во время работы контроллер прерываний настраивается на работу в одном из четырех режимов:

  1. FNM (Fully Nested Mode) — режим вложенных прерываний. В этом режиме каждому входу (уровню) irq0...irq7 присваивается фиксированное значение приоритета, причем уровень irq0 имеет наивысший приоритет, а irq7 — наименьший. Приоритетность прерываний определяет их право на прерывание обработки менее приоритетного прерывания более приоритетным (при условии, конечно, что IF = 1).
  2. ARM (Automatic Rotation Mode) — режим циклической обработки прерываний. В этом режиме значения приоритетов уровней прерываний также линейно упорядочены, но уже не фиксированным образом, а изменяются после обработки очередного прерывания по следующему принципу: значению приоритета последнего обслуженного прерывания присваивается наименьшее значение. Следующий по порядку уровень прерывания получает наивысшее значение, и поэтому при одновременном приходе запросов на прерывания от нескольких источников преимущество будет иметь этот уровень. Это дает возможность обеспечить «равноправие» при обработке прерываний.
  3. SRM (Specific Rotation Mode) — режим адресуемых приоритетов. Этот режим можно рассматривать как вариант режима ARM. В режиме SRM программист или система самостоятельно могут назначить уровень прерывания с наивысшим приоритетом.
  4. PM (Polling Mode) — режим опроса. Этот режим запрещает контроллеру автоматически прерывать работу микропроцессора при появлении прерывания от некоторого внешнего устройства. Для того чтобы микропроцессор смог узнать о наличии того или иного запроса на прерывание, он должен сам обратиться к i8259А для получения содержимого IRR, проанализировать его и далее действовать по своему алгоритму. Данный режим моделирует так называемую опросную дисциплину обработки прерываний. Мы упоминали о ней в начале урока. Согласно этому подходу, инициатором обработки прерывания становится не само прерывание, как при векторной дисциплине, а микропроцессор, причем в определяемые им (точнее, операционной системой, выполняемой на нем) моменты времени.

Программирование контроллера прерываний осуществляется через адресное пространство ввода-вывода посредством двух 8-битовых портов с адресами 20h и 21h. Управление контроллером осуществляется путем посылки в определенной последовательности в эти порты специальных приказов двух типов:

  • ICW (Initialization Control Word) — управляющее слово инициализации. Всего имеются четыре таких слова с жесткой внутренней структурой — ICW1...ICW4. Эти слова предназначены для задания режима работы контроллера. Количество этих слов (4) определено количеством режимов (см. выше).
  • OCW (Operation Control Word) — операционное управляющее слово. Таких слов всего три, и они несут информационную нагрузку для определенных выше режимов работы контроллера прерываний. Обычно их обозначают OCW1...OCW3.

Как вы уже, наверное, успели понять, процесс программирования контроллера жестко регламентирован. Поэтому рассмотрим вначале формат приказов управления, а затем их практическое применение.

Подкатегории