Найти в Дзене
Будни инженера

Флаг глобального разрешения прерываний

В процессорах (и в микроконтроллерах, конечно) обычно имеется флаг глобального разрешения прерываний (ну или запрета - кому как нравится). С помощью этого флага можно разрешить или запретить ВСЕ прерывания. Запрет прерываний обычно используется для того, чтобы защитить от неожиданностей какие-то критические участки кода. Например, перед обработкой какого-то зависимого от времени процесса желательно запретить прерывания, иначе в случае возникновения прерывания на его обработку потребуется время, и этого времени может не хватить потом на завершение процесса (либо будут потеряны данные, которые поступили во время обработки прерывания). В микроконтроллерах AVR флаг глобального прерывания находится в 7-м разряде регистра статуса SREG: Это флаг называется I (первая буква слова Interrupt - прерывание). На состояние этого флага не влияют ни арифметические, ни логические операции. Для управления им имеются две особые команды (о них чуть позже). Если флаг I сброшен, то все прерывания в микроконт

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

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

В микроконтроллерах AVR флаг глобального прерывания находится в 7-м разряде регистра статуса SREG:

Это флаг называется I (первая буква слова Interrupt - прерывание). На состояние этого флага не влияют ни арифметические, ни логические операции. Для управления им имеются две особые команды (о них чуть позже). Если флаг I сброшен, то все прерывания в микроконтроллере запрещены (даже если отдельные прерывания разрешены соответствующими флагами). Если флаг установлен, то прерывания в целом разрешены. Хотя с помощью флагов, управляющих отдельными видами прерываний вы можете запретить какие-то из них.

Ну а теперь о командах:

  • Команда SEI (сокращение от SEt I) устанавливает флаг I
  • Команда CLI (сокращение от CLear I) сбрасывает флаг I

Никаких параметров у команд нет, так что использовать их просто:

CLI ; Запрещаем прерывания
;
; Здесь какой-то критический участок кода
;
SEI ; Разрешаем прерывания

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

Устанавливается этот флаг также автоматически (ну почти автоматически) командой RETI, которая выполняет возврат из подпрограммы. А поскольку обработчик прерывания - это подпрограмма, то по завершению его работы должна быть выполнена эта команда, которая за одним и установит обратно глобальный флаг прерываний.

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

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить…