Для чего нужны прерывания в программе

В моделях AVR с объемом FLASH ≤8 кбайт, для векторов отводится по 1 слову памяти программ, как раз для инструкций rjmp. Во всех остальных микроконтроллерах каждый вектор прерывания занимает уже 2 слова, а в качестве инструкции перехода используются jmp. Управление прерываниями производится индивидуально.

За разрешение каждого из них отвечают специальные разряды соответствующих РВВ, а о наступлении события микроконтроллер может судить по состоянию флагов прерывания (см. табл.5). Например, если прерывание по переполнению таймера-счетчика 2 разрешено (установлен бит TOIE2 из TIMSK), то при изменении содержимого счетного регистра TCNT2 c 0xFF на 0x00 в регистре TIFR аппаратно будет установлен флаг прерывания TOV2 и микроконтроллер вызовет подпрограмму по адресу 0x0004.

За общее управление прерываний у AVR отвечает флаг I из регистра SREG. При I=0 все прерывания, независимо от состояния битов разрешения, запрещены. При вызове обработчика прерывания адрес текущей команды в основной программе копируется в стек, как и при обычном вызове подпрограммы.

Лекция 11: Прерывания

Но вместе с этим микроконтроллер аппаратно сбрасывает на нуль флаг I и флаг, который явился источником прерывания. Обработчик должен заканчиваться командой возврата из прерывания reti. После ее выполнения адрес возврата восстанавливается в PC и при этом одновременно устанавливается флаг I. Ниже рассмотрен пример использования обработчика внешнего прерывания INT0.

.include «m8def.inc» ;подключение стандартного заголовочного файла .cseg ;начало секции кода с нулевого адреса .org 0 rjmp main ;вектор сброса rjmp service_INT0 ;вектор внешнего прерывания 0 . main: ldi R16,low(RAMEND) ;инициализируем указатель стека out SPL,R16 ldi R16,high(RAMEND) out SPH,R16 cbi PORTD,PD2 ;настраиваем на ввод линию 2 порта D (альтернативная sbi DDRD,PD2 ;функция INT0) и подключаем к ней внутренний резистор ldi R16,1«ISC01 ;задаем условием прерывания изменения out MCUCR,R16 ;состояния вывода INT0 с лог.1 на лог.0 ldi R16,1«INT0 ;разрешаем прерывание INT0 out GICR,R16 sei ;разрешаем прерывания глобально (I=1) . service_INT0: push R16 ;сохраняем в стеке R16 in R16,SREG push R16 ;сохраняем в стеке SREG . pop R16 ;восстанавливаем из стека SREG out SREG,R16 pop R16 ;восстанавливаем из стека R16 reti

Инструкция перехода, размещенная по нулевому адресу (вектор сброса у всех моделей AVR), передает управление на начало основной программы main, где и происходит инициализация микроконтроллера.

В качестве условия возникновения прерывания выбрано изменение состояния вывода INT0 с уровня лог.1 на лог.0 (момент нажатия кнопки). При возникновении указанного события произойдет вызов подпрограммы по адресу 0x0001 (вектор прерывания INT0) и, далее, обработчика service_INT0.

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

Урок 14. Прерывания в компьютере

В этом случае первым будет вызван тот обработчик, чей адрес в таблице векторов прерывания находится выше. Например, при возникновении запросов от АЦП (адрес 0x000E) и компаратора (адрес 0x0010), первым будет обработан запрос от АЦП. Таким образом, каждое прерывание у AVR имеет свой собственный неизменный приоритет, который зависит от его местоположением в таблице векторов.

Читайте также:
Игровая программа что это такое

Здесь возможны две проблемы. Во-первых, обработка отдельных прерываний может быть достаточно длительной процедурой и другие запросы окажутся отложенными на недопустимо большой срок. А во-вторых, прерывание с низким приоритетом может иметь намного большее значение для данного устройства. В обоих случаях можно выйти из положения, если допустить в программе вложенные прерывания. Для этого после сохранения контекста в обработчике прерывания нужно вручную установить флаг I командой sei:

service_INT0: push R16 ;сохраняем в стеке R16 in R16,SREG push R16 ;сохраняем в стеке SREG sei ;разрешаем прерывания во время обработчика . pop R16 ;восстанавливаем из стека SREG out SREG,R16 pop R16 ;восстанавливаем из стека R16 reti

Вложенные прерывания могут оказаться недопустимыми при малом размере стека. Перейти к следующей части: Порты ввода-вывода

Теги:

Котов Игорь Юрьевич Опубликована: 2012 г. 0

Вознаградить Я собрал 0 0

Источник: cxem.net

Для чего нужны прерывания в программе

�� � ��������

Теги статьи: Добавить тег

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

При этом, основная программа останавливается в совершенно произвольном месте (где ее застанет прерывание), и начинается выполнение подпрограммы-обработчика. По окончании работы обработчика, выполнение основной программы возобновляется с места останова. Это бывает очень полезно, если необходимо оперативно среагировать на какое-то внешнее событие.

Например, на нажатие кнопочки, на начало передачи данных… И т.д. и т.п. В AT90s2313 существует 11 событий, по которым можно установить прерывания (прерывание — дело добровольное, хочешь — ставишь, хочешь — не ставишь). Что это за события? Открываем даташит по микросхеме на стр.19 и смотрим табличку «Reset and interrupt vectors». Для ленивых привожу ее здесь:

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

  1. Reset — прерывание по сбросу (подача 0 на вывод микросхемы «Reset»; или включение питания; или по переполнению сторожевого таймера)
  2. INT_0 — первое внешнее прерывание (сигнал на вывод микросхемы «INT0»)
  3. INT_1 — второе внешнее прерывание (сигнал на «INT1»)
  4. Timer1_capt1 — прерывание защелки 1-го таймера
  5. Timer1_comp1 — прерывание компаратора 1-го таймера
  6. Timer1_OVF1 — по переполнению 1-го таймера
  7. Timer0_OVF0 — по переполнению 0-го таймера
  8. UART_RX — по окончанию приема пакета по протоколу UART
  9. UART_UDRE — по опустошению регистра данных UART
  10. UART_TX — по окончанию передачи пакета по UART
  11. ANA_COMP — прерывание аналогового компаратора

Если некоторые слова вам еще не знакомы — не отчаивайтесь, так и должно быть. Давайте лучше разбираться, что такое — Interrupt Vectors — Вектора Прерываний? А это ни что иное, как указатели на адрес ПЗУ, на который мы переходим в результате прерывания. Все векторы расположены в самом начале адресного пространства, и занимают первые 11 адресов ПЗУ (с $000 по $00A). Это прекрасно видно из таблицы.

То есть, если мы, скажем, хотим активизировать прерывание Timer1_comp1, то мы должны по адресу $004 поставить ссылку на подпрограмму — обработчик этого прерывания. А вообще, лучше расставить в начале программы ссылки на все прерывания. Давайте так и сделаем.

.cseg .org 0 rjmp Reset rjmp INT_0 rjmp INT_1 rjmp Timer1_capt1 rjmp Timer1_comp1 rjmp Timer1_OVF1 rjmp Timer0_OVF0 rjmp UART_RX rjmp UART_UDRE rjmp UART_TX rjmp ANA_COMP

Читайте также:
Для чего нужна программа лаунчер

Так как эти команды стоят в самом начале программы, значит они как раз таки будут расположены в ПЗУ по первым 11-ти адресам. Таким образом, при каждом прерывании, будет вызываться соответствующий обработчик.

Например: по прерыванию компаратора таймера 1 (Timer1_comp1), мы перескакиваем на адрес $004, то есть — на 5-ю строчку программы. В пятой строчке стоит безусловный переход на метку Timer1_comp1. Где-то ниже в программе, мы пишем обработчик этого прерывания и в его начале ставим эту метку. Вот так все несложно…

Ну а что делать с остальными прерываниями, которые не используются? Надо все равно прописать на них метки (иначе компилятор страшно выругается), но по этим меткам ничего не делать, а тут же выходить.

Кстати, чуть не забыл:

reti — Interrupt return — выход из обработчика прерывания

Reset: INT_0: INT_1: Timer1_capt1: Timer1_comp1: Timer1_OVF1: Timer0_OVF0: UART_RX: UART_UDRE: UART_TX: ANA_COMP: reti

Пусть вас не смущает, что столько меток стоят на одну команду: это не страшно, так можно делать. Нельзя ставить несколько ОДИНАКОВЫХ меток…

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

Ну вот. Теперь возвращаемся к нашим баранам. То есть — бегущим огонечкам.

Источник: www.radiokot.ru

Прерывания

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

Прерывания

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

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

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

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

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

Читайте также:
Что это за программа browserupdphenix exe

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

Время реакции на прерывание

tp – время реакции системы на прерывание;
tз – время запоминания состояния прерываемой программы;
tппр – время собственно прерывающей программы;
tв – время восстановления состояния прерванной программы

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

Глубина прерываний

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

Характеристиками системы прерывания являются:

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

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

Комментариев к записи: 1

Источник: prog-cpp.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru