Организация системы прерываний микропроцессора 8086

Скачать доклад: Организация системы прерываний микропроцессора 8086

Микропроцессор 8086 имеет простую, но достаточно универсальную систему прерываний. Каждому прерыванию поставлен в соответствие код типа. Допускается обработка до 256 типов прерываний.

Прерывания могут инициироваться внешними устройствами и командами программных прерываний. В некоторых случаях прерывания генерирует сам микропроцессор.

Возможные источники прерываний:

        Немаскируемое прерывание
-----------------------------------------¬
¦NMI
-----------¬ - - - - - - - - - -¦- - - - - - - ¬
--->¦ ¦ V МП 8086
--->¦ ¦ INT ¦ ------------------------------¬¦
Запросы --->¦ +-------->¦ Схемы прерываний ¦
от --->¦Контроллер¦ ¦ L---T-----T-----T-----T--------¦
уст- --->¦прерываний¦ ¦ ¦ ¦ ¦
ройств --->¦ ¦ ¦ ----+---¬ ¦ ----+---¬ ¦ ¦
--->¦ ¦ ¦Команда¦ ¦ ¦Ошибка ¦ ¦
--->¦ ¦ ¦ ¦ INT ¦ ¦ ¦деления¦ ¦ ¦
L----------- L-------- ¦ L-------- ¦
¦ ----+---¬ ------+-----¬ ¦
¦Команда¦ ¦Одношаговый¦
¦ ¦ INT0 ¦ ¦ режим ¦ ¦
L-------- L------------
L - - - - - - - - - - - - - - - - -

Внешние прерывания

В микропроцессоре имеются два входа прерываний - маскируемого прерывания INT и немаскируемого прерывания NMI.

На вход INT подается сигнал от программируемого контроллера прерываний, который обрабатывает сигналы запросов прерываний от периферийных устройств. Для программы контроллер прерываний выглядит, как порт ввода-вывода, в котором фиксируется код типа прерывания. Его основная функция заключается в восприятии сигналов от периферийных устройств, определении запроса с максимальным приоритетом и генерировании сигнала INT, если запрос имеет больший приоритет, чем выполняемая микропроцессором программа.

Если установлен сигнал на линии INT и установлен в 1 флажок разрешения прерывания IF, то после завершения выполнения текущей команды происходит прерывание и процессор выполняет следующие действия:

1) выдает контроллеру прерывания подтверждение прерывания;

2) считывает из контроллера прерывания код типа прерывания;

3) заносит в стек содержимое регистра флагов;

4) заносит в стек содержимое регистров IP и CS;

5) вызывает и выполняет процедуру прерывания;

6) извлекает из стека содержимое CS и IP;

7) извлекает из стека содержимое регистра флагов;

8) возвращается к выполнению следующей команды прерванной программы.

Линия немаскируемого прерывания NMI используется для сигнализации о катастрофических событиях в системе. Немаскированные прерывания имеют фиксированный код 2. Немаскированное прерывание выполняется быстрее маскированного, так как не требует подтверждения и считывания типа.

Если установлен сигнал на линии NMI, то после завершения выполнения текущей команды происходит прерывание и процессор выполняет следующие действия:

1) заносит в стек содержимое регистра флагов;

2) заносит в стек содержимое регистра IP и CS, запоминая тем самым точку возврата из процедуры прерывания;

3) вызывает и выполняет процедуру прерывания;

4) извлекает из стека содержимое CS и IP;

5) извлекает из стека содержимое регистра флагов;

6) возвращается к выполнению следующей команды.

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

Внутренние прерывания

В процессоре 8086 предусмотрено несколько внутренних прерываний, генерируемых при выполнении программы. Команда INT n вызывает прерывание сразу после своего завершения. Тип прерывания n, закодированный программистом в команде, определяет вызываемую процедуру прерывания. Следовательно, эту команду можно использовать для отладки процедур прерываний, обслуживающих периферийные устройства.

Команда INTO генерирует прерывание типа 4 после своего завершения, если установлен флаг переполнения OF.

Процессор самостоятельно генерирует прерывание типа 0 сразу после выполнения команд деления DIV и IDIV, если имело место деление на 0.

Если установлен флаг пошаговой работы TF, процессор автоматически генерирует прерывание типа 1 после выполнения каждой команды. Пошаговый режим предназначен для отладки программ.

Внутренние прерывания характеризуются следующими свойствами:

1) Тип прерывания либо предопределен, либо содержится в коде команды.

2) Подтверждение прерывания не выдается.

3) Внутренние прерывания нельзя запретить, кроме прерываний пошаговой работы.

4) Любое внутреннее прерывание (за исключением прерывания пошаговой работы) имеет более высокий приоритет, чем внешние прерывания. Если запрос NMI или INT появляется при выполнении команды, которая сама генерирует внутреннее прерывание (например, ошибка деления), оно обрабатывается первым.

По командам внутреннего прерывания процессор выполняет следующие действия:

1) заносит в стек содержимое регистра флагов;

2) заносит в стек содержимое регистра IP и CS;

3) вызывает и выполняет процедуру прерывания;

4) извлекает из стека содержимое CS и IP;

5) извлекает из стека содержимое регистра флагов;

6) возвращается к выполнению следующей команды.

Приоритеты прерываний в порядке их убывания:

1) прерывание из-за ошибки деления;

2) программное прерывание, инициируемое командой INT;

3) команда прерывания при переполнении;

4) немаскируемое прерывание NMI;

5) маскируемое прерывание INT;

6) прерывание пошаговой работы.

Таблица указателей векторов прерываний

Таблица указателей векторов прерываний осуществляет связь между кодом типа прерывания и процедурой, которая обслуживает прерывание данного типа. Таблица занимает 1 Кбайт памяти с диапазоном адресов 0 - 3FF и может содержать до 256 элементов. Каждый элемент i таблицы представляет собой полный начальный логический адрес процедуры, которая обслуживает прерывание типа i. Слово с меньшим адресом содержит смещение, а слово с большим адресом базовый адрес сегмента. Так как каждый элемент таблицы состоит из 4 байт, процессор вычисляет адрес нужного элемента таблицы путем умножения кода типа на 4.

Процедуры прерываний

Когда вызывается процедура прерывания, содержимое регистров флагов, CS и IP включено в стек, а флаги IF и TF сброшены. Процедура может разрешить внешние прерывания командой STI, допуская прерывание самой себя запросом на входе INT. Кроме того, она может быть всегда прервана запросом на входе немаскируемых прерываний на входе NMI. Внутренние прерывания, возникающие при выполнении процедуры, будут также прерывать ее. В каждой процедуре необходимо тщательно следить за тем, чтобы в ней не возникло прерывание того типа, которое она обслуживает. Необходимо также задавать объем стека, рассчитанный на максимальную глубину вложения прерываний.

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

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

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

Фактические действия процедуры зависят от ее назначения.

Если процедура обслуживает периферийное устройство, она должна передать ему приказ о снятии запроса прерывания. Затем она может получить от устройства информацию о его состоянии, определить причину прерывания и предпринять соответствующие действия.

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

Прерывание типа 0

Прерывание из-за ошибки деления возникает в том случае, когда результат операции деления превышает максимально допустимое значение, например, при делении на 0.

Прерывание типа 1

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

Пошаговый режим работы используется программами-отладчиками для индикации содержимого внутренних регистров процессора после выполнения каждой команды отлаживаемой программы.

Прерывание типа 3

Прерывание типа 3 - это прерывание контрольной точки.

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

Команда INT3 имеет длину 1 байт, что позволяет вставлять ее в любом месте программы: запоминается заменяемая команда и вместо нее подставляется команда INT3. Процедура контрольной точки, после выполнения своих основных функций, восстанавливает ранее замененную команду и производит декремент слова в стеке, которое хранило старое значение IP, чтобы после завершения процедуры произошел переход к этой команде.