Учебники

Встроенные системы — прерывания

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

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

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

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

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

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

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

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

Прерывает v / s Polling

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

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

Программа обработки прерываний

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

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

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

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

Прерывания Расположение ROM (Hex) Штырь
Прерывания Расположение ROM (HEX)
Серийный COM (RI и TI) 0023
Таймер 1 прерывает (TF1) 001B
Внешнее прерывание HW 1 (INT1) 0013 Р3,3 (13)
Внешнее прерывание HW 0 (INT0) 0003 P3.2 (12)
Таймер 0 (TF0) 000B
Сброс 0000 9
  • Когда активирован вывод сброса, 8051 переходит к адресу адреса 0000. Это сброс при включении питания.

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

  • Два аппаратных прерывания выделяются для аппаратных внешних прерываний. PIN-код 12 и ПИН № 13 в порту 3 предназначены для внешних аппаратных прерываний INT0 и INT1 соответственно. В таблице векторов прерываний в памяти расположены ячейки памяти 0003H и 0013H соответственно.

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

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

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

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

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

Шаги для выполнения прерывания

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Регистр разрешения прерываний

Е.А. ET2 ES ET1 EX1 ET0 EX0
  • EA — Глобальное включение / отключение.

  • Не определено.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

PT1 PX1 PT0 PX0

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

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

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

Запуск прерывания программным обеспечением

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