Если происходит прерывание процессора, то

Обновлено: 25.06.2024

Прерывания — это сигналы, посылаемые центральному процессору внешними устройствами, обычно устройствами ввода-вывода. Они говорят процессору прекратить текущую деятельность и выполнить соответствующую часть операционной системы.

Существует три типа прерываний:

  1. Аппаратные прерывания генерируются аппаратными устройствами, чтобы сигнализировать о том, что им требуется некоторое внимание со стороны ОС. Возможно, они только что получили некоторые данные (например, нажатия клавиш на клавиатуре или данные с карты Ethernet); или они только что выполнили задачу, которую ранее запрашивала операционная система, например, перенос данных между жестким диском и памятью.
  2. Программные прерывания генерируются программами, когда они хотят запросить системный вызов для выполнения операционной системой.
  3. Ловушки генерируются самим ЦП, чтобы указать, что возникла какая-то ошибка или условие, для устранения которых требуется помощь операционной системы.

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

1.7.2. Режим выполнения ЦП¶

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

Бит режима: режим супервизора или пользователя

  • Режим супервизора
    • Может выполнять все машинные инструкции
    • Может ссылаться на все ячейки памяти
    • Может выполнять только подмножество инструкций
    • Может ссылаться только на подмножество ячеек памяти.

    1.7.3. Ответ процессора на прерывания¶

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

    ЦП полагаются на данные, содержащиеся в паре регистров, для правильной обработки прерываний. Один регистр содержит указатель на блок управления текущим запущенным процессом. Этот регистр устанавливается каждый раз, когда процесс загружается в память. Другой регистр содержит указатель на таблицу, содержащую указатели на инструкции ядра ОС для обработчиков прерываний и системных вызовов. Значение в этом регистре и содержимое таблицы устанавливаются при инициализации операционной системы во время загрузки.

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

    1. При использовании указателя на текущий блок управления процессом состояние и все значения регистров для процесса сохраняются для использования при последующем перезапуске процесса.
    2. Бит режима ЦП переключается в контрольный режим.
    3. С помощью указателя на таблицу обработчиков прерываний и вектора прерывания определяется местоположение исполняемого кода ядра. Вектор прерывания — это IRQ для аппаратных прерываний (считывается из регистра контроллера прерываний) и аргумент инструкции прерывания на ассемблере для программных прерываний.
    4. Обработка переключается на соответствующую часть ядра.

    ../_images/sys_call.jpg

    ЦП использует таблицу и вектор прерываний, чтобы найти ОС код для выполнения в ответ на прерывания. Здесь показано программное прерывание.

    ../_images/process_switching.jpg

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

    Давайте начнем с определения того, что такое переключение контекста. Когда происходит прерывание, процессор прекращает выполнение текущей программы. Затем управление передается специальной части кода, называемой обработчиком прерываний или подпрограммой обслуживания прерываний. Обработчик прерывания обработает прерывание и возобновит прерванную программу. Но задумывались ли вы когда-нибудь, как возобновляется первоначальная программа? Как ЦП узнает, с чего продолжить и какие значения вычислялись, когда это произошло? Это происходит с помощью переключения контекста, которое является важной частью обработки прерывания.

    Переключение контекста — это процесс сохранения и восстановления состояния (контекста) ЦП, чтобы можно было возобновить выполнение с той же точки в более позднее время. Когда он сгенерирован, процессор сохраняет свое состояние выполнения через переключатель контекста и начинает выполнение обработчика прерывания в векторе прерывания. В коммутаторе должно быть сохранено состояние первого процесса, чтобы, когда планировщик вернется к выполнению первого процесса, он мог восстановить это состояние и продолжить работу. Состояние процесса включает все регистры, которые может использовать процесс, включая программный счетчик (ПК).

    Сохранение и восстановление регистров

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

    Предположим, у нас есть функция INTR, которая вызывается при возникновении прерывания:

    Возможно, что значения некоторых регистров, используемых F(), также используются INTR(). Итак, если мы не сохраним их содержимое, они будут повреждены INTR(). Итак, мы делаем резервную копию регистров внутри функции прерывания (при входе в функцию прерывания) и восстанавливаем их при выходе из функции следующим образом:

    Примечание. Обычно ценность ПК сохраняется за базовым оборудованием, поэтому вы можете не беспокоиться об этом.

    Ширина стека памяти

    Рисунок 1. Стек памяти

    Теперь давайте рассмотрим пример, чтобы увидеть, как регистры будут сохраняться в памяти. Чтобы понять этот пример, давайте предположим, что у нас есть процессор, который поддерживает:

    • Регистры данных — R0, R1, R2
    • Адресные регистры — AR0
    • Инструкции, в которых первый операнд формирует операнд назначения. А остальные операнды образуют исходные операнды.

    Обратите внимание, что нам нужно сохранить те регистры, которые используются функцией прерывания. Давайте посмотрим на следующий пример для процедуры прерывания INTR():

    Сохранение и восстановление регистров выполняется, как показано ниже:

    Как вы можете видеть выше, поскольку мы знаем, какие регистры используются в процедуре прерывания, нам нужно сохранить только (значения) этих регистров. Лучшим (но неоптимальным) способом было бы слепое сохранение/восстановление всех физических регистров, так что в будущем, если программа обработки прерывания будет изменена, вам не нужно будет беспокоиться о дополнительном коде для сохранения/восстановления нового набора регистров, используемых в функция. Однако это может быть связано с требованиями.

    Прерывание – это сигнал процессору, посылаемый аппаратным или программным обеспечением, указывающий на событие, требующее немедленного внимания. Всякий раз, когда происходит прерывание, контроллер завершает выполнение текущей инструкции и запускает выполнение процедуры обслуживания прерываний (ISR) или обработчика прерываний. ISR сообщает процессору или контроллеру, что делать при возникновении прерывания. Прерывания могут быть как аппаратными, так и программными.

    Аппаратное прерывание

    Аппаратное прерывание – это электронный предупреждающий сигнал, отправляемый процессору внешним устройством, например контроллером диска или внешним периферийным устройством. Например, когда мы нажимаем клавишу на клавиатуре или перемещаем мышь, они вызывают аппаратные прерывания, которые заставляют процессор считывать нажатие клавиши или положение мыши.

    Программное прерывание

    Программное прерывание вызывается либо исключительным состоянием, либо специальной инструкцией в наборе инструкций, которая вызывает прерывание при выполнении процессором. Например, если арифметико-логическое устройство процессора запускает команду деления числа на ноль, это вызывает исключение деления на ноль, в результате чего компьютер прекращает вычисления или отображает сообщение об ошибке. Инструкции программного прерывания работают аналогично вызовам подпрограмм.

    Что такое опрос?

    Состояние непрерывного мониторинга называется опросом. Микроконтроллер продолжает проверять состояние других устройств; и при этом он не выполняет никаких других операций и тратит все свое время обработки на мониторинг. Эту проблему можно решить с помощью прерываний.

    В методе прерывания контроллер реагирует только тогда, когда происходит прерывание. Таким образом, контроллеру не требуется регулярно контролировать состояние (флаги, сигналы и т. д.) сопряженных и встроенных устройств.

    Прерывания и опрос

    Вот аналогия, которая отличает прерывание от опроса —

    Прерывание Опрос
    Прерывание похоже на лавочника. Если кому-то нужна услуга или продукт, он идет к нему и информирует его о своих потребностях. В случае прерываний, при получении флагов или сигналов, они уведомляют контроллер о необходимости их обслуживания. Метод опроса похож на продавца. Продавец ходит от двери к двери, прося купить товар или услугу. Точно так же контроллер отслеживает флаги или сигналы один за другим для всех устройств и предоставляет услуги любому компоненту, который нуждается в его обслуживании.

    Прерывание процедуры обслуживания

    Для каждого прерывания должна существовать процедура обслуживания прерывания (ISR) или обработчик прерывания. Когда происходит прерывание, микроконтроллер запускает программу обработки прерывания. Для каждого прерывания в памяти есть фиксированная ячейка, в которой хранится адрес его подпрограммы обслуживания прерывания, ISR. Таблица ячеек памяти, предназначенных для хранения адресов ISR, называется таблицей векторов прерываний.

    Выполнение программ

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

    Есть шесть прерываний, включая RESET в 8051.

    Когда контакт сброса активирован, 8051 переходит к ячейке адреса 0000. Это сброс при включении питания.

    Для таймеров отведено два прерывания: одно для таймера 0 и одно для таймера 1. Ячейки памяти — 000BH и 001BH соответственно в таблице векторов прерываний.

    Два прерывания зарезервированы для аппаратных внешних прерываний. Номер контакта 12 и контактный №. 13 в порту 3 предназначены для внешних аппаратных прерываний INT0 и INT1 соответственно. Ячейки памяти: 0003H и 0013H соответственно в таблице векторов прерываний.

    Последовательная связь имеет одно прерывание, которое относится как к приему, так и к передаче. Ячейка памяти 0023H принадлежит этому прерыванию.

    Этапы выполнения прерывания

    Когда прерывание становится активным, микроконтроллер выполняет следующие шаги:

    Микроконтроллер закрывает текущую выполняемую инструкцию и сохраняет адрес следующей инструкции (ПК) в стеке.

    Он также сохраняет текущее состояние всех прерываний внутри (т. е. не в стеке).

    Он переходит к ячейке памяти таблицы векторов прерываний, которая содержит адрес процедуры обслуживания прерываний.

    Микроконтроллер получает адрес ISR из таблицы векторов прерываний и переходит к нему. Он начинает выполнять подпрограмму обслуживания прерывания, то есть RETI (возврат из прерывания).

    После выполнения инструкции RETI микроконтроллер возвращается к тому месту, где он был прерван. Во-первых, он получает адрес счетчика программ (ПК) из стека, помещая верхние байты стека в ПК. Затем он начинает выполняться с этого адреса.

    Запуск по краю и запуск по уровню

    Модули прерывания бывают двух типов: по уровню и по фронту.

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

    Включение и отключение прерывания

    При сбросе все прерывания отключаются, даже если они активированы. Прерывания должны быть разрешены с помощью программного обеспечения, чтобы микроконтроллер мог реагировать на эти прерывания.

    Регистр IE (разрешение прерывания) отвечает за включение и отключение прерывания. IE — это регистр с побитовой адресацией.

    Прервать регистрацию включения

    EA — глобальное включение/отключение.

    - − Не определено.

    ET2 — включить прерывание таймера 2.

    ES — включить прерывание последовательного порта.

    ET1 — включить прерывание от таймера 1.

    EX1 — включить внешнее прерывание 1.

    ET0 — включить прерывание таймера 0.

    EX0 — включить внешнее прерывание 0.

    Чтобы включить прерывание, мы делаем следующие шаги:

    Бит D7 регистра IE (EA) должен иметь высокий уровень, чтобы остальные регистры вступили в силу.

    Если EA = 1, прерывания будут разрешены и будут обработаны, если соответствующие биты в IE имеют высокий уровень.Если EA = 0, никакие прерывания не будут реагировать, даже если связанные с ними контакты в регистре IE имеют высокий уровень.

    Приоритет прерывания в 8051

    Мы можем изменить приоритет прерывания, назначив более высокий приоритет любому из прерываний. Это достигается путем программирования регистра с именем IP (приоритет прерывания).

    На следующем рисунке показаны биты регистра IP. После сброса регистр IP содержит все 0. Чтобы дать более высокий приоритет любому из прерываний, мы делаем соответствующий бит в регистре IP высоким.

    < th>PX1
    - - - - PT1 PT0 PX0

    < td>PT1 тд>

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

    Что произойдет, если процессор 8051 выполняет ISR, относящуюся к прерыванию, а другое становится активным? В таких случаях прерывание с высоким приоритетом может прервать прерывание с низким приоритетом. Это известно как прерывание внутри прерывания. В 8051 прерывание с низким приоритетом может быть прервано прерыванием с высоким приоритетом, но не любым другим прерыванием с низким приоритетом.

    Инициирование прерывания программным обеспечением

    Иногда нам нужно протестировать ISR с помощью моделирования. Это можно сделать с помощью простых инструкций, чтобы установить высокий уровень прерывания и, таким образом, заставить 8051 перейти к таблице векторов прерываний. Например, установите бит IE равным 1 для таймера 1. Команда SETB TF1 будет прерывать 8051 во всем, что он делает, и заставит его перейти к таблице векторов прерываний.

    Прерывание — это сигнал, выдаваемый аппаратным или программным обеспечением, когда процесс или событие требуют немедленного внимания. Он предупреждает процессор о высокоприоритетном процессе, требующем прерывания текущего рабочего процесса. В устройствах ввода/вывода для этой цели выделена одна из линий управления шиной, которая называется Процедура обслуживания прерываний (ISR).

    Когда устройство инициирует прерывание, скажем, в процессе i, процессор сначала завершает выполнение инструкции i. Затем он загружает счетчик программ (ПК) адресом первой инструкции ISR. Перед загрузкой счетчика программ адресом адрес прерванной инструкции перемещается во временное место. Следовательно, после обработки прерывания процессор может продолжить процесс i+1.

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

    Аппаратные прерывания:

    При аппаратном прерывании все устройства подключаются к линии запроса прерывания. Для всех n устройств используется одна строка запроса. Чтобы запросить прерывание, устройство замыкает связанный с ним переключатель. Когда устройство запрашивает прерывание, значение INTR равно логическому ИЛИ запросов от отдельных устройств.

    Последовательность событий, связанных с обработкой IRQ:

    1. Устройства вызывают IRQ.
    2. Процессор прерывает выполняемую в данный момент программу.
    3. Устройству сообщается, что его запрос распознан, и устройство деактивирует сигнал запроса.
    4. Запрошенное действие выполнено.
    5. Прерывание разрешено, и прерванная программа возобновляется.

    Обработка нескольких устройств:

    1. Опрос: при опросе первое обнаруженное устройство с установленным битом IRQ — это устройство, которое должно быть обслужено первым. Соответствующий ISR призван обслуживать то же самое. Его легко реализовать, но на опрос бита IRQ всех устройств тратится много времени.
    2. Векторные прерывания. В векторных прерываниях устройство, запрашивающее прерывание, идентифицирует себя напрямую, отправляя процессору по шине специальный код. Это позволяет процессору идентифицировать устройство, сгенерировавшее прерывание. Специальный код может быть начальным адресом ISR или местом, где ISR находится в памяти и называется вектором прерывания.
    3. Вложенность прерываний: в этом методе устройство ввода-вывода организовано в структуру приоритетов.Следовательно, запрос на прерывание от устройства с более высоким приоритетом распознается, а запрос от устройства с более низким приоритетом - нет. Процессор принимает прерывания только от устройств/процессов, имеющих приоритет.

    Приоритет процессоров закодирован в нескольких битах PS (регистр состояния процесса). Его можно изменить программными инструкциями, которые записываются в PS. Процессор находится в контролируемом режиме только во время выполнения подпрограмм ОС. Он переключается в пользовательский режим перед выполнением прикладных программ.

    Читайте также:

    - IP.7 Не реализовано.
    - IP.6 Не реализовано.
    - IP.5 Не реализовано.
    - IP.4 Не реализовано.
    IP.3 Определяет уровень приоритета прерывания от Таймера 1.
    PX1 IP.2 Определяет уровень приоритета внешнего прерывания 1.
    PT0 IP.1 Определяет уровень приоритета прерывания от таймера 0.
    PX0 IP.0 Определяет уровень приоритета внешнего прерывания 0.