Микроконтроллеры для начинающих. Часть 57. Прерывания
Мы подошли к моменту, когда без изучения прерываний дальнейшее изучение микроконтроллеров будет делом сложным. Но и сами прерывания являются одной из самых сложных для изучения тем.
Поэтому соберитесь и запаситесь терпением. Прерываниям будет посвящено несколько статей, в которых мы рассмотрим и аппаратные, и программные вопросы. И, разумеется, особенности реализации прерываний в различных семействах микроконтроллеров.
Кроме того, будет полезно вспомнить статью » Микроконтроллеры для начинающих. Часть 2. Процессор микроконтроллера «. В ней показано, в частности, как формируется адрес команды, которую будет исполнять процессор. А так же статью » Микроконтроллеры для начинающих. Часть 3. Процессор микроконтроллера. Тактирование и синхронизация. «. Здесь показано, как организована совместная работа узлов процессора.
Что такое прерывания
Прежде всего, нам надо разобраться, что же такое прерывания. Собственно говоря ответ на этот вопрос кроется в самом термине. Прерывание действительно прерывает нормальное выполнение программы. А управление получает процедура обработки (обслуживания) прерывания, которую кратко называют ISR — Interrupt service routine.
Аппаратное прерывание
После завершения обработки прерывания выполнение программы продолжается как обычно, с того самого места, в котором прерывание возникло.
Очень похоже на вызов подпрограмм? Да, похоже. Но есть одно важнейшее отличие — программа не должна знать, что прерывание вообще возникало. Программа не должна зависеть от того, возникло прерывание, или нет. За исключением случаев, когда программист такую зависимость предусматривает в явном виде.
А это означает, что переход к обработке прерывания требует дополнительных действий, которые могут выполняться или аппаратно, или программно.
Программные прерывания, синхронные
В микроконтроллерах, тех, что мы рассматриваем, программные прерывания есть только в STM8. Это команда TRAP. Но в микроконтроллерах вообще, тем более, в микропроцессорах, может быть несколько различных программных прерываний.
Программные прерывания всегда синхронные. То есть, они возникают синхронно с ходом выполнения программы, всегда в одном и том же месте — при выполнении команды прерывания.
Программные прерывания можно рассматривать как простой вызов подпрограммы, но адрес этой подпрограммы всегда предопределен и изменить его нельзя. И нельзя передать такой подпрограмме параметры, иначе чем заранее предусмотренные программистом переменные, обычно, глобальные.
Поскольку программные прерывания вызываем мы сами, не требуется сохранение состояния (контекста) процессора. Но поведение конкретного процессора при обработке программных прерываний нужно искать в документации.
Мы не будем рассматривать программные прерывания в рамках данного цикла статей.
Аппаратные прерывания, асинхронные
Сегодня аппаратные прерывания есть в подавляющем большинстве микроконтроллеров. Но исключения все таки есть, например, линейка BaseLine микроконтроллеров PIC.
Урок 14. Прерывания в компьютере
Аппаратные прерывания всегда асинхронные. То есть, момент их возникновения никак не связан с выполнением программы. Может возникнуть вопрос, как так не связан, а, например, АЦП? Мы же сами запрашиваем преобразование, а значит, возникающее при завершении преобразования прерывание вызвано именно нами, синхронно.
Нет, совсем не синхронно и не нами. Да, мы сами запросили преобразование. Но сколько для преобразования потребуется времени мы не знаем, количество тактов преобразования может зависеть от многих параметров. Поэтому и прерывание все равно возникнет асинхронно.
Аппаратные прерывания могут быть вызваны и внутренними модулями микроконтроллера, и внешними цепями (через специальный вход INT). Кроме того, аппаратные прерывания могут возникать и при выполнении программы, команды. Например, деление на 0. И это тоже асинхронное прерывание.
Приоритеты прерываний
Некоторые аппаратные прерывания могут быть более важными, чем другие. Например, готовность байта полученного из канала связи более важна, чем нажатие кнопки. При этом говорят о приоритете прерываний.
Уровней приоритета может быть несколько. Но возможно и полное отсутствие деления на приоритеты. Если одновременно возникает несколько запросов прерывания, то обрабатываться они будут в порядке убывания приоритета. Реализуется приоретизация аппаратно.
Прерывание может возникнуть во время обработки другого прерывания. В этом случае говорят о вложенности прерываний.
Вложенные прерывания
Процедура обработки прерывания тоже может быть прервана новым прерыванием, но только если его приоритет выше, чем у обрабатываемого. То есть, мы получаем обработку прерывания внутри обработки другого прерывания. Это и есть вложенность.
В большинстве случаев с вложенными прерываниями проблем не возникает. После завершения обработчика более высокого приоритета управление вернется в прерванный обработчик.
Контроллер прерываний
Теперь становится понятным, что обработка прерываний не такой простой процесс. Запуск процедуры обработки прерывания, безусловно, будет процессор. Но вот разбираться с приоритетами, запретами (маскированием) прерываний, другой вспомогательной (но важной!) работой будет специальный модуль — контроллер прерываний. Этот контроллер может быть и очень простым, и очень сложным. И может быть выполнен как в виде модуля внутри микроконтроллера, так и быть внешней микросхемой.
И сегодня основное внимание я буду уделять именно контроллеру прерываний.
Контроллер прерываний
И начнем мы с самого простого случая. Сегодня он скорее гипотетический, но зато позволит начать разбираться с тем, что лежит в самой глубине процессов
Единственный источник прерываний
Сейчас мы будем рассматривать собственно процессор. Причем процессор имеющий единственный вход запроса прерывания.
Простейший контроллер прерываний с единственным источником, фиксированным адресом обработчика, без приоритетов. Иллюстрация моя
Я не стал показывать всю функциональную схему процессора. Она есть в статьях, ссылки на которые я дал ранее. Здесь же я показал только регистр адреса команды PC и дополнительные узлы, которые используются для обработки прерывания.
Но сначала о регистре PC. Как Вы уже знаете, этот регистр автоматически инкрементируется для перехода к следующей команде. Так же, в него можно загрузить адрес из команд перехода и вызова. Разумеется, этот регистр можно и прочитать.
Я показал, что запись и чтение регистра выполняется через ALU, подписав соответствующие цепи. Все остальные сигналы просто идут к/от других узлов процессора, которые нам сегодня не важны.
Триггер IE_TRIG отвечает за разрешение/запрет прохождения запроса прерывания в процессор. Он может быть частью регистра состояния процессора или частью иного регистра. В данном случае, если он установлен, прерывания разрешены, а если сброшен запрещены.
Триггер INT_TRIG отвечает за хранение запроса прерывания, так как я показал, что вход INT, собственно вывод на который поступает запрос из внешнего мира, является не потенциальным, а импульсным.
Как все это работает. Когда на вход INT поступает импульс запроса прерывания в INT_TRIG записывается 1 (триггер устанавливается). И это выполняется независимо от того, разрешены прерывания или нет. Если прерывания запрещены, то обработка просто будет отложена до момента разрешения. Триггер будет хранить запрос.
На вход процессора сигнал запроса прерывания IF попадет лишь в том случае, если триггер IE_TRIG будет установлен. То есть, если прерывания будут разрешены.
Теперь в игру вступает процессор. И первым делом он запрещает прерывания сбросив IE_TRIG. Теперь нам не важно состояние INT_TRIG поэтому сбрасывается и он. Заодно это позволяет зафиксировать запрос прерывания, который может придти во время обработки текущего прерывания. Далее, обязательно, сохраняет регистр PC.
Выполнив всю дополнительную работу, например, сохранив состояние процессора, процессор записывает в PC адрес процедуры обработки прерывания. Когда процедура обработки завершится она выполнит не команду RET (возврат), а специальную команду IRET (возврат из прерывания).
Теперь процессор снова выполняет всю дополнительную работу, например, восстанавливает состояние процессора. После чего можно восстановить регистр PC. Остается разрешить прерывания.
Теперь программа продолжит работать с того места, где ее выполнение было прервано.
В документации и книгах часто пишут, что восстанавливается состояние разрешения обработки прерываний. Это верно, но не совсем точно. Дело в том, что если уж мы попали в обработчик прерывания, значит прерывания точно были разрешены. И мы можем просто установить IE_TRIG без дополнительных раздумий.
А теперь начнем усложнять нашу задачу. Для начала увеличим количество источников прерывания, но оставим единственный обработчик.
Несколько источников прерываний, единственный обработчик
Ярким представителем такого подхода являются микроконтроллеры PIC, за исключением BaseLine и PIC18.
Контроллер прерываний для нескольких источников, но с единственным обработчиком.Без приоритетов. Цепи сброса триггеров INT_REG не показаны. Иллюстрация моя
Основное отличие здесь в замене INT_TRIG на INT_REG и появлении дополнительного регистра IE_REG. Кроме того, теперь у нас не IE_TRIG, а GIE_TRIG. Дело в том, что теперь он управляет глобальным разрешением/запретом прерываний. А вот запретить/разрешить конкретный источник мы можем через IE_REG.
В целом, обработка прерываний не изменилась. Автоматически сбрасывается GIE_TRIG, что запрещает все прерывания, глобально. IE_REG автоматически не изменяется, только программно, если это программист это предусмотрел.
А вот со сбросом INT_REG все сложнее и интереснее. Сбросить регистр целиком нельзя, можно только триггер соответствующий обрабатываемому запросу. Но как этот триггер найти? Ответ простой — никак.
Поэтому в подобных контроллерах запросы прерываний от источников не сбрасываются автоматически. Их обязательно нужно сбрасывать вручную.
А как мы можем найти источник запроса, вызвавшего прерывание? У нас ведь обработчик один на всех. Довольно просто — прочитав содержимое INT_REG и проанализировав его биты. Это позволит определить источник и вызвать соответствующую подпроцедуру обработки. Именно она потом и сбросит флаг запроса.
Кстати последовательность анализа битов INT_REG определяет и приоритетность прерывания. Такой вот дополнительный программный бонус. Считаете невозможным, так как прерывания запрещаются автоматически?
Возможно! Достаточно держать прерывания запрещенными глобально. При этом триггеры INT_REG будут фиксировать поступающие запросы. Теперь, разрешив в нужный момент прерывания (глобально) мы можем обработать их все сразу. В нужном нам порядке.
Безусловно, это далеко не универсальный метод. Но это и чистая теория, как может показаться. Дело в том, что несколько запросов (они же асинхронные!) могут придти одновременно. Кроме того, мы можем запрещать прерывания на время выполнения критических участков программы по необходимости. А после их разрешения получить как раз такую вот ситуацию.
Несколько источников, несколько обработчиков
Продолжаем усложнять нашу задачу. Давайте добавим отдельные обработчики для каждого источника прерывания. Это не так просто, как может показаться.
Но сначала нам надо вспомнить, что такое вектор прерывания. В своем первоначальном варианте вектором называлась ячейка памяти хранившая адрес обработчика. Содержимое этой ячейки загружалось в PC, что и приводило к переходу на обработчик. И мы могли спокойно изменять адрес обработчика, просто занеся его в вектор.
Однако, в микроконтроллерах (по крайней мере тех, что мы изучаем) вектор это просто определенный набор ячеек памяти команд на начало которого и передается управление. А программист размещает в векторе команду перехода на нужный обработчик.
Преобразовать номер прерывания (номер источника) в адрес перехода (вектора) достаточно легко. Например, можно сдвинуть номер вектора влево на два разряда и сбросить два младших разряда. И мы получим вектор позволяющий разместить 4 команды.
Фрагмент контроллера прерываний обеспечивающего для каждого источника свой обработчик. Иллюстрация моя
Я не стал показывать всю функциональную схему контроллера прерываний, для наглядности. Что у нас здесь добавилось? Во первых, шифратор, причем шифратор приоритетный, что бы корректно обрабатывать ситуацию с несколькими конкурирующими запросами прерываний. Во вторых, мультиплексор, который определяет источник адреса для занесения в регистр PC.
Источниками адресам могут быть адрес команды из ALU, для команд перехода, или адрес вектора из нашего контроллера прерываний.
Запрос прерывания из источника с помощью приоритетного шифратора превращается в номер прерывания. У нас 4 источника, поэтому достаточно 2 бит адреса. Но вектор должен вмещать более одной команды. Поэтому номер вектора мы помещаем в биты 3 и 2 адреса, а биты 1 и 0 сбрасываем, что и показано на иллюстрации.
Это позволяет нам разместить в каждом векторе до 4 команд, а адрес вектора (адрес первой команды) будет равен номеру прерывания умноженному на 4.
В остальном обработка прерываний не изменилась. Но теперь у нас появилась возможность автоматически сбрасывать соответствующий триггер в INT_REG, ведь мы теперь знаем его номер. Я не буду показывать, как это выполняется на функциональной схеме.
Контроллер прерываний с приоритетами
Приоритетный шифратор в предыдущем случае не означает, что у прерываний есть приоритет. Да, он позволяет выбрать из нескольких прерываний одно, с наименьшим номером (наибольшим приоритетом). Но это не делает возможным прервать текущий обработчик прерывания с меньшим приоритетом.
Причина проста, при возникновении прерывания у нас прерывания запрещаются глобально. Я не буду приводить иллюстрацию, она сложна для начинающих, я просто расскажу, как это работает.
Вводится дополнительный регистр, который хранит приоритет текущего обрабатываемого прерывания. Причем, в общем случае, приоритет не равен номеру прерывания. Например, прерывания могут быть сгруппированы по несколько штук в пределах одного приоритета.
Прерывания не запрещаются глобально. Прерывания запрещаются для приоритета текущего прерывания и меньших приоритетов. При поступлении нового запроса специальный компаратор сравнивает его приоритет с текущим (хранится в специальном регистре, как я говорил). Если приоритет нового запроса выше, он поступает в процессор, что приводит к прерыванию текущего обработчика.
Причем это простейший случай. Могут быть предусмотрены дополнительные режимы работы. Например, циклическая смена приоритетов. Причем и приоритетов в группе, и групп приоритетов.
Когда мы будет изучать реализацию контроллеров прерываний в конкретных семействам микроконтроллеров, мы вернемся к приоретизации.
Заключение
На сегодня все. Мы только начали изучать прерывания. Впереди нас ждет много интересного, и трудного. Но наши возможности использования микроконтроллеров значительно возрастут. Так что результат стоит затраченного времени и усилий.
Источник: dzen.ru
Тема: Обработка прерываний
Понятие прерывания. Последовательность действий при обработке прерываний. Классы прерываний. Рабочая область прерываний. Вектор прерывания.
Стандартные программы обработки прерываний. Приоритеты прерываний. Вложенные прерывания.
Прерывания, их назначение и типы. Механизм прерываний
Постановка проблемной ситуации (Если отключили электричество, то какого вида произойдет прерывание?)
Прерывания – механизм, позволяющий координировать параллельное функционирование отдельных устройств вычислительной системы и реагировать на особые состояния, возникающие при работе процессора. Это принудительная передача управления от выполняемой программы к системе (а через нее – к соответствующей программе обработки прерывания), происходящая при возникновении определенного события.
Идея прерываний была предложена в середине 50-х годов и можно без преувеличения сказать, что она внесла наиболее весомый вклад в развитие вычислительной техники.
Основная цель введения прерываний — реализация асинхронного режима работы и распараллеливание работы отдельных устройств вычислительного комплекса.
Механизм прерываний реализуется аппаратно-программными средствами. Структуры систем прерывания (в зависимости от аппаратной архитектуры) могут быть самыми разными, но все они имеют одну общую особенность — прерывание непременно влечет за собой изменение порядка выполнения команд процессором.
Механизм обработки прерываний независимо от архитектуры вычислительной системы включает следующие элементы Механизма обработки прерываний:
1. Установление факта прерывания (прием сигнала на прерывание) и идентификация прерывания (в операционных системах иногда осуществляется повторно, на шаге 4).
2. Запоминание состояния прерванного процесса. Состояние процесса определяется прежде всего значением счетчика команд (адресом следующей команды, который, например, вi80x86 определяется регистрамиCSиIP— указателем команды), содержимым регистров процессора и может включать также спецификацию режима (например, режим пользовательский или привилегированный) и другую информацию.
3. Управление аппаратно передается подпрограмме обработки прерывания. В простейшем случае в счетчик команд заносится начальный адрес подпрограммы обработки прерываний, а в соответствующие регистры — информация из слова состояния. В более развитых процессорах, например в том же i80286 и последующих 32-битовых микропроцессорах, начиная с i80386, осуществляется достаточно сложная процедура определения начального адреса соответствующей подпрограммы обработки прерывания и не менее сложная процедура инициализации рабочих регистров процессора.
4. Сохранение информации о прерванной программе, которую не удалось спасти на шаге 2 с помощью действий аппаратуры. В некоторых вычислительных системах предусматривается запоминание довольно большого объема информации о состоянии прерванного процесса.
5. Обработка прерывания. Эта работа может быть выполнена той же подпрограммой, которой было передано управление на шаге 3, но в ОС чаще всего она реализуется путем последующего вызова соответствующей подпрограммы.
6. Восстановление информации, относящейся к прерванному процессу (этап, обратный шагу 4).
7. Возврат в прерванную программу.
Шаги 1-3 реализуются аппаратно, а шаги 4-7 — программно.
На рис. 3 показано, что при возникновении запроса на прерывание естественный ход вычислений нарушается и управление передается программе обработки возникшего прерывания. При этом средствами аппаратуры сохраняется (как правило, с помощью механизмов стековой памяти) адрес той команды, с которой следует продолжить выполнение прерванной программы.
После выполнения программы обработки прерывания управление возвращается прерванной ранее программе посредством занесения в указатель команд сохраненного адреса команды. Однако такая схема используется только в самых простых программных средах. В мультипрограммных операционных системах обработка прерываний происходит по более сложным схемам.
Итак, главные функции механизма прерываний:
- распознавание или классификация прерываний;
- передача управления соответственно обработчику прерываний;
- корректное возвращение к прерванной программе.
Переход от прерываемой программы к обработчику и обратно должен выполняться как можно быстрей. Одним из быстрых методов является использование таблицы, содержащей перечень всех допустимых для компьютера прерываний и адреса соответствующих обработчиков. Для корректного возвращения к прерванной программе перед передачей управления обработчику прерываний содержимое регистров процессора запоминается либо в памяти с прямым доступом, либо в системном стеке — systemstack. Стек – среда для размещения данных для возврата из подпрограмм, а так же их аргументы и автоматические данные. Фраза «По принципу стека» означает: последним пришел, первым обслужен или первым пришел, последним обслужен. Вектор прерывания – специальная область памяти, где находится адрес прерывающейся программы. Пример: К компьютеру подключен холодильник. Когда холодильник захочет обратить на себя внимание процессора, он пошлет на одну из его ножек специальный сигнал прерывания, а потом пошлет число 179. Получив это число, процессор «заглядывает» в вектор прерываний и находит там адрес программы, обслуживающий холодильник. Он перейдёт по этому адресу и начнет работать с этой программой. Прерывания бывают: от мыши, от клавиатуры, от дисководов. По номеру прерывания процессор знает куда обратиться, чтоб найти адрес программы, обслуживающей данное устройство. Всякое устройство, внутреннее или внешнее, работает с процессором, используя одно из прерываний. Рис. 3. Обработка прерывания Прерывания, возникающие при работе вычислительной системы, можно разделить на два основных класса: внешние (их иногда называют асинхронными) и внутренние (синхронные). Внешние прерываниявызываются асинхронными событиями, которые происходят вне прерываемого процесса, например:
- прерывания от таймера;
- прерывания от внешних устройств (прерывания по вводу/выводу);
- прерывания по нарушению питания;
- прерывания с пульта оператора вычислительной системы;
- прерывания от другого процессора или другой вычислительной системы.
Внутренние прерываниявызываются событиями, которые связаны с работой процессора и являются синхронными с его операциями. Примерами являются следующие запросы на прерывания:
- при нарушении адресации (в адресной части выполняемой команды указан запрещенный или несуществующий адрес, обращение к отсутствующему сегменту или странице при организации механизмов виртуальной памяти);
- при наличии в поле кода операции незадействованной двоичной комбинации;
- при делении на нуль;
- при переполнении или исчезновении порядка;
- при обнаружении ошибок четности, ошибок в работе различных устройств аппаратуры средствами контроля.
Супервизор. – это супервизор операционной системы — ее центральный управляющий модуль Могут еще существовать прерывания при обращении к супервизору ОС— в некоторых компьютерах часть команд может использовать только ОС, а не пользователи. Соответственно в аппаратуре предусмотрены различные режимы работы, и пользовательские программы выполняются в режиме, в котором эти привилегированные команды не исполняются. При попытке использовать запрещенную команду, запрещенную в данном режиме, происходит внутреннее прерывание и управление передается супервизору ОС. К привилегированным командам относятся команды ОС и команды переключения режима работа центрального процессора. Наконец, существуют собственно программные прерывания.Эти прерывания происходят по соответствующей команде прерывания, то есть по этой команде процессор осуществляет практически те же действия, что и при обычных внутренних прерываниях. Данный механизм был специально введен для того, чтобы переключение на системные программные модули происходило не просто как переход в подпрограмму, а точно таким же образом, как и обычное прерывание. Этим обеспечивается автоматическое переключение процессора в привилегированный режим с возможностью исполнения любых команд. Сигналы, вызывающие прерывания, формируются вне процессора или в самом процессоре; они могут возникать одновременно. Выбор одного из них для обработки осуществляется на основе приоритетов, приписанных каждому типу прерывания. Диспетчеризация и приоретизация прерываний в ОС Приоритет– число, характеризующее степень привилегированности потока. Очевидно, что прерывания отсхем контроля процессорадолжны обладатьнаивысшимприоритетом (если аппаратура работает неправильно, то не имеет смысла продолжать обработку информации), а программные прерывания – низким приоритетом. На рис. 4 изображен обычный порядок (приоритеты) обработки прерываний в зависимости от типа прерываний. Учет приоритета может быть встроен в технические средства, а также определяться операционной системой, то есть кроме аппаратно реализованных приоритетов прерывания большинство вычислительных машин и комплексов допускают программно-аппаратное управление порядком обработки сигналов прерывания. Второй способ, дополняя первый, позволяет применять различные дисциплины обслуживания прерываний Рис. 4. Распределение прерываний по уровням приоритета Наличие сигнала прерывания не обязательно должно вызывать прерывание исполняющейся программы. Процессор может обладать средствами защиты от прерываний: отключение системы прерываний, маскирование (запрет) отдельных сигналов прерывания. Программное управление этими средствами (существуют специальные команда для управления работой системы прерываний) позволяет операционной системе регулировать обработку сигналов прерывания, заставляя процессор обрабатывать их сразу по приходу, откладывать их обработку на некоторое время или полностью игнорировать. Обычно операция прерывания выполняется только после завершения выполнения текущей команды. Т.к. сигналы прерывания возникают в произвольные моменты времени, то на момент прерывания может существовать несколько сигналов прерывания, которые могут быть обработаны только последовательно. Чтобы обработать сигналы прерывания в разумном порядке им (как уже отмечалось) присваиваются приоритеты. Сигнал с более высоким приоритетом обрабатывается в первую очередь, обработка остальных сигналов прерывания откладывается. Программное управление специальными регистрами маски (маскирование сигналов прерывания) позволяет реализовать различные дисциплины обслуживания:
- с относительными приоритетами,то есть обслуживание не прерывается даже при наличии запросов с более высокими приоритетами. После окончания обслуживания данного запроса обслуживается запрос с наивысшим приоритетом. Для организации такой дисциплины необходимо в программе обслуживания данного запроса наложить маски на все остальные сигналы прерывания или просто отключить систему прерываний;
- с абсолютными приоритетами,то есть всегда обслуживается прерывание с наивысшим приоритетом. Для реализации этого режима необходимо на время обработки прерывания замаскировать все запросы с более низким приоритетом. При этом возможно многоуровневое прерывание, то есть прерывание программ обработки прерываний. Число уровней прерывания в этом режиме изменяется и зависит от приоритета запроса;
- по принципу стека,или, как иногда говорят,по дисциплинеLCFS(lastcomeferstserved) – последним пришел – первым обслужен.
Механизм прерываний чаще всего поддерживает приоритезацию и маскирование прерываний. Приоритезация означает, что все источники прерываний делятся на классы и каждому классу назначается свой уровень приоритета запроса на прерывание. Приоритеты могут обслуживаться как относительные абсолютные. Обслуживание запросов прерываний по схеме с относительными приоритетами заключается в том, что при одновременном поступлении запросов прерываний из разных классов выбирается запрос, имеющий высший приоритет. Однако в дальнейшем при обслуживании этого запроса процедура обработки прерывания уже не откладывается даже в том случае, когда появляются более приоритетные запросы — решение о выборе нового запроса принимается только в момент завершения обслуживания очередного прерывания. Если же более приоритетным прерываниям разрешается приостанавливать работу процедур обслуживания менее приоритетных прерываний, то это означает, что работает схема приоритезации с абсолютными приоритетами. Если процессор (или компьютер, когда поддержка приоритезации прерываний вынесена во внешний по отношению к процессору блок) работает по схеме с абсолютными приоритетами, то он поддерживает в одном из своих внутренних регистров переменную, фиксирующую уровень приоритета обслуживаемого в данный момент прерывания. При поступлении запроса из определенного класса его приоритет сравнивается с текущим приоритетом процессора, и если приоритет запроса выше, то текущая процедура обработки прерываний вытесняется, а по завершении обслуживания нового прерывания происходит возврат к прерванной процедуре. Вектор прерывания. Процессор –> Шина –>Внешнее устройство. Процессору предоставляется информация об уровне приоритета прерывания на шине подключения внешних устройств. В случае векторных прерываний в процессор передается также информация о начальном адресе программы обработки возникшего прерывания — обработчика прерываний. Устройствам, которые используют векторные прерывания, назначается вектор прерываний. Он представляет собой электрический сигнал, выставляемый на соответствующие шины процессора и несущий в себе информацию об определенном, закрепленном за данным устройством номере, который идентифицирует соответствующий обработчик прерываний. Этот вектор может быть фиксированным, конфигурируемым (например, с использованием переключателей) или программируемым. Операционная система может предусматривать процедуру регистрации вектора обработки прерываний для определенного устройства, которая связывает некоторую подпрограмму обработки прерываний с определенным вектором. При получении сигнала запроса прерывания процессор выполняет специальный цикл подтверждения прерывания, в котором устройство должно идентифицировать себя. В течение этого цикла устройство отвечает, выставляя на шину вектор прерываний. Затем процессор использует этот вектор для нахождения обработчика данного прерывания. Процессор Pentiumподдерживает векторную схему прерываний, с помощью которой может быть вызвано 256 процедур обработки прерываний. Прерывания могут быть инициированы внешним сигналом (аппаратные прерывания), некорректным выполнением инструкции (исключения), а также специальной инструкциейINT(программные прерывания). Вектор прерываний, передаваемый в процессор, представляет собой целое число в диапазоне от 0 до 255, указывающее на одну из 256 программ обработки прерываний, адреса которых хранятся в таблице обработчиков прерываний
Источник: studfile.net
Что программа обработки прерываний что это
Прерывание (interrupt) – это сигнал, заставляющий ЭВМ менять обычный порядок выполнения команд процессором.
Возникновение подобных сигналов обусловлено такими событиями, как:
- завершение операций ввода-вывода.
- истечение заранее заданного интервала времени.
- попытка деления на нуль.
- сбой в работе аппаратного устройства и др.
- Обработчик прерываний – программа обработки прерывания, являющаяся частью ОС, предназначенная для выполнения ответных действий на условие, вызвавшее прерывание. Предположим, что в момент поступления сигнала прерывания от некоторого источника программа А находится в решении. В результате управление автоматически передается обработчику прерываний. После завершения обработки управление может быть снова передано в ту точку программы А, где ее выполнение было прервано.
Классификация прерываний
Классы прерываний
В зависимости от источника возникновения сигнала прерывания делятся на: Аппаратные (внешние, асинхронные) — события, которые исходят от внешних источников (например, периферийных устройств) и могут произойти в любой произвольный момент (принцип асинхронности): сигнал от таймера, сетевой карты или дискового накопителя, нажатие клавиш клавиатуры, движение мыши; Программные (внутренние) — инициируются исполнением специальной инструкции в коде программы. Программные прерывания как правило используются для обращения к функциям встроенного программного обеспечения (firmware), драйверов и операционной системы. вызываются искусственно с помощью соответствующей команды из программы (int), предназначены для выполнения некоторых действий операционной системы, являются синхронными.
Исключения (внутренние) — события в самом процессоре как результат нарушения каких-то условий при исполнении машинного кода: деление на ноль или переполнение, обращение к недопустимым адресам или недопустимый код операции; Вторая классификация – по местоположению источника возникновения запроса: Внутренние Внешние Типы внешних прерываний Внешние прерывания возникают по сигналу какого-нибудь внешнего устройства. Иногда желательно сделать систему нечувствительной ко всем или отдельным аппаратным прерываниям (т. е. от внешних устройств).
Для этого используют так называемое маскирование внешних прерываний. Внешние прерывания подразделяются на: не маскируемые (англ. Non maskable interrupt, NMI) — обрабатываются всегда, независимо от запретов на другие прерывания.
К примеру, такое прерывание может вызвать сбой в микросхеме памяти маскируемые — которые можно запрещать установкой соответствующих битов в регистре маскирования прерываний (в x86-процессорах — сбросом флага IF в регистре флагов); Не маскируемые прерывания (говорят, что оно одно, т. к. подается на вывод микропроцессора NMI) инициируют источники, требующие безотлагательного вмешательства со стороны микропроцессора. 6 Обработка прерываний Маскируемые прерывания генерируются контроллером прерываний по заявке определенных периферийных устройств.
Контроллер прерываний (выполнен в виде специальной микросхемы i8259A) поддерживает восемь уровней (линий) приоритета; к каждому уровню “привязано” одно периферийное устройство. Именно маскируемые прерывания часто называют аппаратными прерываниями. В реальном и защищенном режиме работы микропроцессора обработка прерываний осуществляется принципиально разными методами. Существуют два специальных внешних сигнала среди входных сигналов процессора, при помощи которых можно прервать выполнение текущей программы и тем самым переключить работу центрального процессора. Это сигналы NMI (no mask interrupt, не маскируемое прерывание) и INTR (interrupt request, запрос на прерывание).
Программные (внутренние)
Прерывания Программы могут сами вызывать прерывания с заданным номером. Для этого они используют команду INT. Это так называемые программные прерывания. Программные прерывания не являются асинхронными, так как вызываются из программы. Программные прерывания удобно использовать для организации доступа к отдельным, общим для всех программ функциям.
Например, функции операционной системы доступны прикладным программам именно через прерывания. При вызове этих модулей нет необходимости знать их текущий адрес в памяти. Прикладные программы и драйверы могут сами устанавливать свои обработчики прерываний для их последующего использования другими программами.
Для этого встраиваемые обработчики прерываний должны быть резидентными в памяти. Исключения (внутренние прерывания) Эти прерывания создаются цепями самого процессора при возникновении одной из специально оговоренных ситуаций.
Если процессор сталкивается с одной из таких сбойных ситуаций, то он выполняет процедуру прерывания, используя закрепленной за ней вектор прерывания , который известен процессору. Например : Прерывание 0 вырабатывается в случае переполнения при операции деления на 0 Аппаратные и программные средства системы прерываний Система прерываний — это совокупность программных и аппаратных средств, реализующих механизм прерываний.
К аппаратным средствам системы прерываний относятся: 9 Обработка прерываний выводы микропроцессора — на них формируются сигналы, извещающие микропроцессор либо о том, что некоторое внешнее устройство «просит уделить ему внимание» (INTR, заявка на прерывание), либо о том, что требуется безотлагательная обработка некоторого события или катастрофическая ошибка (NMI) INTR — вывод для входного сигнала запроса на прерывание, NMI — вывод для входного сигнала не маскируемого прерывания INTA — вывод для выходного сигнала подтверждения получения сигнала прерывания микропроцессором; программируемый контроллер прерываний 8259А (предназначен для фиксирования сигналов прерываний от восьми различных внешних устройств; он выполнен в виде микросхемы; именно он формирует номер вектора прерывания и выдает его шину данных); внешние устройства (таймер, клавиатура, магнитные диски и т. п.) К программным средствам системы прерываний реального режима относятся: таблица векторов прерываний. Занимает первый килобайт ОП (адреса 00000h-003FFh).
Она содержит адреса (векторы — «векторы», т. к. два значения для указания адреса) обработчиков прерываний и состоит из 256 (0..255) элементов по 4 байта каждый: — 2 байта — новое значение для регистра IP — 2 байта — новое значение для регистра CS. Расположение таблицы векторов прерываний в процессорах i80286 и старше определяется значением регистра IDTR.
Таблица векторов прерываний инициализируется при запуске системы, но в принципе может быть изменена и перемещена. Каждый вектор имеет свой номер и называется номером прерывания. два флага в регистре флагов flags/eflags: IF (Interrupt Flag) — флаг прерывания. Предназначен для маскирования (запрещения) аппаратных прерываний. Если IF=1, микропроцессор обрабатывает внешние прерывания, если = 0, то игнорирует; TF(Trace Flag) — флаг трассировки. Если он=1, то микропроцессор переходит в режим по командной работы. В этом режиме в микропроцессоре генерируется внутреннее прерывание с номером 1; машинные команды микропроцессора: int, into (прерывание по переполнению), iret, cli, sti
Приоритезация прерываний
До окончания обработки прерывания обычно устанавливается запрет на обработку этого типа прерывания, чтобы процессор не входил в цикл обработки одного прерывания. Приоритезация означает, что все источники прерываний делятся на классы и каждому классу назначается свой уровень приоритета запроса на прерывание.
Т.е. процессор может вести себя по разному при поступлении более приоритетного запроса. Приоритеты могут обслуживаться как относительные и абсолютные. Относительное обслуживание прерываний означает, что если во время обработки прерывания поступает более приоритетное прерывание, то это прерывание будет обработано только после завершения текущей процедуры обработки прерывания. Абсолютное обслуживание прерываний означает, что если во время обработки прерывания поступает более приоритетное прерывание, то текущая процедура обработки прерывания вытесняется, и процессор начинает выполнять обработку вновь поступившего 11 Обработка прерываний более приоритетного прерывания. После завершения этой процедуры процессор возвращается к выполнению вытесненной процедуры обработки прерывания.
Прерывание можно рассматривать как некоторое особое событие в системе, требующее моментальной реакции. Механизм прерываний отлично подходит для управления событиями в вычислительной системе. Система распознает прерывания и при их возникновении запускает процедуру, соответствующую номеру прерывания. Существуют зарезервированные для использования центральным процессором прерывания.
Источник: www.sites.google.com
Прерывания и особые случаи
Прерывание — это изменение естественного порядка выполнения программы, которое связано с необходимостью реакции системы на работу внешних устройств, а также на ошибки и особые ситуации, возникшие при выполнении программы. При этом вызывается специальная программа — обработчик прерываний, специфическая для каждой возникшей ситуации, после выполнения которой возобновляется работа прерванной программы.
Механизм прерывания обеспечивается соответствующими аппаратно-программными средствами компьютера.
Классификация прерываний представлена на рис. 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 раз больше времени, чем вызов процедуры. Поэтому, если приоритет запроса высок, а программа обслуживания короткая, ее оформляют в виде процедуры.
Источник: intuit.ru