Процесс выборки и выполнения последовательности команд может быть прерван для выполнения обслуживания одного из событий, возникшего во время выполнения программы. Это связано с выполнением микропроцессором специальной аппаратной функции — прерывания.
Прерывание – это аппаратная функция микропроцессора, позволяющая ему во время выполнения программы, единым образом реагировать на различные внутренние и внешние асинхронные события, которые возникают в процессе работы компьютера. За счет выполнения процедуры прерывания, процессор прерывает выполнение текущей программы и переходит к выполнению другой программы, которая обслужит событие, вызвавшее данное прерывание. Возврат из программы обслуживания осуществляется за счет выполнения в конце этой программы команды процессора IRET (возврат из прерывания).
События, вызывающие прерывания, — это:
- аппаратные ошибки, определяемые схемами контроля устройств: ошибка четности; ошибка ввода-вывода (немаскируемые прерывания NMI);
- внутренние ошибки МП (ошибка деления на 0, нарушение прав доступа к сегменту памяти и др.);
- выполнение команд INT (программные прерывания);
- запросы на обслуживание от внешних устройств ( маскируемые прерывания по сигналам IRQ);
- запрос на переход в режим управления системой ( SMI ) и др.
Все события, вызывающие прерывания, пронумерованы от 0 через единицу до FF (256 событий). За каждым событием жестко закреплен вектор прерывания (в режиме реального адреса — четыре байта ОЗУ). В векторе прерывания хранится программный адрес (базовый адрес сегмента памяти и смещение) начала программы обслуживания данного события.
Под векторы прерывания в режиме реального адреса (в этом режиме работают все микропроцессоры от 80286 до Pentium 4 после включения электропитания) отводится область ОЗУ с 0 до 400h (256 векторов х 4 байта = 1024 байта). Адрес вектора прерывания (АВП) – это адрес младшего из четырех байтов вектора прерывания. АВП = (номер события вызывающего прерывание) х 4. Для обслуживания прерываний выделяется и используется небольшая область оперативной памяти, которую называют стек.
Стек – это область оперативной памяти, предназначенная для хранения данных, имеющих временную ценность, например, сохраняется текущее состояние микропроцессора, необходимое для возврата по команде IRET в прерванную ранее программу. Запись в стек выполняется с авто-уменьшением адресов, а чтение с авто-увеличением адресов (принцип: «первым пришел – последним ушел»). Физический адрес для обращения в стек формируется из содержимого регистров процессора (SS : SP). При выполнении записи в стек содержимое регистра SP автоматически уменьшается на 2, а затем используется в качестве смещения при вычислении физического адреса. При обращении по чтению в стек содержимое регистра SP используется в качестве смещения при вычислении физического адреса, а затем к регистру SP автоматически прибавляется 2. Обращение в стек может быть выполнено во время выполнения микропроцессором аппаратной функции (например, прерывание) и по командам микропроцессора (например, PUSH , POP).
Уроки Ардуино #16 — аппаратные прерывания
Сигналы IRQ n
Сигналы IRQ n (Interrupt ReQuest — запрос прерывания) — сигнал от одного из узлов компьютера, требующий внимания процессора к этом узлу. Сигнал генерируется при наступлении какого-либо события (например, нажатии клавиши, завершении операции чтения/записи на диске и т.п.). Например, в однопроцессорном варианте ПК предусмотрено 15 линий IRQ, часть которых используется внутренними контроллерами системной платы, а остальные заняты стандартными адаптерами либо не используются:
0 — системный таймер (канал 0)
1 — контроллер клавиатуры
2 — сигнал с выхода починенного контроллера прерываний
3 — обычно COM2/COM4
4 — обычно COM1/COM3
5 — параллельный порт LPT2
6 — контроллер FDD
7 — параллельный порт LPT1
8 — часы реального времени с автономным питанием (RTC)
9 — параллельна IRQ 2
10 — резерв для устройств
11 — резерв для устройств
12 — обычно контроллер мыши типа PS/2
13 — математический сопроцессор
14 — обычно контроллер Primary IDE HDD (первый канал)
15 — обычно контроллер Secondary IDE HDD (второй канал)
Прерывания и исключения.
Процессор управляет внешними устройствами, выполняя соответствующую программу ввода/вывода, где он с помощью команд IN,OUT (чтение порта, запись в порт) имеет доступ к программно-доступным регистрам контроллера. В регистр управления процессор записывает команду, из регистра состояния читает информацию о состоянии устройства и контроллера, в регистр данных записывает выводимые на устройство данные, или читает из регистра данных считываемую с устройства информацию. Возможны два способа организации программного обмена с внешними устройствами:
1) обмен с опросом готовности устройства.
Выполняя программу ввода-вывода, процессор, запустив в контроллере операцию, циклически читает регистр состояния контроллера. Он ожидает появления (в соответствующем разряде регистра состояния) признака готовности к обмену данными с процессором. При появлении этого признака в регистре состояния, процессор, с помощью команды OUT, осуществляет запись в регистр данных (при выводе на устройство), или выполняет чтение информации из регистра данных контроллера с помощью команды IN (при вводе с устройства). После чего запускает в контроллере следующую операцию в контроллере и т. д.;
2) обмен по запросам на обслуживание устройства (запросам на маскируемое прерывание).
При обслуживании внешних устройств через прерывания, процессор, выполняющий программу ввода-вывода, запускает в контроллере операцию и не ожидает готовности контролера к обмену данными. Он продолжает выполнять полезную программу. Контроллер внешнего устройства в случае полной готовности к обмену данными с процессором выдает на соответствующую линию IRQ сигнал запроса на обслуживание. Процессор, через выполнение процедуры прерывания по сигналу IRQ (в ее выполнении участвуют контроллер прерываний и контроллер шины), переходит на выполнение программы ввода/вывода для данного устройства. Эта программа осуществляет обмен данными через регистр данных контроллера и запускает в контроллере следующую операцию и т. д. Процессор возвращается к выполнению прерванной программы через выполнение команды IRET (возврат из прерывания, которой заканчивается программа ввода/вывода) и т. д.
Прерывания и исключения нарушают нормальный ход выполнения программы для обработки внешних событий или сообщения о возникновении особых условий или ошибок. Прерывания подразделяются на аппаратные (маскируемые и немаскируемые), вызываемые электрическими сигналами на входах процессора, и программные, выполняемые по команде INT хх. Программные прерывания процессором обрабатываются как разновидность исключений. Аппаратные прерывания подразделяются на маскируемые и немаскируемые. Процессор может воспринимать прерывания после выполнения каждой команды, длинные строковые команды имеют для восприятия прерываний специальные окна.
Маскируемые прерывания вызываются переходом в высокий уровень сигнала на входе INTR (Interrupt Request) при установленном флаге разрешения (IF=1). В этом случае процессор вырабатывает два следующих друг за другом (back to back) цикла подтверждения прерывания, в которых контроллером шины генерируются управляющие сигналы INТА# (Interrupt Acknowledge). Высокий уровень сигнала INTR должен сохраняться по крайней мере до подтверждения прерывания. Первый цикл подтверждения прерывания обеспечивает выполнение контроллером прерываний процедуры арбитража запросов на прерывание и формирование номера прерывания. По второму импульсу INТА# внешний контроллер прерываний передает по системной шине в процессор сформированный им номер прерывания, обслуживающего данный тип аппаратного прерывания. Прерывание с полученным номером вектора выполняется процессором так же, как и программное (свое текущее состояние (IP, CS, F) процессор сохраняет в стеке, из номера прерывания формирует АВП, читает из вектора прерывания программный адрес (IP:CS) первой исполняемой команды программы обслуживания прерывания, формирует из IP:CS физический адрес и читает команду по этому адресу). Обработка текущего прерывания может быть в свою очередь прервана немаскируемым прерыванием, а если программа-обработчик установит флаг IF, то и другим маскируемым аппаратным прерыванием.
Немаскируемые прерывания выполняются независимо от состояния флага IF по сигналу NMI (Non Mascable Interrupt). Вход NMI процессора асинхронный с запуском по фронту сигнала (переход от низкого уровня к высокому), который вызовет прерывание с типом (номером) 2. Немаскируемое прерывание выполняется так же, как и маскируемое. Его обработка не может прерываться под действием сигнала на входе NMI до выполнения команды IRET.
Исключения (Exceptions) подразделяются на отказы, ловушки и аварийные завершения. Отказ (fault) — это исключение, которое обнаруживается и обслуживается до выполнения инструкции, вызывающей ошибку. После обслуживания этого исключения управление возвращается снова на ту же инструкцию (включая все префиксы), которая вызвала отказ. Отказы, использующиеся в системе виртуальной памяти, позволяют, например, подкачать с диска в оперативную память затребованную страницу или сегмент. Ловушка (trap) — это исключение, которое обнаруживается и обслуживается после выполнения инструкции, его вызывающей. После обслуживания этого исключения управление возвращается на инструкцию, следующую за вызвавшей ловушку. К классу ловушек относятся и программные прерывания по командам INT xx. Аварийное завершение (abort) — это исключение, которое не позволяет точно установить инструкцию, его вызвавшую. Оно используется для сообщения о серьезной ошибке, такой как аппаратная ошибка или повреждение системных таблиц. Набор и обработка исключений реального и защищенного режимов различны. Под исключения Intel резервирует векторы 0-31 в таблице прерываний, однако в персональных компьютерах часть из них перекрывается системными прерываниями BIOS и DOS. Процедура, обслуживающая прерывание или исключение, определяется по таблице с помощью номера прерывания. Для программных прерываний номер задается командой (или во втором байте команды INT xx), а исключения генерируют и передают номер прерывания внутри процессора. Каждому номеру (0-255) прерывания или исключения в защищенном режиме соответствует элемент в таблице дескрипторов прерываний IDT (Interrupt Descriptor Table). В реальном режиме таблица прерываний содержит двойные слова — программные адреса обслуживающих процедур и после сброса располагается, начиная с нулевых адресов. Командой LIDT можно изменять ее положение в пределах первого мегабайта, а размер (03FFh) может быть уменьшен до 007Fh. При попытке обслуживания прерывания с номером, выходящим за заданный размер таблицы, генерируется исключение типа 8. В защищенном режиме таблица IDT содержит 8-байтные дескрипторы прерываний, может иметь размер от 32 до 256 дескрипторов и располагаться в любом месте физической памяти. Анализ условий обслуживания прерываний и исключений выполняется в следующем порядке (по убыванию приоритета):
- проверка на исключение (ловушка) отладки (типа 1) по выполненной ин струкции (пошаговый режим через флаг TF или точка останова по данным через регистры отладки);
- проверка на исключение (отказ) отладки (типа 1) по последующей инструкции (точка останова по инструкции через регистр отладки);
- немаскируемое прерывание (аппаратное по входу NMI);
- маскируемое прерывание (аппаратное по входу INTR при IF=l);
- проверка на исключение (отказ) сегментации (типа 11 или 13) при выборке следующей инструкции;
- проверка на исключение (отказ) страницы (типа 14) при выборке следующей инструкции;
- проверка на отказ декодирования следующей инструкции (типа 6 или 13);
- для операции WAIT проверка TS и МР (исключение 7, если TS=4 и МР=1);
- для операции ESCAPE (к мат. сопроцессору) проверка ЕМ и TS (исключение 7, если EM=l или TS=1);
- для операции WAIT или ESCAPE проверка на исключение 16 от сопроцессора;
- проверка на отказ сегментации (11, 12, 13) и страницы (14) для операндов, используемых в инструкции.
Двойной отказ (Double Fault) — исключение 8 — возникает, когда при обработке исключения, связанного с сегментацией (10, 11, 12 или 13), процессор обнаруживает исключение, отличное от отказа страницы (14). Также двойной отказ возникает, если при отработке исключения отказа страницы (типа 14) обнаруживается исключение другого типа. В этом случае тоже исполняется исключение 8. Если во время обслуживания исключения отказа страницы произойдет еще один отказ страницы, то происходит отключение (Shutdown) процессора. Во время отключения никакие новые инструкции не выполняются. Из этого состояния процессор можно вывести только аппаратно сигналом NMI, оставляя его в защищенном режиме, или сигналом RESET, переводящим процессор в реальный режим. Прерывания и исключения процессора, работающего в защищенном режиме, приведены в табл. 1. Исключения реального режима, отличающиеся от защищенного, приведены в табл. 2.
Таблица 1. Прерывания и исключения защищенного режима
Номер
Функция
Прерывания
Прерывание (interrupt) – событие, требующие немедленной реакции со стороны процессора. Реакция состоит в том, что процессор прерывает обработку текущей программы ( прерываемой программы ) и переходит к выполнению некоторой другой программы ( прерывающей программы ), специально предназначенной для данного события. По завершении этой программы процессор возвращается к выполнению прерванной программы.
Каждое событие, требующее прерывания, сопровождается сигналом прерывания , оповещающим об этом вычислительную машину, и называемым запросом прерывания .
Состояние программы представляет собой совокупность состояний всех запоминающих элементов в соответствующий момент времени (например, после выполнения последней команды). При возникновении прерывания микроконтроллер сохраняет в стеке содержимое счетчика команд и загружает в него адрес соответствующего вектора прерывания. Последней командой подпрограммы обработки прерывания должна быть команда, которая осуществляет возврат в основную программу и восстановление предварительно сохраненного счетчика команд. Во время выполнения обработчика прерывания некоторая информация может подвергнуться изменению. Поэтому при переходе к обработчику прерывания необходимо сохранить элементы, подвергающиеся изменению. Набор таких элементов представляет собой вектор состояния программы . При этом другая информация о состоянии ячеек памяти не существенна или может быть восстановлена программным путем.
Вектор начального состояния содержит всю необходимую информацию для начального запуска программы. Во многих случаях вектор начального состояния содержит только один элемент – начальный адрес запускаемой программы.
Вектор прерывания является вектором начального состояния прерывающей программы (обработчика) и содержит всю необходимую информацию для перехода к обработчику, в том числе его начальный адрес. Каждому типу прерываний соответствует свой вектор прерывания, который инициализирует выполнение соответствующего обработчика. Обычно векторы прерывания хранятся в специально выделенных фиксированных ячейках памяти с короткими адресами, представляющих собой таблицу векторов прерываний . Для перехода к соответствующей прерывающей программе процессор должен располагать вектором прерывания и адресом этого вектора. По этому адресу, как правило, находится команда безусловного перехода к подпрограмме обработки прерывания.
Как правило, управление запоминанием и возвратом возложено на обработчик прерывания. В этом случае обработчик состоит из трех частей – подготовительной ( пролог ) и заключительной ( эпилог ), обеспечивающих переключение программ, и собственно прерывающей программы, выполняющей затребованные запросом операции. Время реакции определяется как временной интервал от момента поступления запроса прерывания до начала выполнения прерывающей программы.
tp – время реакции системы на прерывание;
tз – время запоминания состояния прерываемой программы;
tппр – время собственно прерывающей программы;
tв – время восстановления состояния прерванной программы
При наличии нескольких источников запросов должен быть установлен определенный порядок обслуживания поступающих запросов, называемый приоритетными соотношениями или дисциплиной обслуживания . Совокупность всех возможных типов прерывания процессора представляет собой систему прерывания микроконтроллера. Дисциплина обслуживания определяет, какой из нескольких запросов, поступивших одновременно, подлежит обработке в первую очередь, и имеет ли право данный запрос прерывать тот или иной обработчик прерывания.
В случае если во время обработки прерывания поступает запрос на прерывание с более высоким уровнем приоритета, управление передается обработчику прерывания более высокого приоритета, при этом работа обработчика прерывания с более низким уровнем приоритета приостанавливается. Возникает вложенность прерываний . Максимальное число программ, которые могут приостанавливать друг друга называется глубиной прерываний .
Если запрос прерывания окажется не обслуженным к моменту прихода нового запроса от того же источника (того же приоритета), то возникает насыщение системы прерываний . При этом часть запросов прерывания будет утрачена, что для нормальной работы микроконтроллера недопустимо.
Характеристиками системы прерывания являются:
- общее количество запросов прерывания – количество источников запросов прерывания;
- тип представления прерывания – как правило, запрос прерывания представлен логическим уровнем сигнала;
- приоритет прерывания – определяет очередность обработки каждого запроса прерывания, чем выше приоритет, тем меньше задержка в исполнении прерывающей программы для него;
- время реакции – временной интервал между появлением запроса прерывания и началом выполнения прерывающей программы;
- задержка прерывания – определяется суммарным временем на запоминание и восстановление программы;
- глубина, обычно совпадает с числом уровней приоритетов в системе прерывания;
- насыщение системы прерывания;
- допустимые моменты прерывания программ (как правило, окончание выполнения следующей команды).
Маскирование прерываний используется для сообщения микроконтроллеру о необходимости реагировать на каждый тип прерывания или игнорировать его. Маска прерывания представляет двоичный код, разряды которого поставлены в соответствие источникам запроса прерываний. Единичный бит в двоичном коде сообщает микроконтроллеру о необходимости обработки прерываний такого типа. Нулевой бит напротив не позволяет микроконтроллеру переходить к обработке прерываний указанного типа.
Как правило, кроме маскирования прерываний, существует также бит глобального разрешения прерываний, нулевое значение которого отключает все обработчики прерываний (кроме аппаратного сброса и перехода к началу исполняемой программы).
Кроме двоичного кода маски прерываний существует также двоичный код флагов прерываний , который позволяет обработчику прерываний установить источник возникновения прерывания в случае если источников с указанным запросом в микроконтроллере несколько.
Назад
Точные и неточные прерывания
- все команды, предшествующие прерываемой, были полностью выполнены и корректно сохранили состояние процесса
- все команды, следующие за прерываемой, не были выполнены и ни коим образом не изменили состояние процесса
- прерываемая команда, в зависимости от типа прерывания, либо была полностью выполнена, либо не была выполнена вовсе
- Команда, выполнявшаяся в момент прихода внешнего прерывания, должна обновить состояние процесса перед тем, как оно будет сохранено. То же самое касается команды, вызвавшей программное прерывание. В обоих случаях РАВ будет указывать на команду, которая, не случись прерывания, должна была быть выполнена следующей. Она и будет выполнена сразу после возврата из обработчика прерывания
- Команда, вызвавшая исключение — «плохая» команда. Ее результаты, скорее всего, некорректны, поэтому она не должна обновлять состояние процесса. Вместо этого в РАВ сохраняется ее адрес, после чего вызывается обработчик прерывания, который попытается исправить ошибку. После возврата из обработчика эта команда будет выполнена повторно. Если она снова вызовет такое же исключение, значит ошибка неисправима и процессор сгенерирует фатальное прерывание
Программные прерывания и исключения могут быть точными или неточными. В некоторых случаях без точных исключений просто не обойтись — например, если в процессоре есть MMU (тогда, если случается промах TLB, управление передается соответствующему обработчику исключения, который программно добавляет нужную страницу в TLB, после чего должна быть возможность заново выполнить команду, вызвавшую промах).
В микроконтроллерах исключения могут быть неточными. Например, если команда сохранения вызвала исключение из-за ошибки памяти, то вместо того, чтобы пытаться как-то исправить ошибку и повторно выполнить эту команду, можно просто перезагрузить микроконтроллер и начать выполнять программу заново (то есть сделать то же самое, что делает сторожевой таймер, когда программа зависла).
В большинстве учебников по архитектуре компьютеров (включая классику типа PattersonPatterson) точные прерывания обходятся стороной. Кроме того, неточные прерывания не представляют никакого интереса. По-моему, это отличные причины продолжить рассказ именно про точные прерывания.
Точные прерывания в процессорах с последовательным выполнением команд
Для процессоров с последовательным выполнением команд реализация точных прерываний довольно проста, поэтому представляется логичным начать с нее. Поскольку в каждый момент времени выполняется только одна команда, то в момент обнаружения прерывания все команды, предшествующие прерываемой, уже выполнены, а последующие даже не начаты.
Таким образом, для реализации точных прерываний в таких процессорах достаточно убедиться, что прерываемая команда никогда не обновляет состояние процесса до тех пор, пока не станет ясно, вызвала она исключение или нет.
Место, где процессор должен определить, позволить ли команде обновить состояние процесса или нет, называется точкой фиксации результатов (commit point). Если процессор сохраняет результаты команды, то есть команда не вызвала исключение, то говорят, что эта команда зафиксирована (на сленге — закоммичена).
- Выборка команды из памяти
- Декодирование команды
- Исполнение команды
- Запись результатов в регистры и/или память
- ошибка памяти при выборке команды
- неизвестный код операции при декодировании
- деление на ноль при исполнении
- ошибка памяти при записи результатов
- нельзя фиксировать команду и разрешать ей записывать результаты в память до тех пор, пока не станет ясно, что команда не вызвала исключение
- нельзя узнать, что исключение не вызвано, не записав результаты в память (для этого нужно получить подтверждение от контроллера памяти, что запись произведена успешно)
Как можно догадаться, эту проблему довольно сложно решить, поэтому во многих процессорах для простоты реализованы «почти точные» прерывания, то есть точными сделаны все прерывания, кроме исключений, вызванных ошибками памяти при записи результатов. В этом случае точка фиксации результатов находится между третьим и четвертым этапами цикла команды.
Важно! Нужно помнить, что счетчик команд тоже должен обновляться строго после точки фиксации результатов. При этом он изменяется вне зависимости от того, зафиксирована команда или нет — в него записывается либо адрес следующей команды, либо вектор прерывания, либо РАВ.
АВС_Лек7_2013 / Система прерываний программ в ЭВМ
Важнейшая роль в реализации сложных режимов работы отводится системе прерывания программ.
Прерывание — это приостановка выполнения в процессоре программы с целью выполнения какой-то более важной или нужной в данный момент другой программы или процедуры, после завершения которой продолжается выполнение прерванной программы с момента ее прерывания. Прерывание позволяет компьютеру приостановить любое свое действие и временно переключиться на другое, как заранее запланированное, так и неожиданное, вызванное непредсказуемой ситуацией в работе машины или ее компонента. Каждое прерывание влечет за собой загрузку определенной программы, предназначенной для обработки возникшей ситуации — программы обработки прерывания.
Организация и управление прерываниями функционально во многом смыкается с управлением задачами. — одной из базовых функций операционных систем. Основой для управления процессом одновременного решения нескольких задач (равно как и управления прерываниями) являются процедуры:
- выбора очередной задачи или определения приоритета задачи;
- сохранения информации о статусе задачи при ее прерывании (формирование слова состояния программы);
- упреждения и устранения конфликтов между задачами (координации и синхронизации выполнения задач).
Последовательность действий процессора при реализации прерывания такова. При появлении запроса на прерывание, запланированное заранее или неожиданное, процессор, как правило, после завершения выполнения текущей команды программы анализирует допустимость (разрещенность и приоритетность) данного вида прерывания. Если оно разрешено, Процессор производит следующие Действия: запоминает в стековой памяти текущее состояние прерываемой программы (состояние некоторых регистров МПП, в частности, регистров FL, CS, IP, а в микропроцессорах МП80286 и выше — и слова состояния программы, хранящегося в другом регистре МПП); посылает источнику запроса на прерывание запрос о причине (коде) прерывания; □ анализирует код запрошенного прерывания (номер прерывания — Ni) и фор» мирует адрес ячейки (AV), хранящей вектор прерывания (вектор-адрес про граммы обработки прерывания) по формуле AV= 4Ni (векторы прерываний; занимают начальную 1024-байтовую область ОП с адресами ячеек от 00000 ■ до 00400h (шестнадцатеричный код) так, что адрес вектора вычисляется про етым умножением номера прерывания на четыре, так как CS и IP занимают по два байта каждый);
- считывает из ОП и записывает в регистры МПП (в регистры FL, CS, IP и т. д.) вектор прерывания и его атрибуты;
- сбрасывает (устанавливает в 0) флаги прерывания (IF) и трассировки (TF);
- выполняет программу обработки прерывания (которую иногда называют драйвером прерывания);
- после выполнения программы обработки прерывания возвращает из стековой памяти параметры прерванной программы в регистры МПП и восстанавливает процесс выполнения прерванной программы.
Видов (номеров) прерывания может быть всего 256, и, соответственно, векторов прерывания (адресов CS:IP программ обработки прерываний) в ОП насчитывается до 256. Классификация видов прерываний показана на рис. 17.2. Прикладные прерывания временно устанавливаются пользователем при многопрограммной работе МП для указания приоритета выполнения прикладных программ (при появлении необходимости выполнения более приоритетной программы текущая менее приоритетная программа прерывается). Псевдопрерывания служат для запоминания важных фиксированных адресов, которые могут быть использованы в программах, в частности, при условных и безусловных передачах управления (запоминание адресов передачи управления как векторов прерывания возможно благодаря аналогии выполнения прерывания и обращения к процедурам). Аппаратные прерывания инициируются при обращениях к МП со стороны внешних устройств (таймера, клавиатуры, дисководов, принтера и т. д.) с требованием уделить им внимание и выполнить совместно с ними те или иные процедуры. Прерывания от таймера, например, повторяются 18 раз в секунду, от клавиатуры — при каждом программно не запланированном нажатии некоторых клавиш и т. п. Аппаратные прерывания не координируются с работой программы и могут/быть весьма разнообразны. Для их систематизации и определения очередности выполнения при одновременном возникновении нескольких из них обычно используется контроллер прерываний. Программные прерывания — это обычные процедуры, которые вызывает текущая программа для выполнения предусмотренных в ней стандартных подпрограмм, чаще всего подпрограмм — служебных функций работы с внешними устройствами, то есть, фактически, программные прерывания ничего не прерывают. Они делятся на две большие группы, вызывающие служебные функции:
- базовой системы ввода-вывода — прерывания BIOS;
- операционной системы — прерывания DOS.
Программы обработки прерываний DOS, в отличие от программ обработки прерываний BIOS, не встроены в ПЗУ и для разных операционных систем могут быть разными. К программным прерываниям можно отнести также прерывания при пошаговом исполнении программы, при работе с контрольным остановом и т. д. Технические прерывания (или, иначе, прерывания от схем контроля) возникают при появлении отказов и сбоев в работе технических средств (аппаратуре) ПК. Большинство технических прерываний не маскируются, то есть они разрешаются всегда, а некоторые из них относятся к категории «аварийных» (например, отключение питания), и при их возникновении даже не запрашивается причина прерывания, а просто по возможности спасаются важные промежуточные результаты — записываются в безопасное место, в НЖМД, например. Логические прерывания возникают при появлении ошибок в выполняемых программах (деление на 0, потеря точности мантиссы, нарушение защиты памяти и т. п.). Многие из логических прерываний также относятся к категории немаскируемых. Прерывания обслуживаются базовой системой ввода-вывода — модулем расширения BIOS и модулем обработки прерываний DOS. BIOS и блок расширения BIOS имеют дело в основном с непланируемыми техническими и логическими прерываниями, пользовательскими прикладными прерываниями, а также со многими планируемыми прерываниями, обслуживающими систему ввода-вывода, детализированными и не’очень детализированными (прерывания, обслуживаемые BIOS, часто называют прерываниями нижнего уровня). Модуль обработки прерываний DOS обслуживает в большинстве планируемые прерывания, в том числе и прерывания системы ввода-вывода. Прерывания DOS часто называют прерываниями верхнего уровня, так как, с одной стороны, в этих прерываниях меньше учитываются технические особенности элементов ПК, с другой стороны, при обработке этих прерываний часто случаются обращения к программам прерываний системы BIOS. Большинство прерываний BIOS имеют близкие аналоги среди прерываний DOS. Следует сказать, что использование прерываний BIOS позволяет, как правило, более детально выполнять обращения к различным системным ресурсам ПК, к элементам информационных структур и их атрибутам. Однако прерывания DOS более просты в использовании при программировании. Поэтому начинающим программистам можно рекомендовать работать с прерываниями DOS, особенно с расширенными функциями DOS для работы с файлами. Схема организации приема запросов на прерывания показана на рис. 17.3. Для приема внешних прерываний имеются порты двух типов: NMI (None Masked Interrupt) для приема немаскируемых прерываний и INTR (Interrupt) — для приема прочих прерываний (INTR обычно используется для подсоединения контроллера прерываний). Если запрос на прерывание поступает по входу NMI, то прерывание не маскируется (имеет абсолютный приоритет) и сразу выполняется; по входу INTR прерывание разрешается, если в регистре флагов МПП флаг IF-1. Всего предусмотрено 256 типов (0-255) прерываний. Из них только первые пять жестко закреплены в МП, остальные используются системами BIOS и DOS:
- Тип 0 — прерывание возникает при делении на 0 или если частное от деления переполняет разрядную сетку МП.
- Тип 1 — в режиме «трассировка» (при TF = 1) после выполнения каждой команды программы происходит останов.
- Тип 2 — немаскируемое техническое прерывание.
□ Тип 3 — прерывание по команде INT, включенной в программу: останов и ото- бражение содержимого регистров МПП. оизо □ Тип 4 — прерывание по команде INTO, включенной в программу, но только если при выполнении предыдущей команды пр шло переполнение разрядной сетки.
- Типы 8-15 — аппаратные прерывания, инициируемые внешними устройствами, поступают на входы IRQ0-IRQ7 контроллера прерываний (вход IRQ0 имеет высший приоритет, и прерывание, поступившее по этому входу, обрабатывается первым; всего уровней приоритета 8 и вход IRQ7 имеет низший приоритет).
- Типы 16-31 — планируемые программные прерывания BIOS.
- Типы 32-255 — программные прерывания DOS (жестко задействовано около 10, а вообще в разных версиях DOS их разное количество).
Прерывания с 0 по 31 и прерывание 64 относятся к прерываниям нижнего уровня, обслуживаемым BIOS; прерывания, начиная с 32, являются прерываниями верхнего уровня (за исключением прерывания 64), причем прерывание 33 (21h) — это комплексное, чаще всего используемое в программах пользователя прерывание, имеющее около 100 разновидностей (служебных функций DOS). В некоторых типах прерываний BIOS и DOS имеется много разновидностей, иногда более 10. Так, прерывание 10 (Ah) включает в себя 15 разновидностей, прерывание 33 (21h) — около 100 разновидностей: в DOS 1.0 — 47, в DOS 2.0 — 88, в DOS 3.0 и выше — 99 разновидностей (вид действия в рамках каждого прерывания определяется содержимым регистра АН). В работе [10] приведен список прерываний нижнего и верхнего уровней, а также служебных функций DOS для наиболее часто используемого программистами прерывания 21h. Вопросы для самопроверки
- Дайте определения алгоритма и программы решения задачи.
- Сформулируйте основные необходимые свойства алгоритма и способы его записи.
- Назовите основные классы алгоритмических языков и разновидности трансляторов.
- Приведите и поясните типовой состав машинных команд и возможные их структуры.
- Рассмотрите программу расчета квадратов чисел, приведенную в учебнике, и сформулируйте основное ее функциональные особенности.
- Назовите виды и особенности адресации ячеек памяти в ПК.
- Назовите основные режимы работы компьютеров и дайте им краткую характеристику.
- Что такое прерывание работы программы и каково назначение прерываний?
9. Назовите и поясните основные виды прерываний.
- Как по номеру прерывания определить адрес программы его обработки?
- Укажите, последовательность действий машины при выполнении прерывания.
12. Подробно разберите функции стековой памяти, используемые при прерыва- ниях. http://do.gendocs.ru/docs/index-223844.htmlУпрощенная структурная схема PICОписание схемы Структура PIC включает в себя следующие байтные регистры: • IRR – регистр запросов прерываний — связан с внешними входами запросов (IRQ0 – IRQ7); • IMR – регистр маски запросов; • ISR – Interrupt Service Register – регистр обслуживаемых запросов; • ICW1-ICW3 – Initialization Control Word – управляющее слово инициализации (приказы инициализации); • OCW1-OCW3 — Operation Control Word – операционное управляющее слово (рабочие приказы); OCW1 = IMR Кроме регистров в состав PIC входят: блок управления и схема анализа приоритетов (арбитр). Назначением блока управления является выработка внутренних и внешних сигналов управления, с помощью которых осуществляются те или иные элементарные действия (микрооперации) внутри микросхемы. Например, запись байта из внешней шины данных в один из регистров контроллера. Сигналы CAS0-CAS2 используются для реализации каскадирования микросхемы. Входной сигнал CS (Chip Select – выбор кристалла) генерируется в том случае, если на внешней шине адреса (АВ) зафиксированы адреса, относящиеся к контроллеру прерываний. Программирование контроллера осуществляется по стандартным адресам портов ввода / вывода.
Прерывание в операционной системе
Прерыва́ние в операционной системе, сигнал , который информирует процессор о событии, требующем внештатной обработки. Сигнал прерывания заставляет процессор приостановить последовательное выполнение потока инструкций и передать управление в специальный код обработки прерывания – обработчик прерываний , который, как правило, входит в состав операционной системы .
Существуют два вида прерываний: а) синхронные, которые возникают вследствие выполнения текущей инструкции процессора: программные прерывания, разыменование некорректного указателя, деление на ноль; б) асинхронные, которые инициируются внешними источниками: прерывания от таймера, от ввода-вывода (от дисководов, клавиатуры, последовательного порта, мыши и т. д.).
Редакция информационных технологий
Опубликовано 23 августа 2022 г. в 09:06 (GMT+3). Последнее обновление 23 августа 2022 г. в 09:06 (GMT+3). Связаться с редакцией
Информация
Области знаний: Системное программирование, Архитектура и устройства ЭВМ
Прерывания и особые случаи
Прерывание — это изменение естественного порядка выполнения программы, которое связано с необходимостью реакции системы на работу внешних устройств, а также на ошибки и особые ситуации, возникшие при выполнении программы. При этом вызывается специальная программа — обработчик прерываний, специфическая для каждой возникшей ситуации, после выполнения которой возобновляется работа прерванной программы.
Механизм прерывания обеспечивается соответствующими аппаратно-программными средствами компьютера.
Классификация прерываний представлена на рис. 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 раз больше времени, чем вызов процедуры. Поэтому, если приоритет запроса высок, а программа обслуживания короткая, ее оформляют в виде процедуры.
Программирование микроконтроллеров. Прерывание
Многие новички слышали об этом, но понять, что это такое и с чем это едят и как это применять и зачем это нужно — незнают. А когда понимают, что это такое и как это нужно применять, то планка знаний и решений готовых реализаций поднимается на много выше.
Рассмотрим микроконтроллер от Атмел ATtiny13A, как самый простой и доступный. Среда разработки — CodeVisionAVR.
Если описать простым языком, то прерывание, это останов общего цикла программы по какому либо событию и выполнения после этого куска кода программы в рамках прерывания.
Из жизненной ситуации можно описать так:
Сидит офисный работник, выполняет определенную ежедневную задачу каждый день, например пишет отчеты, составляет графики — обычная рутинная работа. И тут звонит телефон — сработал сигнал прерывания для работника. Работник сразу откладывает в сторонку документы (микроконтроллер в это время подготавливается и сохраняет нужные данные и запоминает место остановки) и начинает разговаривать по телефону (микроконтроллер при этом выполняет подпрограмму, описанную в прерывании). Дальнейшие действия сотрудника зависят от самого разговора. Но в итоге он опять возвращается к выполнению своей рутинной ежедневной работы ( у микроконтроллера это выполнение основного цикла while(1)).
У микроконтроллера есть много разных прерываний. срабатывающих от разных условий. Когда есть много прерываний, то необходимы правила их выполнения при одновременном срабатывании условий их выполнения — приоритет. Если одновременно наступают события одновременно вызывающие разные прерывания, то выполняться начнет то, у которого выше приоритет — которое главнее. Приоритет прерываний описывается цифрой. Чем меньше число приоритета пррывания, тем приоритетней выполнение прерывания. По-английски это называется Interrupt Vectors — вектор прерываний.
Из жизненной ситуации можно описать так:
Сидит офисный работник, выполняет определенную ежедневную задачу каждый день, например пишет отчеты, составляет графики — обычная рутинная работа. И тут звонит телефон и заходит б** директор одновременно. У телефона приоритет прерывания равен 3, у директора единице. Телефон идет лесом — директор во внимании, выполняются его указания.
Сидит офисный работник, выполняет определенную ежедневную задачу каждый день, например пишет отчеты, составляет графики — обычная рутинная работа. И тут звонит телефон и заходит б** директор одновременно. По телефону звонит Путин — у телефона приоритет прерывания равен 0, у директора единице. Директор идет лесом или даже тайгой — Путин на проводе весь во внимании — работник выполняет его указания.
В даташите подробно описан принцип работы в режиме прерывания, что выполняется при входе в прерывание, что делается с регистрами и с памятью и за сколько тактов процессора.
Вектор прерываний описывается в таблице Interrupt Vectors, заодно опишем, что они значат:
Самое главное прерывание нулевое — RESET. Адрес его нулевой — вектор номер один. Источник прерывания — сброс микроконтроллера по ресету от входа RESET, от провала напряжения по питанию, если ативен фьюз Brown-out Reset и от срабатывания сторожевого таймера. Тут все и так понятно.
Вектор два: INT0 — прерывание по внешнему входу INT0. У ATTiny13 это пятая ножка PB0.
Ножку INT0 можно настроить на срабатывание на выполнение прерывания, насколько я помню, по фронту сигнала, по спаду или по изменению сигнала — и фронт и спад. Я, например, применяю это прерывание при необходимости выполнить точный подсчет длительности импульса для выполнения алгоритма деления или умножения частоты.
Вектор три: PCINT0 — прерывание по изменению состояния по входам PB0 — PB5( PCINT0 — PCINT5), короче говоря все ножки микроконтроллера при этом можно применить для выполнения этого прерывания. Один из моих любимых прерываний, использую его в основном для пробуждения из сна по изменению на входах, когда микроконтроллер спит.
Продолжение следует — допишу завтра.