- •Обмен данными между программой и периферийными устройствами
- •Модель внешнего устройства для программиста.
- •Синхронизация выполнения программы с внешними процессами Примеры внешних процессов, с которыми хочется синхронизировать программу.
- •Способы синхронизации: программный опрос состояния versus прерывания
- •Аппаратные прерывания и проблема приоритетов.
- •Механизм прерывания, его общие свойства (как это обычно делается).
- •Источники прерываний: внешние и внутренние события.
- •Радиальная схема и управление прерываниями. Контроллер прерываний.
- •Действия, которые должен выполнить программист, чтобы прерывание было работоспособно.
- •Программные прерывания.
Синхронизация выполнения программы с внешними процессами Примеры внешних процессов, с которыми хочется синхронизировать программу.
Такие ситуации, когда требуется синхронизация выполнения программы с внешним событием, возникают прежде всего при обмене данными с периферийными устройствами, в частности с устройствами ввода-вывода. Примеры:
· Прежде, чем прочитать принятый байт из регистра данных приемника UART, программа должна убедиться, что процесс приема байта завершился.
· При выводе данных в UART программа печати должна проверить, что предыдущая порция данных передана, и в буфере данных передатчика есть свободное место.
В многозадачной операционной среде одна из выполняемых программ может ожидать данных, подготавливаемых другой программой. В этом случае требуется синхронизация продолжения первой программы с завершением второй. Хотя обе программы работают на одном процессоре под одной ОС, они могут ничего не «знать» друг о друге. В этом случае событие, состоящее в завершении программы2 ничем не отличается для программы1 от внешнего события.
Возможны другие (обратные) ситуации, когда наоборот, при наступлении события нельзя продолжать выполнение текущей программы. Примеры:
Произошло деление на нуль, и следующую операцию, которая должна использовать результат деления, выполнить невозможно.
Общим в приведенных примерах является то, что в определенные моменты программа должна прореагировать на некоторое событие, причем во всех приведенных примерах реакция есть передача управления по условию наступления внешнего события.
Рассмотрим далее, каким образом программа может «узнать» о наступлении события.
Способы синхронизации: программный опрос состояния versus прерывания
Простейший способ - программный опрос готовности (polling).
Опрос готовности состоит чаще всего в анализе состояния определенных битов в регистре статуса (состояния) – при достижении состояния готовности к обмену Вну устанавливает этот(эти) бит(ы) в определенное состояние. Обмен с ВнУ состоит в чтении или записи в регистр данных.
Так, если приемник последовательного интерфейса принял извне байт, автоматически устанавливается флаг готовности – младший байт в порте 03FDh. Фрагмент программы, ожидающий приема байта, может выглядеть так:
Недостаток: при ожидании готовности нерационально расходуется время процессора.
Можно опрашивать не постоянно, а периодически, при этом появляется задержка реакции на готовность.
Поэтому разработан был механизм прерываний.
Примечание: Термин прерывание в русскоязычной компьютерной литературе многозначен и употребляется для обозначения трех различных вещей. В англоязычной литературе используются три разных термина:
hardware interrupt - аппаратное прерывание exсeption - исключение, прерывание по исключительной (экстраординарной) внутренней ситуации software interrupt - программное прерывание.
Прерывание аналогично обращению к подпрограмме, только это обращение происходит не по команде вызова подпрограммы, а как следствие наступления некоторого события. Основная особенность (в отличие от использования вызова call) рассматриваемой ситуации состоит в том, что момент наступления этого события может быть никак не связан с текущим состоянием программы.
Будем далее называть подпрограмму, обрабатывающую факт наступления события обработчиком прерывания (interrupt handler или exception handler).
Термин обработка прерывания может использоваться для обозначений двух различных вещей: 1) действия, которые автоматически выполняет процессор при возникновении запроса, они реализованы аппаратно, и 2) действия, которые выполняет программа-обработчик прерывания (handler). Мы будем использовать термин обработка прерывания только во втором смысле, а для первой группы действий будем использовать термин вход в прерывание.