Работа № 6. СИСТЕМА ПРЕРЫВАНИЙ
Цель работы: изучение системы прерываний на примере прерывания по переполнению встроенного таймера-счётчика AVR-микроконтроллера.
ОСНОВНЫЕ СВЕДЕНИЯ
При работе реальной микропроцессорной системы в ней или вне её могут произойти события, требующие немедленной реакции. Такая реакция обеспечивается процедурой прерывания (interrupt), которая состоит в том, что выполнение текущей программы приостанавливается, запоминается состояние на момент прерывания, выполняется другая программа, после чего восстанавливается сохранённое до прерывания состояние процессора и продолжается выполнение прерванной программы. Сигнал, вызвавший прерывание текущей программы, называется запросом на прерывание (interrupt request – IRQ); источник этого сигнала – источником прерывания; последовательность действий, выполняемая по запросу на прерывание, – обслуживанием прерывания, а выполняемая по прерыванию программа – подпрограммой обработки прерывания (interrupt handler, interrupt routine).
Различают два типа источников прерывания – аппаратные и программные. Источниками аппаратных прерываний служат внешние и внутренние периферийные устройства. Запросом на прерывание от внешнего источника является активный сигнал на соответствующем выводе процессора; источник прерывания определяется по выводу, на котором появляется такой сигнал. К источникам программного прерывания относятся специальные команды прерываний (trap) – управляемые программные прерывания и особые условия (exception – исключение) – неуправляемые программные прерывания, являющиеся реакцией процессора на исключительную ситуацию, возникшую при выполнении некоторой команды (переполнение, деление на нуль и т. п.). Запросом на прерывание от программного источника является непосредственно команда прерывания или установка бита (битов), фиксирующих возникновение особого условия. Общее количество источников аппаратных и программных прерываний может быть различным – от единиц до нескольких десятков.
Процедура обслуживания прерываний по запросам от нескольких источников в различных процессорах выполняется по-разному. Тем не менее основные принципы реализации механизма прерываний являются общими. Управление процедурой прерываний осуществляется специальными устройствами в составе аппаратного обеспечения процессора (контроллерами, схемами управления и т. п.). Основными средствами управления прерываниями являются:
- векторы прерываний;
- приоритеты прерываний;
- операция маскирования прерываний;
- флаги прерываний.
В микроконтроллерах указанные средства управления прерываниями реализуются следующим образом.
Для управления прерываниями от N источников в адресном пространстве памяти программ выделяется специальная область из N ячеек памяти (или N блоков, состоящих из нескольких ячеек). В каждой из этих ячеек размещаются команды перехода к соответствующей подпрограмме обработки прерывания или (в случае блока из нескольких ячеек) непосредственно команды, которые необходимо выполнить по запросу на прерывание. Эти ячейки памяти (блоки) называются векторами прерываний (или просто векторами), адрес ячейки (первой ячейки каждого блока) – адресом вектора прерывания. Таким образом, каждому источнику прерывания ставится в соответствие свой адрес вектора прерывания. Совокупность N векторов образует таблицу векторов прерываний, которая обычно располагается начиная с нулевого адреса памяти программ.
Приоритеты прерываний (interrupt priority) определяют очерёдность обслуживания запросов на прерывания. Введение приоритетов необходимо, если возможно одновременное (в течение одного периода тактовой частоты) поступление запросов на прерывание от различных источников или поступление нового запроса на прерывание во время обслуживания прерывания по ранее поступившему запросу. Виды и структура приоритетов прерываний определяются архитектурой процессора. Наиболее простым способом задания приоритетов является последовательное присвоение значений приоритетов в таблице векторов прерываний от высшего к низшему. Высший приоритет всегда имеет аппаратный сброс; далее располагаются векторы прерываний от других источников.
Для того чтобы запретить обслуживание неиспользуемых прерываний, служит операция маскирования. В зависимости от возможности маскирования источники прерывания делятся на маскируемые (maskable), прерывания от которых могут разрешаться или запрещаться, и немаскируемые (nonmaskable), прерывания от которых не могут запрещаться. Маскирование может быть общим и индивидуальным. При общем (глобальном) маскировании все прерывания, кроме немаскируемых, запрещены независимо от их индивидуального маскирования. Индивидуальное маскирование позволяет запрещать (разрешать) прерывание от каждого источника отдельно.
Флаги прерываний представляют собой разряды специальных регистров, устанавливающиеся при поступлении запроса на прерывание от некоторого источника.
Процедура обслуживания прерывания может быть упрощённо представлена состоящей из следующих этапов:
- приёма запросов на прерывание;
- арбитража прерываний;
- выполнения подпрограммы обслуживания прерывания.
При приёме запроса на прерывание от немаскируемого источника сразу осуществляется переход к следующему этапу его обслуживания – арбитражу. Запрос на прерывание от маскируемого источника обрабатывается по более сложному алгоритму. При поступлении запроса устанавливается соответствующий флаг прерывания. Далее проверяется наличие общего маскирования прерываний. Если режим общего маскирования установлен, то запросы на прерывания от всех маскируемых источников игнорируются и продолжается выполнение текущей программы. Если режим общего маскирования не задан, то запрещение или разрешение данного прерывания определяется наличием (отсутствием) индивидуального маскирования. Если данное прерывание замаскировано, то запросы на прерывание от данного источника запрещены и продолжается выполнение текущей программы. В противном случае прерывания от данного источника разрешены и для него начинается следующий этап обслуживания – арбитраж.
Арбитраж прерываний служит для определения прерывания с наивысшим приоритетом из очереди поступивших запросов на прерывание. После арбитража начинается выполнение выбранного запроса на прерывание.
Выполнение прерывания состоит в переходе к подпрограмме обслуживания прерывания, её выполнении и возврате к выполнению текущей программы. Перед выполнением прерывания производится общее маскирование, т. е. запрещение всех прерываний, кроме немаскируемых, а также очищается флаг обслуживаемого прерывания. Собственно выполнение прерывания начинается с обращения к вектору прерывания обслуживаемого источника.
Обслуживаемое прерывание может быть прервано по запросам от источников, имеющих более высокий приоритет. Прерывания, для обслуживания которых прерывается выполнение подпрограммы обработки другого прерывания, называются вложенными. Процедура их обслуживания аналогична обслуживанию обычных прерываний; отличие состоит лишь в том, что прерывается выполнение не основной программы, а подпрограммы обработки прерывания от источника с более низким приоритетом.
В микропроцессорных системах механизм прерываний используется для обмена информацией с различными устройствами ввода-вывода. Такой способ обмена данными называется обменом по прерываниям. Типичными примерами запросов на прерывание являются запросы по готовности результата аналого-цифрового преобразования, готовности устройства к приёму (передаче) информации, переполнению некоторого регистра и т. п. Использование механизма прерываний позволяет значительно повысить производительность системы при работе с медленно действующими устройствами, обслуживание которых в таком случае занимает процессорное время только при их готовности к обмену.
В AVR-микроконтроллерах механизм прерываний реализуется следующим образом. Управление прерываниями осуществляется с помощью схемы прерываний (см. рис. 2). Область векторов прерываний размещается в начале памяти программ; каждый вектор состоит из одной ячейки. При необходимости область векторов прерываний может быть перемещена в другое место памяти программ. Прерывания с младшими адресами имеют бόльший уровень приоритета. Источниками всех прерываний являются аппаратные средства (внешние или внутренние); источники программных прерываний отсутствуют. Все источники прерываний являются маскируемыми. Общее маскирование осуществляется очисткой бита I глобального разрешения прерываний в регистре состояния SREG. Количество векторов прерываний в AVR-микроконтроллерах составляет от 3 до 35 в зависимости от типа. Например, в микроконтроллере ATmega8535 имеется 21 вектор прерывания: 3 от внешних источников и 18 от внутренней периферии.
Работа с внешними прерываниями осуществляется с помощью регистра управления GICR (General Interrupt Control Register) и регистра флагов GIFR (General Interrupt Flag Register), расположенных в адресном пространстве регистров ввода-вывода. Установка разряда 7 (INT1) регистра управления GICR разрешает внешнее прерывание INT1, установка разряда 6 (INT0) – внешнее прерывание INT0, установка разряда 5 (INT2) – внешнее прерывание INT2. Разряд 7 (INTF1) регистра флагов GIFR устанавливается при поступлении запроса на прерывание INT1, разряд 6 (INTF0) – запроса на прерывание INT0; разряд 5 (INTF2) – запроса на прерывание INT2. Очистка установленных флагов прерываний производится записью единиц в соответствующие разряды регистра GIFR.
Режим запуска внешних прерываний INT0 и INT1 задают разряды 0…3 (ISC00, ISC01, ISC10, ISC11) регистра управления MCUCR. Запись в разряды ISC00, ISC01 соответственно значений 0, 0 задаёт режим запуска внешнего прерывания INT0 по низкому уровню; 0, 1 – по отрицательному фронту; 1, 1 – по положительному фронту; значения 1, 0 не используются. Аналогично с помощью разрядов ISC10, ISC11 задаётся режим запуска внешнего прерывания INT1. Режим запуска внешнего прерывания INT2 задаётся разрядом 6 (ISC2) регистра управления и состояния MCUCSR: 0 – по отрицательному фронту; – по положительному фронту.
Для управления прерываниями от внутренних периферийных устройств в адресном пространстве регистров ввода-вывода также предусмотрены специальные регистры. Например, управление прерываниями по запросам от встроенных таймеров-счётчиков осуществляется с помощью регистра масок TIMSK (Timer/Counter Interrupt Mask Register) и регистра флагов TIFR (Timer/Counter Interrupt Flag Register). Кроме того, с каждым аппаратным устройством AVR-микроконтроллера ассоциированы управляющие регистры, расположенные в адресном пространстве регистров ввода-вывода. Например, управление встроенным 8-разрядным таймером-счётчиком T/C0 (Timer/Counter0) осуществляется с помощью регистра TCCR0 (Timer/Counter0 Control Register) и регистра и TCNT0 (Timer/Counter0). Разряды 0…2 (CS00, CS01,CS02) регистра TCCR0 задают режим работы таймера-счётчикаT/C0: при записи в разряды CS00, CS01,CS02 соответственно значений 0, 0, 0 таймер-счётчик остановлен; 1, 0,
0 – содержимое регистра TCNT0 инкрементируется на каждом такте тактового генератора; 0, 1, 0 – на каждом 8-м такте; 1, 1, 0 – на каждом 64-м такте; 0, 0,
1 – на каждом 256-м такте; 1, 0, 1 – на каждом 1024-м такте; значения 0, 1, 1 и 1, 1, 1 устанавливают режим подсчёта числа импульсов внешнего источника по отрицательному и положительному фронту соответственно. Таймер-счётчик T/C0 генерирует запрос на прерывание при переполнении регистра TCNT0.
В регистре масок TIMSK прерыванию при переполнении таймера-счётчика T/C0 соответствует разряд 1 (TOIE0); в регистре флагов TIFR – разряд 1 (TOV0). Установка разряда TOIE0 разрешает прерывание по переполнению регистраTCNT0; флаг TOIF0 устанавливается при поступлении запроса на прерывание по переполнению регистраTCNT0.
Пример программы с использованием прерываний приведён на рис. 26.
; область векторов прерываний
.org $0000