Прерывания (Лекция)
ПЛАН ЛЕКЦИИ
1. Понятие прерывания
2. Классификация прерываний
3. Внешние прерывания
4. Система прерываний. Аппаратные и программные средства системы прерываний
5. Обработка прерываний в реальном режиме
1. Понятие прерывания
Прерывание означает временное прекращение основного процесса вычислений для выполнения некоторых запланированных или незапланированных действий, вызываемых работой аппаратуры или программы.
Т.е. это процесс, временно переключающий микропроцессор на выполнение другой программы с последующим возвратом к прерванной программе.
Нажимая клавишу на клавиатуре, мы инициируем немедленный вызов программы, которая распознает клавишу, заносит ее код в буфер клавиатуры, из которого он считывается другой программой. Т.е. на некоторое время микропроцессор прерывает выполнение текущей программы и переключается на программу обработки прерывания, так наз. обработчик прерывания. После того, как обработчик прерывания завершит свою работу, прерванная программа продолжит выполнение с точки, где было приостановлено ее выполнение.
Адрес программы-обработчика прерывания вычисляется по таблице векторов прерываний.
Механизм прерываний поддерживается на аппаратном уровне.
2. Классификация прерываний
В зависимости от источника, прерывания делятся на :
· аппаратные — возникают как реакция микропроцессора на физический сигнал от некоторого устройства (клавиатура, системные часы, клавиатура, жесткий диск и т.д.), по времени возникновения эти прерывания асинхронны, т.е. происходят в случайные моменты времени;
· программные — вызываются искусственно с помощью соответствующей команды из программы ( int ), предназначены для выполнения некоторых действий операционной системы, являются синхронными;
· исключения — являются реакцией микропроцессора на нестандартную ситуацию, возникшую внутри микропроцессора во время выполнения некоторой команды программы (деление на ноль, прерывание по флагу TF (трассировка)).
Общая классификация прерываний
· внешние — вызываются внешними по отношению к микропроцессору событиями
(по существу — это группа аппаратных прерываний) Вложенных прерываний нет!
· внутренние — возникают внутри микропроцессора во время вычислительного процесса (по существу — это исключительные ситуации и программные прерывания).
3. Внешние прерывания
Внешние прерывания возникают по сигналу какого-нибудь внешнего устройства.
Внешние прерывания подразделяются на немаскируемые и маскируемые.
В связи с тем, что существуют два специальных внешних сигнала среди входных сигналов процессора, при помощи которых можно прервать выполнение текущей программы и тем самым переключить работу центрального процессора. Это сигналы NMI ( no mask interrupt , немаскируемое прерывание) и INTR ( interrupt request , запрос на прерывание).
Прерывания в микроконтроллерах? Что это, и как с ними работать. Краткий ликбез.
Маскируемые прерывания генерируются контроллером прерываний по заявке определенных периферийных устройств. Контроллер прерываний (выполнен в виде специальной микросхемы i 8259 A ) поддерживает восемь уровней (линий) приоритета; к каждому уровню “привязано” одно периферийное устройство. Именно маскируемые прерывания часто называют аппаратными прерываниями.
Немаскируемые прерывания (говорят, что оно одно, т.к. подается на вывод микропроцессора NMI ) инициируют источники, требующие безотлагательного вмешательства со стороны микропроцессора.
В реальном и защищенном режиме работы микропроцессора обработка прерываний осуществляется принципиально разными методами.
4. Система прерываний. Аппаратные и программные средства системы прерываний
Система прерываний — это совокупность программных и аппаратных средств, реализующих механизм прерываний.
К аппаратным средствам системы прерываний относятся:
· выводы микропроцессора — на них формируются сигналы, извещающие микропроцессор либо о том, что некоторое внешнее устройство «просит уделить ему внимание» ( INTR ), либо о том, что требуется безотлагательная обработка некоторого события или катастрофическая ошибка ( NMI )
· INTR — вывод для входного сигнала запроса на прерывание,
· NMI — вывод для входного сигнала немаскируемого прерывания
· INTA — вывод для выходного сигнала подтверждения получения сигнала прерывания микропроцессором (этот сигнал поступает на одноименный вход микросхемы конроллера 8259А;
· программируемый контроллер прерываний 8259А (предназначен для фиксирования сигналов прерываний от восьми различных внешних устройств; он выполнен в виде микросхемы; обычно используют две последовательно соединенные микросхемы, поэтому кол-во возможных источников внешних прерываний до 15 плюс одно немаскируемое прер .; именно он формирует номер вектора прерывания и выдает его шину данных);
· внешние устройства (таймер, клавиатура, магнитные диски и т.п.)
К программным средствам системы прерываний Реального режима относятся:
· таблица векторов прерываний.
Занимает первый килобайт ОП (адреса 00000 h -003 FFh ).
Она содержит адреса (векторы — «векторы», т.к. два значения для указания адреса) обработчиков прерываний и состоит из 256 (0..255) элементов по 4 байта каждый:
— 2 байта — новое значение для регистра IP
— 2 байта — новое значение для регистра CS .
Расположение таблицы векторов прерываний в процессорах i 80286 и старше определяется значением регистра IDTR .
Таблица векторов прерываний инициализируется при запуске системы, но в принципе может быть изменена и перемещена.
Каждый вектор имеет свой номер и называется номером прерывания.
· два флага в регистре флагов flags / eflags :
· IF (Interrupt Flag) — флаг прерывания . Предназначен для маскирования (запрещения) аппаратных прерываний. Если IF =1, микропроцессор обрабатывает внешние прерывания, если = 0, то игнорирует;
· TF ( Trace Flag ) — флаг трассировки. Если он=1, то микропроцессор переходит в режим покомандной работы. В этом режиме в микропроцессоре генерируется внутреннее прерывание с номером 1;
· машинные команды микропроцессора: int , into (прерывание по переполнению), iret , cli , sti
5. Обработка прерывания в реальном режиме
Обработка прерывания в реальном режиме производится в три этапа:
1) прекращение выполнения текущей программы;
Должно произойти так, чтобы потом вернуться и продолжить работу. Для этого необходимо сохранить содержимое регистров, так как они являются ресурсами, разделяемыми между программами.
Обязательными для сохранения являются регистры cs , ip , flags (пара CS : IP содержит адрес команды, с которой необходимо начать выполнение после возврата, flags — состояние флагов после выполнения последней команды прерванной программы).
Наиболее удобным местом хранения регистров является стек.
После сохранения регистров в стеке микропроцессор сбрасывает бит флага IF (т.е.=0) (. В стеке при этом записан регистр flags с еще установленным IF . ) Этим предотвращается возможность возникновения вложенных внешних прерываний и порча регистров исходной программы вследствие неконтролируемых действий со стороны программы — обработчика вложенного прерывания. После того как необходимые действия по сохранению контекста завершены, обработчик аппаратного прерывания может разрешить вложенные прерывания командой sti .
2) переход к выполнению и выполнение программы обработки прерывания;
Здесь определяется источник прерывания и вызывается соответствующий обработчик прерывания.
В реальном режиме микропроцессора допускается 256 источников — по кол-ву элементов таблицы векторов прерываний.
· 2 байта — значение смещения начала программы-обработчика прерывания от начала кодового сегмента
· 2 байта — значение базового адреса сегмента, в котором находится программа-обработчик.
Итак, на втором этапе микропроцессор
1. По номеру источника прерывания определяет смещение в таблице векторов прерываний
2. Помещает первые два байта в регистр IP
3. Помещает вторые два байта в регистр CS
4. Передает управление по адресу CS : IP
Далее выполняется сама программа обработки прерывания.
(Она тоже может быть прервана поступлением запроса от более приоритетного источника. Все источники прерывания имеют приоритеты.)
3) возврат управления прерванной программе.
Необходимо привести стек в состояние, в котором он был сразу после передачи управления данной процедуре. Для этого программист должен указать необходимые действия по восстановлению регистров и очистке стека. Последние команды в в обработчике прерывания — sti , iret
sti — разрешить аппаратные прерывания (устанавливает флаг IF =1, не имеет операндов).
iret — извлечь последовательно три слова из стека и поместить их соответственно в регистры ip , cs , flags .
Прерывания. Типы и классы прерываний
Прерывание (англ. interrupt) — сигнал, сообщающий процессору о наступлении какого-либо события. При этом выполнение текущей последовательности команд приостанавливается, и управление передаётся обработчику прерывания, который реагирует на событие и обслуживает его, после чего возвращает управление в прерванный код.
В зависимости от источника возникновения сигнала прерывания делятся на:
— асинхронные, или внешние (аппаратные) — события, которые исходят от внешних источников (например, периферийных устройств) и могут произойти в любой произвольный момент: сигнал от таймера, сетевой карты или дискового накопителя, нажатие клавиш клавиатуры, движение мыши. Факт возникновения в системе такого прерывания трактуется как запрос на прерывание (англ. Interrupt request, IRQ);
— синхронные, или внутренние — события в самом процессоре как результат нарушения каких-то условий при исполнении машинного кода: деление на ноль или переполнение стека, обращение к недопустимым адресам памяти или недопустимый код операции;
— программные (частный случай внутреннего прерывания) — инициируются исполнением специальной инструкции в коде программы. Программные прерывания как правило используются для обращения к функциям встроенного программного обеспечения (firmware), драйверов и операционной системы.
Существует 6 классов прерываний.
1. Программы-прерывания по системной директиве. Инициатор — активный процесс, выполнивший обращение к супервизору, то есть запрос на предоставление ОС системной вычислительной услуги.
2. Прерывания ввода-вывода. Инициируются устройством ввода/вывода (УВВ) и сигнализируют ЦП о том, что произошло изменение состояния канала ввода-вывода (КВВ) или УВВ (например: завершение операции, ошибка, переход устройства в состояние готовности).
3. Внешние прерывания. Нажатие операторами клавиш на панели ЭВМ или прием сигнала прерывания от другого ЦП в мультипроцессорной системе, сигнала от модема.
4. Прерывание по рестарту. Нажатие оператором кнопки рестарта или Reset.
5. Логические прерывания по контролю программы вызываются программными ошибками, обнаруженными при выполнении программы (деление на 0, попытка выполнить привилегированную команду в пользовательском режиме, неверный код операции, защита памяти и т.д.).
6. Прерывания по контролю машины из-за аппаратных ошибок прерывания упорядочены по приоритетам. Определенный тип прерываний запрещает свой тип и младшие и разрешает старшие. ЦП реагирует только на разрешенные прерывания, обработка запрещенных прерываний либо задерживается, либо, в некоторых случаях, игнорируется.
Прерывание в операционной системе
Прерыва́ние в операционной системе, сигнал , который информирует процессор о событии, требующем внештатной обработки. Сигнал прерывания заставляет процессор приостановить последовательное выполнение потока инструкций и передать управление в специальный код обработки прерывания – обработчик прерываний , который, как правило, входит в состав операционной системы .
Существуют два вида прерываний: а) синхронные, которые возникают вследствие выполнения текущей инструкции процессора: программные прерывания, разыменование некорректного указателя, деление на ноль; б) асинхронные, которые инициируются внешними источниками: прерывания от таймера, от ввода-вывода (от дисководов, клавиатуры, последовательного порта, мыши и т. д.).
Редакция информационных технологий
Опубликовано 23 августа 2022 г. в 09:06 (GMT+3). Последнее обновление 23 августа 2022 г. в 09:06 (GMT+3). Связаться с редакцией
Информация
Области знаний: Системное программирование, Архитектура и устройства ЭВМ
Точные прерывания в процессорах с последовательным выполнением команд
Для процессоров с последовательным выполнением команд реализация точных прерываний довольно проста, поэтому представляется логичным начать с нее. Поскольку в каждый момент времени выполняется только одна команда, то в момент обнаружения прерывания все команды, предшествующие прерываемой, уже выполнены, а последующие даже не начаты.
Таким образом, для реализации точных прерываний в таких процессорах достаточно убедиться, что прерываемая команда никогда не обновляет состояние процесса до тех пор, пока не станет ясно, вызвала она исключение или нет.
Место, где процессор должен определить, позволить ли команде обновить состояние процесса или нет, называется точкой фиксации результатов (commit point). Если процессор сохраняет результаты команды, то есть команда не вызвала исключение, то говорят, что эта команда зафиксирована (на сленге — закоммичена).
- Выборка команды из памяти
- Декодирование команды
- Исполнение команды
- Запись результатов в регистры и/или память
- ошибка памяти при выборке команды
- неизвестный код операции при декодировании
- деление на ноль при исполнении
- ошибка памяти при записи результатов
- нельзя фиксировать команду и разрешать ей записывать результаты в память до тех пор, пока не станет ясно, что команда не вызвала исключение
- нельзя узнать, что исключение не вызвано, не записав результаты в память (для этого нужно получить подтверждение от контроллера памяти, что запись произведена успешно)
Как можно догадаться, эту проблему довольно сложно решить, поэтому во многих процессорах для простоты реализованы «почти точные» прерывания, то есть точными сделаны все прерывания, кроме исключений, вызванных ошибками памяти при записи результатов. В этом случае точка фиксации результатов находится между третьим и четвертым этапами цикла команды.
Важно! Нужно помнить, что счетчик команд тоже должен обновляться строго после точки фиксации результатов. При этом он изменяется вне зависимости от того, зафиксирована команда или нет — в него записывается либо адрес следующей команды, либо вектор прерывания, либо РАВ.
Точные прерывания в процессорах с параллельным выполнением команд
На сегодняшний день процессоров с последовательным выполнением команд почти не осталось (могу вспомнить разве что аналоги интеловского 8051) — их вытеснили процессоры с параллельным выполнением команд, обеспечивающие при прочих равных более высокую производительность. Простейший процессор с параллельным выполнением команд — процессор с конвейером команд (instruction pipeline).
Несмотря на многочисленные преимущества, конвейер команд значительно усложняет реализацию точных прерываний, чем много десятков лет печалит разработчиков.
В процессоре с последовательным выполнением команд этапы цикла команды зависят друг от друга. Простейший пример — счетчик команд. Вначале он используется на этапе выборки (как адрес в памяти, откуда должна быть прочитана команда), затем на этапе исполнения (для вычисления его следующего значения), и потом, если команда зафиксирована, он обновляется на этапе записи результатов. Это приводит к тому, что нельзя выбрать следующую команду до тех пор, пока предыдущая не завершит последний этап и не обновит счетчик команд. То же самое относится и ко всем прочим сигналам внутри процессора.
Процессор с конвейером команд можно получить из процессора с последовательным выполнением команд, если сделать так, чтобы каждый этап цикла команды был независим от предыдущих и последующих этапов.
- Результат выборки — закодированная команда — сохраняется в регистре, расположенном между этапами выборки и декодирования
- Результат декодирования — тип операции, значения операндов, адрес результата — сохраняются в регистрах между этапами декодирования и исполнения
- Результаты исполнения — новое значение счетчика команд для условного перехода, вычисленный в АЛУ результат арифметической операции и так далее — сохраняются в регистрах между этапами исполнения и записи результатов
- На последнем этапе результаты и так записываются в регистры и/или память, поэтому никакие вспомогательные регистры не нужны.
Такт СК Выборка Декодирование Исполнение Запись_результатов 1 0x00 Команда1 — — — 2 0x04 Команда2 Команда1 — — 3 0x08 Команда3 Команда2 Команда1 — 4 0x0C Команда4 Команда3 Команда2 Команда1 5 0x10 Команда5 Команда4 Команда3 Команда2
Обратите внимание на столбец СК («счетчик команд»). Его значение меняется каждый такт и определяет адрес в памяти, откуда выбирается команда.
Внимательный читатель уже заметил небольшую неувязочку — для обеспечения точности прерываний первая команда не имеет права изменить счетчик команд раньше четвертого такта. Чтобы это исправить, мы должны перенести счетчик команд за точку фиксации результата (предположим, что она находится между третьим и четвертым этапами):
Такт Выборка Декодирование Исполнение Запись_результатов СК 1 Команда1 — — — 0х00 2 — Команда1 — — 0х00 3 — — Команда1 — 0х00 4 Команда2 — — Команда1 0х04 5 — Команда2 — — 0х04
Производительность процессора немного упала, не так ли? На самом деле, решение лежит на поверхности – нам нужно два счетчика команд! Один должен находиться в начале конвейера и указывать, откуда читать команды, второй – в конце, и указывать на ту команду, которая должна быть зафиксирована следующей.
Первый называется «спекулятивным», второй – «архитектурным». Чаще всего спекулятивный счетчик команд не существует сам по себе, а встроен в предсказатель переходов. Выглядит это вот так:
Такт ССК Выборка Декодирование Исполнение Запись_результатов АСК 1 0x00 Команда1 — — — 0х00 2 0x04 Команда2 Команда1 — — 0х00 3 0x08 Команда3 Команда2 Команда1 — 0х00 4 0x0C Команда4 Команда3 Команда2 Команда1 0х04 5 0x10 Команда5 Команда4 Команда3 Команда2 0х08
- Если пришло внешнее прерывание, команда коммитится, но адрес следующей команды записывается не в АСК, а в РАВ. В АСК записывается адрес вектора прерывания.
- Если возникло исключение, команда не коммитится, вместо этого в АСК записывается адрес вектора соответсвующего исключения, а адрес команды записывается в РАВ.
- Если адрес команды не равен АСК, она тоже не коммитится (об этом позже). Если адрес равен АСК и исключения не произошло – процессор фиксирует команду и обновляет АСК (записывает адрес перехода в случае команды ветвления или просто инкрементирует в случае другой команды)
Такт ССК Выборка Декодирование Исполнение Запись_результатов АСК 1 0x00 jump 0x1234 — — — 0х00 2 0x04 Команда2 jump 0x1234 — — 0х00 3 0x08 Команда3 Команда2 jump 0x1234 — 0х00 4 0x0C Команда4 Команда3 Команда2 jump 0x1234 0х1234 *** Для Команды2 на четвертом такте ее адрес (0х04) не равен АСК, потому что переход был предсказан неверно*** 5 0x1234 Команда666 — — — 0х1234 6 0x1238 Команда667 Команда666 — — 0х1234 7 0x1240 Команда668 Команда667 Команда666 — 0х1234 8 0x1244 Команда669 Команда668 Команда667 Команда666 0х1238
На этом все. Разумеется, показаный четырехстадийный конвейер прост до невозможности. На самом деле, некоторые команды могут исполняться более одного такта, и даже простой микроконтроллер умеет завершать их не в том порядке, в котором он запустил их на выполнение, при этом обеспечивая точность прерываний. Однако общий принцип организации прерываний, смею вас заверить, остается тем же.
Желающим усугубить взрыв мозга рекомендую ознакомиться с Implementation of precise interrupts in pipelined processors. Да-да, ваш новейший Интел Кор Ай Семь работает именно так, как описано в этой статье двадцатипятилетней давности. Добро пожаловать в восьмидесятые!
Прерывания и особые случаи
Прерывание — это изменение естественного порядка выполнения программы, которое связано с необходимостью реакции системы на работу внешних устройств, а также на ошибки и особые ситуации, возникшие при выполнении программы. При этом вызывается специальная программа — обработчик прерываний, специфическая для каждой возникшей ситуации, после выполнения которой возобновляется работа прерванной программы.
Механизм прерывания обеспечивается соответствующими аппаратно-программными средствами компьютера.
Классификация прерываний представлена на рис. 7.1.
Рис. 7.1. Классификация прерываний
Запросы аппаратных прерываний возникают асинхронно по отношению к работе микропроцессора и связаны с работой внешних устройств.
Запрос от немаскируемых прерываний поступает на вход NMI микропроцессора и не может быть программно заблокирован. Обычно этот вход используется для запросов прерываний от схем контроля питания или неустранимых ошибок ввода/вывода.
Для запросов маскируемых прерываний используется вход INT микропроцессора. Обработка запроса прерывания по данному входу может быть заблокирована сбросом бита IF в регистре флагов микропроцессора.
Программные прерывания, строго говоря, называются исключениями или особыми случаями. Они связаны с особыми ситуациями, возникающими при выполнении программы (отсутствие страницы в оперативной памяти, нарушение защиты, переполнение ), то есть с теми ситуациями, которые программист предвидеть не может, либо с наличием в программе специальной команды INT n, которая используется программистом для вызова функций операционной системы либо BIOS , поддерживающих работу с внешними устройствами. В дальнейшем при обсуждении работы системы прерываний мы будем употреблять единый термин » прерывание » для аппаратных прерываний и исключений, если это не оговорено особо.
Программные прерывания делятся на следующие типы.
Нарушение (отказ) — особый случай, который микропроцессор может обнаружить до возникновения фактической ошибки (например, отсутствие страницы в оперативной памяти); после обработки нарушения программа выполняется с рестарта команды, приведшей к нарушению.
Ловушка — особый случай, который обнаруживается после окончания выполнения команды (например, наличие в программе команды INT n или установленный флаг TF в регистре флагов ). После обработки этого прерывания выполнение программы продолжается со следующей команды.
Авария ( выход из процесса) — столь серьезная ошибка, что некоторый контекст программы теряется и ее продолжение невозможно. Причину аварии установить нельзя, поэтому программа снимается с обработки. К авариям относятся аппаратные ошибки, а также несовместимые или недопустимые значения в системных таблицах.
Порядок обработки прерываний
Прерывания и особые случаи распознаются на границах команд, и программист может не заботиться о состоянии внутренних рабочих регистров и устройств конвейера.
Реагируя на запросы прерываний, микропроцессор должен идентифицировать его источник, сохранить минимальный контекст текущей программы и переключиться на специальную программу — обработчик прерывания. После обслуживания прерывания МП возвращается к прерванной программе, и она должна возобновиться так, как будто прерывания не было.
Обработка запросов прерываний состоит из:
- «рефлекторных» действий процессора, которые одинаковы для всех прерываний и особых случаев и которыми программист управлять не может;
- выполнения созданного программистом обработчика.
Для того чтобы микропроцессор мог идентифицировать источник прерывания и найти обработчик, соответствующий полученному запросу, каждому запросу прерывания присвоен свой номер ( тип прерывания ).
Тип прерывания для программных прерываний вводится изнутри микропроцессора; например, прерывание по отсутствию страницы в памяти имеет тип 14. Для прерываний, вызываемых командой INT n, тип содержится в самой команде. Для маскируемых аппаратных прерываний тип вводится из контроллера приоритетных прерываний по шине данных . Немаскируемому прерыванию назначен тип 2.
Всего микропроцессор различает 256 типов прерываний. Таким образом, все они могут быть закодированы в 1 байте.
«Рефлекторные» действия микропроцессора по обработке запроса прерывания выполняются аппаратными средствами МП и включают в себя:
- определение типа прерывания ;
- сохранение контекста прерываемой программы (некоторой информации, которая позволит вернуться к прерванной программе и продолжить ее выполнение). Всегда автоматически сохраняются как минимум регистры EIP и CS , определяющие точку возврата в прерванную программу, и регистр флагов EFLAGS . Если вызов обработчика прерывания проводится с использованием шлюза задачи, то в памяти полностью сохраняется сегмент состояния TSS прерываемой задачи;
- определение адреса обработчика прерывания и передача управления первой команде этого обработчика.
После этого выполняется программа — обработчик прерывания, соответствующая поступившему запросу. Эта программа пишется и размещается в памяти прикладным или системным программистом. Обработчик прерывания должен завершаться командой I RET , по которой автоматически происходит переход к продолжению выполнения прерванной программы с восстановлением ее контекста.
Для вызова обработчика прерывания микропроцессор при работе в реальном режиме использует таблицу векторов прерываний, а в защищенном режиме — таблицу дескрипторов прерываний.
Таблица векторов прерываний (рис. 7.2) располагается в самых младших адресах оперативной памяти, имеет объем 1 Кбайт и содержит 4байтные элементы ( векторы прерываний ) для 256 обработчиков прерываний. Старшие 2 байта вектора загружаются в сегментный регистр команд CS , а младшие 2 байта — в регистр указателя команд IP . Обращение к элементам таблицы осуществляется по 8-разрядному коду — типу прерывания. Так как таблица всегда имеет нулевой начальный адрес и длину вектора в 4 байта, чтобы определить адрес вектора для прерывания типа i, достаточно просто умножить это значение на 4.
В защищенном режиме для вызова обработчика прерывания используется таблица дескрипторов прерываний IDT . Элементами таблицы являются 8-байтные дескрипторы типа шлюз -пециальные программные структуры, через которые происходит передача управления обработчику.
Рис. 7.2. Таблица векторов прерываний
Обращение к IDT аналогично обращению к глобальной таблице дескрипторов, где вместо системного регистра GDT R используется регистр IDTR , который определяет размер и базовый адрес таблицы в памяти.
Физический адрес дескриптора шлюза, находящегося в IDT , определяется как сумма базового адреса таблицы и умноженного на 8 типа прерывания (рис. 7.3).
Рис. 7.3. Порядок обращения к таблице дескрипторов прерываний
Содержимое регистра IDTr не сохраняется в сегментах TSS и не изменяется при переключении задачи. Программы не могут обратиться к IDT , так как единственный бит TI индикатора таблицы в селекторе сегмента обеспечивает выбор только между таблицами GDT и LDT .
Максимальный предел таблицы дескрипторов прерываний составляет 256*8 — 1 = 2047.
Можно определить предел меньшим, но это не рекомендуется. Если происходит обращение к дескриптору вне пределов IDT , процессор переходит в режим отключения до получения сигнала по входу NMI или сброса.
В IDT могут храниться только дескрипторы следующих типов:
- шлюз ловушки ,
- шлюз прерывания, шлюз задачи.
Шлюзы ловушки и прерывания сходны со шлюзом вызова, только в них отсутствует поле счетчика WC (рис. 7.4). Так как прерывание является неожиданным событием и не связано с текущей программой, говорить о передаче параметров их обработчику не приходится.
Рис. 7.4. Формат шлюзов ловушки и прерывания
Бит S = 0 в байте доступа определяет этот дескриптор как системный объект . Если поле ТИП в байте доступа равно 1110, то это шлюз прерывания, если 1111 — то шлюз ловушки.
Поле уровня привилегий дескриптора DPL , как правило, устанавливается равным 3 с тем, чтобы к обработчику прерываний могли обращаться программы с любого уровня привилегий.
Бит присутствия P может быть равен как 0, так и 1.
При входе в обработчик через шлюз прерывания в регистре флагов сбрасывается бит разрешения прерываний IF . В этом случае микропроцессор блокирует все маскируемые аппаратные прерывания. Поэтому в обработчике прерываний этот бит должен быть установлен в 1 как можно раньше с тем, чтобы не блокировать работу программ, которые вызываются, например, при обработке прерываний от системного таймера .
При входе в обработчик через шлюз ловушки флаг IF не меняется.
Вызов обработчика через шлюз ловушки , а не шлюз прерывания, чаще реализуют при обработке исключений , так как на период обслуживания прерывания нежелательно выключать механизм разделения времени, использующий прерывания таймера.
Вызов обработчика через шлюз задачи обычно осуществляется при обработке аппаратных прерываний, так как такая обработка не связана с текущей выполняемой задачей. При этом возможен механизм вложенных прерываний, если прерывания в задаче разрешены. Вызов обработчика прерывания через шлюз задачи осуществляется и при обработке исключений , например, «неразрешенный TSS «, когда поврежденная задача не может вызвать процедуру прерывания. Переключение задач требует примерно в 5 раз больше времени, чем вызов процедуры. Поэтому, если приоритет запроса высок, а программа обслуживания короткая, ее оформляют в виде процедуры.
Прерывание в информатике это
Прерывание — это остановка извне выполнения текущей программы на время выполнения некоторой подпрограммы (которая называется «обработчик прерывания»). Что это значит? Прерывание возникает по некоторому внешнему сигналу, поступающему в процессор. При этом, основная программа останавливается в совершенно произвольном месте (где ее застанет прерывание), и начинается выполнение подпрограммы-обработчика. По окончании работы обработчика, выполнение основной программы возобновляется с места останова. Это бывает очень полезно, если необходимо оперативно среагировать на какое-то внешнее событие. Например, на нажатие кнопочки, на начало передачи данных… И т.д. и т.п. В AT90s2313 существует 11 событий, по которым можно установить прерывания (прерывание — дело добровольное, хочешь — ставишь, хочешь — не ставишь). Что это за события? Открываем даташит по микросхеме на стр.19 и смотрим табличку «Reset and interrupt vectors». Для ленивых привожу ее здесь:
- Reset — прерывание по сбросу (подача 0 на вывод микросхемы «Reset»; или включение питания; или по переполнению сторожевого таймера)
- INT_0 — первое внешнее прерывание (сигнал на вывод микросхемы «INT0»)
- INT_1 — второе внешнее прерывание (сигнал на «INT1»)
- Timer1_capt1 — прерывание защелки 1-го таймера
- Timer1_comp1 — прерывание компаратора 1-го таймера
- Timer1_OVF1 — по переполнению 1-го таймера
- Timer0_OVF0 — по переполнению 0-го таймера
- UART_RX — по окончанию приема пакета по протоколу UART
- UART_UDRE — по опустошению регистра данных UART
- UART_TX — по окончанию передачи пакета по UART
- ANA_COMP — прерывание аналогового компаратора
Если некоторые слова вам еще не знакомы — не отчаивайтесь, так и должно быть. Давайте лучше разбираться, что такое — Interrupt Vectors — Вектора Прерываний? А это ни что иное, как указатели на адрес ПЗУ, на который мы переходим в результате прерывания. Все векторы расположены в самом начале адресного пространства, и занимают первые 11 адресов ПЗУ (с по A). Это прекрасно видно из таблицы. То есть, если мы, скажем, хотим активизировать прерывание Timer1_comp1, то мы должны по адресу $004 поставить ссылку на подпрограмму — обработчик этого прерывания. А вообще, лучше расставить в начале программы ссылки на все прерывания. Давайте так и сделаем.
.cseg .org 0 rjmp Reset rjmp INT_0 rjmp INT_1 rjmp Timer1_capt1 rjmp Timer1_comp1 rjmp Timer1_OVF1 rjmp Timer0_OVF0 rjmp UART_RX rjmp UART_UDRE rjmp UART_TX rjmp ANA_COMP
Так как эти команды стоят в самом начале программы, значит они как раз таки будут расположены в ПЗУ по первым 11-ти адресам. Таким образом, при каждом прерывании, будет вызываться соответствующий обработчик.
Например: по прерыванию компаратора таймера 1 (Timer1_comp1), мы перескакиваем на адрес $004, то есть — на 5-ю строчку программы. В пятой строчке стоит безусловный переход на метку Timer1_comp1. Где-то ниже в программе, мы пишем обработчик этого прерывания и в его начале ставим эту метку. Вот так все несложно…
Ну а что делать с остальными прерываниями, которые не используются? Надо все равно прописать на них метки (иначе компилятор страшно выругается), но по этим меткам ничего не делать, а тут же выходить.
Кстати, чуть не забыл:
reti — Interrupt return — выход из обработчика прерывания
Reset: INT_0: INT_1: Timer1_capt1: Timer1_comp1: Timer1_OVF1: Timer0_OVF0: UART_RX: UART_UDRE: UART_TX: ANA_COMP: reti
Пусть вас не смущает, что столько меток стоят на одну команду: это не страшно, так можно делать. Нельзя ставить несколько ОДИНАКОВЫХ меток…
Теперь в этой куче остается только закомментировать те прерывания, которые мы используем. В частности, в любой программе используется прерывание по сбросу (Reset). Поэтому его комментируем сразу же, а уже непосредственно текст основной программы начинаем с метки Reset.
Ну вот. Теперь возвращаемся к нашим баранам. То есть — бегущим огонечкам.
Прерывания. Классы прерываний. Механизм прерываний.
Прерывание (англ. interrupt) — сигнал, сообщающий процессору о наступлении какого-либо события. Приостановление работы одной программы и передача управления другой при возникновении некоторого независящего от них события. При этом сохраняется возможность возврата управления прерванной программе, без потери ею работоспосодности.
Программное прерывание. Генерируется в некоторых ситуациях, возникающих в результате выполнения команд. Такими ситуациями могут быть арифметичкое переполнение, деление на ноль, попытка выполнить некорректную команду и ссылка на область памяти, доступ к которой пользователю запрещен.
Прерывание по таймеру. Генерируется таймером процессора. Это прерывание позволяет ос выполнять некоторые свои функции периодически, через заданные промежутки времени.
Прерывание ввода-вывода. Генерируется контроллером ввода-вывода. Сигнализирует о нормальном завершении операции или о наличие ошибок.
Аппаратное прерывание. Генерируется при возникновении таких аварийных ситуаций, как, например, падение напряжения в сети или ошибка контроля четности памяти.
Механизм обработки прерываний представлен на схеме:
Основные функции супервизора прерываний:
· передача управления соответствующей программе — обработчику прерываний;
· корректное возвращение к выполнению прерванной программы.
Прерывания, используемые при работе ЭВМ, можно разделить на внешние и внутренние.
Внешние прерывания инициируются событиями, происходящими вне выполняемого в данный момент времени процесса (прерывания от таймера, от устройств ввода-вывода, от другого процесса, по требованию оператора).
Внутренние прерывания возникают в результате событий, связанных с работой прерываемого процесса (обнаружение ошибки, деление на ноль, переполнение, обращение оп несуществующему адресу и др.). Особую группу составляют программные прерывания (заранее запланированные в ходе выполнения программы).
Реакция системы на прерывание определяется супервизором прерываний и в зависимости от его приоритета влечет за собой одно из следующих событий:
· немедленное выполнение прерывания;
· постановку его в очередь;
Если супервизор(центральный управляющий модуль ОС) дает команду на обработку прерывания, выполняются следующие действия:
· сохранение в дескрипторе (таблице) текущей задачи значений рабочих регистров;
· определение адреса начала программы выполнения прерывания (обращение в таблицу адресов прерываний);
· включение режима обработки прерываний;
· выполнение программы-обработчика прерываний;
· отключение режима обработки прерываний и восстановление из ранее созданной таблицы значений рабочих регистров для продолжения прерванного процесса.
Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями: