Вектор прерываний: Векторы сброса и прерываний — Студопедия

Содержание

Векторы сброса и прерываний — Студопедия

Лабораторная работа №5

Таймеры-счетчики. Прерывания. ШИМ.

Основные теоретические положения

Прерывания

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

Вектор прерывания — закреплённый за событием номер, который идентифицирует соответствующий обработчик прерываний. Векторы прерываний объединяются в таблицу векторов прерываний, содержащую адреса обработчиков прерываний. Местоположение таблицы зависит от типа и режима работы процессора.

Вектор прерываний ATMega32:

Полный перечень векторов представлен в Таблице. Перечень представляет также уровень приоритета для каждого прерывания. Прерывания с младшими адресами имеют больший уровень приоритета. RESET имеет наивысший уровень приоритета, следующим является INT0 — Запрос внешнего прерывания 0 и т.д.

Векторы сброса и прерываний

Vector No. Program Address Source Interrupt Definition
$0000 RESET Сброс по выводу и сторожевому таймеру (Hardware Pin and Watchdog Reset)
$0002 INT0 Запрос внешнего прерывания 0 (External Interrupt Request 0)
$0004 INT1 Запрос внешнего прерывания 1 (External Interrupt Request 1)
$0006 INT2 Запрос внешнего прерывания 2 (External Interrupt Request 2)
$0008 TIMER2 COMP Совпадение при сравнении таймера/счетчика 2 (Timer/Counter2 Compare Match)
$000A TIMER2 OVF Переполнение таймера/счетчика 2 (Timer/Counter2 Overflow)
$000C TIMER1 CAPT Захват таймера/счетчика 1 (Timer/Counter1 Capture Event)
$000E TIMER1 COMPA Совпадение A при сравнении таймера/счетчика 1 (Timer/Counter1 Compare Match A)
$0010 TIMER1 COMPB Совпадение B при сравнении таймера/счетчика 1 (Timer/Counter1 Compare Match B)
$0012 TIMER1 OVF Переполнение таймера/счетчика 1 (Timer/Counter1 Overflow)
$0014 TIMER0 COMP Совпадение при сравнении таймера/счетчика 0 (Timer/Counter0 Compare Match)
$0016 TIMER0 OVF Переполнение таймера/счетчика 0 (Timer/Counter0 Overflow)
$0018 SPI, STC Завершение пересылки SPI (SPI Ser ial Transfer Complete)
$001A UART, RXC Завершение приема UART (UART, Rx Complete)
$001C UART, UDRE Регистр данных UART пуст (UART Data Register Empty)
$001E UART, TXC Завершение передачи UART (UART, Tx Complete)
$0020 ADC Завершение ADC преобразования (ADC Conversion Complete)
$0022 EE READY Готовность EEPROM (EEPROM Ready)
$0024 ANALOG COMP Срабатывание аналогового компаратора (Analog Comparator)
$0026 TWI Двухпроводной последовательный интерфейс (Two-wire Serial Interface)
$0028 SPM_RDY Готовность памяти программ EEPROM (Store Program Memory Ready)

До окончания обработки прерывания устанавливается запрет на обработку прерывания.

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


Отметим, что регистр статуса SREG не обрабатывается аппаратными средствами AVR, ни для прерываний, ни для подпрограмм.

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



Вектор Прерывания. Местоположение / кто его устанавливает?



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

У меня есть какой-то вопрос, я искал его с трудом, но ответа пока нет.

Хранится ли вектор прерывания в RAM? и если он хранится в RAM, кто устанавливает его в ram? OS?

operating-system interrupt
Поделиться Источник Guillermo     16 ноября 2012 в 20:35

4 ответа


  • Когда использовать ворота прерывания или ворота ловушки?

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

  • Загрузчик LPC1114-опрос и пользовательское приложение-прерывания

    Keil UV4 Dev System, LPC1114 Запущенный загрузчик: 0x0000.0000-0x0000.2000, пользовательское приложение: 0x0000.2000-0x0000.6000 Вопрос — Как настроить загрузчик с помощью опроса и пользовательское приложение с помощью прерываний Я имел в виду NXP appnote 10995 и перенаправление прерываний,…



2

interrupt vector is the memory address of an interrupt handler

память является синонимом RAM, поэтому да, вектор прерывания хранится в RAM.If драйвер устройства хочет зарегистрировать функцию обработчика прерываний, вам нужно вызвать соответствующие вызовы OS(в случае linux это request_irqs), и это создаст запись в таблице векторов прерываний. Эта запись будет указывать на то, где бы ни находилась функция обработчика прерываний в memory/RAM. , именно OS несет ответственность за управление таблицей векторов прерываний.

Таким образом, всякий раз, когда происходит это конкретное прерывание, будет вызываться ваша функция обработчика прерываний.

Поделиться Harman     16 ноября 2012 в 20:49



2

Он находится в FLASH. Не в RAM. Регистры находятся в RAM. Причина RAM заключается в хранении всех данных. Но FLASH предназначен для хранения всей программы. И векторы прерываний генерируются компилятором.

Поделиться Yancen Li     03 декабря 2012 в 00:20



0

Это зависит от оборудования.

Если есть только один адрес, к которому CPU может перейти при прерывании, то будет ли это ROM или RAM, зависит от карты памяти, построенной системой вокруг CPU. То же самое для предопределенной таблицы векторов прерываний. Если CPU позволяет установить базовый адрес для таблицы прерываний, то это, очевидно, зависит от OS.

Вообще говоря, OS, который полностью загружается с диска, как Windows, очевидно, сохранит его в RAM.

OSes, которые частично или полностью хранятся в ROM, обычно сохраняют векторную таблицу в RAM, чтобы ее можно было изменить во время выполнения. В очень ограниченных и четко определенных системах, таких как 8-битный желудь MOS, это связано с тем, что программное обеспечение, возможно, захочет полностью контролировать аппаратное обеспечение-если память служит, то эта конкретная система имеет аппаратный вектор в ROM из — за основ карты памяти, но помещает туда подпрограмму, которая затем пропускает векторы через RAM. Так что это было очень обдуманное решение.

На относительно более просторных системах, таких как классический Mac OS, это связано с тем, что он позволяет исправлять ROM постфактум. Если ошибка обнаружена в конкретной подпрограмме прерывания после отправки машины, то может быть выпущено обновление OS, которое загрузит замену RAM для подпрограммы и просто изменит таблицу векторов. Это особенно полезно в Mac OS, потому что все вызовы в систему используют механизм ловушки, аналогичный прерыванию.

Поделиться Tommy     16 ноября 2012 в 20:52



-1

На PC в современных windows OS векторы прерываний хранятся в таблице дескрипторов прерываний (IDT). Вы можете узнать, где находится эта таблица, используя инструкцию LIDT (Таблица дескрипторов прерываний загрузки). Но вы не можете изменить там значение, если только вы не можете заставить свой код работать на нулевом уровне привилегий (кольцо o), и Microsoft и Intel сговорились сделать это почти невозможным в Windows, поскольку все инструкции, которые изменят регистр сегмента кода (CS) на кольцо 0, заблокированы для пользовательских программ. Вот почему WINTEL, как и Australopithicus, может оказаться тупиком в эволюционном плане (я надеюсь). По сути, PCs-это не более чем умный terminal; вы должны использовать их так же, как terminal на вашей собственной машине, чтобы выполнять работу REAL, например, управлять чем-то.

Поделиться VicC     19 ноября 2012 в 20:59


  • Intel 8259 PIC-подтверждение прерывания

    Предположим, что у нас есть система с CPU, которая полностью совместима с программируемым контроллером прерываний Intel 8259. Итак, этот CPU использует векторизованные прерывания, конечно. Когда происходит одно из восьми прерываний, PIC просто утверждает INTR провод, который подключен к CPU….

  • Почему программное обеспечение прерывает устанавливает линии прерывания процесса на высокое напряжение

    Я узнал, что всякий раз, когда происходит аппаратное прерывание, он устанавливает линию прерывания процессора на высокое напряжение(или низкое, зависит от архитектуры процессора), чтобы заставить cpu прекратить то, что он делал, и обслуживать запрос прерывания. Но почему то же самое происходит и в…


Похожие вопросы:


Windows Контекст Прерывания

Я занимаюсь разработкой драйверов под Windows (расширен с расширением в реальном времени RTX с нулевого интервала) Хотя я ничего не вижу в документации RTX, есть ли функция, с помощью которой можно…


Java Thread.interrupted и флаг прерывания

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


Векторных прерывания

В чем разница между векторными и невекторными прерываниями? Я думал, что все прерывания должны быть векторными прерываниями… В конце концов, не все прерывания имеют векторный номер и,…


Когда использовать ворота прерывания или ворота ловушки?

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


Загрузчик LPC1114-опрос и пользовательское приложение-прерывания

Keil UV4 Dev System, LPC1114 Запущенный загрузчик: 0x0000.0000-0x0000.2000, пользовательское приложение: 0x0000.2000-0x0000.6000 Вопрос — Как настроить загрузчик с помощью опроса и пользовательское…


Intel 8259 PIC-подтверждение прерывания

Предположим, что у нас есть система с CPU, которая полностью совместима с программируемым контроллером прерываний Intel 8259. Итак, этот CPU использует векторизованные прерывания, конечно. Когда…


Почему программное обеспечение прерывает устанавливает линии прерывания процесса на высокое напряжение

Я узнал, что всякий раз, когда происходит аппаратное прерывание, он устанавливает линию прерывания процессора на высокое напряжение(или низкое, зависит от архитектуры процессора), чтобы заставить…


Найдите свободный слот прерывания

Какой-то шутник (BIOS/DOS/TSR…) записал случайные данные в таблицу векторов прерываний. Я знаю это, потому что разборка сказала мне об этом. Обычно перед захватом вектора прерывания я проверяю,…


IRQ и вектор прерываний

В этом документе http:/ / retired.beyondlogic.org / serial/serial1. htm#30 , IRQ COM3 равен 4, а его вектор прерывания равен 0C. Но вектор прерывания int 0C зарезервирован для ошибки стека …. Это…


Вектор прерывания переопределения Atmel Studio

мне нужно переопределить вектор прерывания, автоматически сгенерированный из Студия Atmel. кто-нибудь может мне помочь ? Обновите код прерывания, сгенерированный студией Atmel. 00000000…

Прерывания | RadioLaba.ru — программирование микроконтроллеров PIC

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

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

В микроконтроллерах PIC16 имеется несколько источников прерываний:
• внешнее прерывание по входу RB0/INT
• прерывание по переполнению таймера TMR0
• прерывание по изменению уровня сигнала на входах порта

Прерывания от периферийных модулей:
• прерывание по переполнению таймера TMR1
• прерывание по переполнению таймера TMR2
• прерывание от модуля компараторов
• прерывание от приемо-передатчика USART
• прерывание от модуля сравнения-захвата CCP1
• прерывание от модуля сравнения-захвата CCP2
• прерывание по окончанию записи в EEPROM
• прерывание по окончанию преобразования АЦП
• прерывание от модуля последовательного порта MSSP (прерывание в режиме SPI, I2C)

В различных моделях микроконтроллеров реализовано разное количество источников прерываний, в зависимости от наличия тех или иных модулей. Наиболее часто используются (на моем опыте) следующие: внешнее прерывание по входу RB0/INT; прерывание по переполнению TMR0, TMR1; прерывание по изменению уровня сигнала на входах порта; реже прерывание от компараторов и по переполнению TMR2.

Каждое прерывание имеет собственный флаг (бит) состояния, при возникновении прерывания флаг устанавливается в 1 и происходит переход в обработчик прерываний. Флаги необходимо сбрасывать программно в подпрограмме обработки прерываний, если этого не сделать, то при выходе из подпрограммы произойдет повторный переход в обработчик. Прерывание для каждого источника можно разрешить или запретить. Регистры PIR1, PIR2 содержат флаги прерываний периферийных модулей, а биты для их разрешения находятся в регистрах PIE1, PIE2 (эти два регистра расположены в 1-ом банке памяти данных). В регистре INTCON содержатся биты разрешения и соответствующие флаги следующих прерываний: внешнее по входу RB0/INT, по переполнению TMR0, по изменению уровня сигнала на входах порта.

Также регистр INTCON содержит бит GIE глобального разрешения прерываний, и бит PEIE для разрешения прерываний от периферийных модулей. Если бит GIE сброшен, то запрещены все прерывания, если бит равен 1 разрешены все немаскированные прерывания, то есть те, для которых стоит разрешение в индивидуальном порядке. Кстати при переходе в обработчик, бит GIE сбрасывается аппаратно, а при возврате снова устанавливается. Перед разрешением какого-либо прерывания необходимо сбросить соответствующий флаг, иначе сразу же произойдет переход в обработчик, вообще флаги прерываний устанавливаются независимо от того разрешено прерывание или нет, флаги устанавливаются аппаратно по соответствующим событиям. После сброса микроконтроллера все индивидуальные прерывания запрещены, в том числе и глобальное.

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

В общем, алгоритм задействования прерываний выглядит следующим образом: сбрасываем флаг, разрешаем индивидуальное прерывание, если необходимо разрешаем прерывание периферийных модулей, разрешаем глобальное прерывание. В подпрограмме обработки прерываний обязательно сбрасываем флаг. Можно делать иначе, разрешить глобальное прерывание, затем сбросить флаг, и под конец разрешить индивидуальное прерывание, тут в принципе есть различные варианты, все зависит от требуемых условий и количества задействованных прерываний. Запрещать индивидуальные прерывания (а также периферию) можно в любое время, в том числе и внутри обработчика. Глобальное прерывание можно запретить только в основной программе, так как при выходе из обработчика бит GIE аппаратно устанавливается в 1.

Теперь расскажу про очень важный момент, это сохранение контекста при обработке прерываний. При переходе на подпрограмму обработки прерываний необходимо сохранять содержимое ключевых регистров, а при возврате восстанавливать. К таким регистрам относятся STATUS, FSR, PCLATH, а также аккумулятор W. Например, в основной программе мы записали число в аккумулятор W и собрались сложить его с каким-либо регистром, и тут возникает прерывание. В обработчике также для выполнения каких-либо операций может использоваться аккумулятор (почти всегда). После возврата из обработчика в аккумуляторе может лежать уже другое число, что приведет к неправильному результату в основной программе.

Биты регистра STATUS также могут использоваться в основной программе и в обработчике, для выполнения арифметических операций, сравнений и т.д. Соответственно при возврате из обработчика биты, которые опрашивались в основной программе, могут измениться, что также приведет к неправильному результату в основной программе. Кроме того регистр STATUS содержит биты переключения банков памяти данных, если их поменять в обработчике, то в основной программе это может привести к неправильной адресации регистров. Все это также касается регистров FSR и PCLATH.

Ниже представлен пример кода для сохранения содержимого важных регистров:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;начать выполнение программы с адреса 0000h goto Start ;переход на метку Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Подпрограмма обработки прерываний. ;Регистры W_TEMP, STATUS,TEMP, PCLATH,TEMP, FSR_osn, FSR_prer ;необходимо расположить в 0-м банке, в области где они будут ;доступны из всех банков, то есть в общем это последние 16 регистров 0 банка, ;с адресами 70h-7Fh, но может быть и по-другому, необходимо смотреть карту памяти. org 0004h ;начать выполнение подпрограммы с адреса 0004h movwf W_TEMP ;запись содержимого аккумулятора W в ;регистр W_TEMP swapf STATUS,W ;обменять местами полубайты регистра STATUS и ;с записью в W clrf STATUS ;очистка регистра STATUS, выбрать 0-й банк movwf STATUS_TEMP ;запись содержимого аккумулятора W в ;регистр W_TEMP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;в случае если размер кода превышает 2048 слов: movf PCLATH,W ;запись содержимого регистра PCLATH в movwf PCLATH,TEMP ;регистр PCLATH,TEMP clrf PCLATH ;очистка регистра PCLATH ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;при использовании косвенной адресации: movf FSR,W ;запись содержимого регистра FSR в movwf FSR_osn ;регистр FSR_osn movf FSR_prer,W ;запись содержимого регистра FSR_prer в movwf FSR ;регистр FSR ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; …………….. …………….. ;код программы обработки прерываний …………….. ;опрос флагов прерываний если задействовано …………….. ;несколько источников, выполнение различных …………….. ;задач …………….. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;при условии использования косвенной адресации: movf FSR,W ;запись содержимого регистра FSR в movwf FSR_prer ;регистр FSR_prer movf FSR_osn,W ;запись содержимого регистра FSR_osn в movwf FSR ;регистр FSR ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;при условии сохранения регистра PCLATH: movf PCLATH_TEMP,W ;восстановление содержимого регистра PCLATH movwf PCLATH ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; swapf STATUS_TEMP,W ;восстановление содержимого регистра STATUS movwf STATUS swapf W_TEMP,F ;восстановление содержимого аккумулятора W swapf W_TEMP,W retfie ;выход из подпрограммы прерывания ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основная программа Start …………….. ;тело основной программы …………….. …………….. end ;конец всей программы ;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

              org         0000h           ;начать выполнение программы с адреса 0000h

              goto        Start           ;переход на метку Start

          

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

;Регистры W_TEMP, STATUS,TEMP, PCLATH,TEMP, FSR_osn, FSR_prer

;необходимо расположить в 0-м банке, в области где они будут

;доступны из всех банков, то есть в общем это последние 16 регистров 0 банка,

;с адресами 70h-7Fh, но может быть и по-другому, необходимо смотреть карту памяти.

 

              org         0004h             ;начать выполнение подпрограммы с адреса 0004h

      

              movwf       W_TEMP            ;запись содержимого аккумулятора W в

                                            ;регистр W_TEMP

              swapf       STATUS,W          ;обменять местами полубайты регистра STATUS и

                                            ;с записью в W

              clrf        STATUS            ;очистка регистра STATUS, выбрать 0-й банк

              movwf       STATUS_TEMP       ;запись содержимого аккумулятора W в

                                            ;регистр W_TEMP

 

                                            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                                            ;в случае если размер кода превышает 2048 слов:

              movf        PCLATH,W          ;запись содержимого регистра PCLATH в

              movwf       PCLATH,TEMP       ;регистр PCLATH,TEMP

              clrf        PCLATH            ;очистка регистра PCLATH

                                            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

                                            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                                            ;при использовании косвенной адресации:

              movf        FSR,W             ;запись содержимого регистра FSR в

              movwf       FSR_osn           ;регистр FSR_osn

              movf        FSR_prer,W        ;запись содержимого регистра FSR_prer в

              movwf       FSR               ;регистр FSR

                                            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

          

              ……………..

              ……………..             ;код программы обработки прерываний    

              ……………..             ;опрос флагов прерываний если задействовано

              ……………..             ;несколько источников, выполнение различных

              ……………..             ;задач

              ……………..

 

                                            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                                            ;при условии использования косвенной адресации:

              movf        FSR,W             ;запись содержимого регистра FSR в

              movwf       FSR_prer          ;регистр FSR_prer

              movf        FSR_osn,W         ;запись содержимого регистра FSR_osn в

              movwf       FSR               ;регистр FSR

                                            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

                                            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                                            ;при условии сохранения регистра PCLATH:

              movf        PCLATH_TEMP,W     ;восстановление содержимого регистра PCLATH

              movwf       PCLATH            ;

                                            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

              swapf       STATUS_TEMP,W     ;восстановление содержимого регистра STATUS

              movwf       STATUS

 

              swapf       W_TEMP,F          ;восстановление содержимого аккумулятора W

              swapf       W_TEMP,W

 

              retfie                        ;выход из подпрограммы прерывания

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Основная программа

                                

            

Start         ……………..             ;тело основной программы    

              ……………..

              ……………..

 

              end                           ;конец всей программы

                                            ;

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

Если код превышает 2048 слов в памяти программ (это размер одной страницы, об организации памяти программ я писал в первой статье), необходимо также сохранить содержимое регистра PCLATH, после чего очистить его, в противном случае при использовании команд перехода CALL, GOTO внутри обработчика, мы перескочим на другие страницы памяти программ.

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

Далее восстанавливаем значения всех остальных регистров. Здесь может возникнуть вопрос, почему при сохранении и восстановлении аккумулятора W и регистра STATUS используется команда swapf? Можно же было воспользоваться командой movf, дело в том что, данная команда воздействует на биты регистра STATUS, что не желательно в данном случае. Команды swapf, movwf, bsf, bcf не воздействуют на биты регистра STATUS.

И снова напомню про банки памяти, при переходе в обработчик прерываний, содержимое аккумулятора W записывается во временный регистр W_TEMP, на этот момент неизвестно какой банк памяти выбран в регистре STATUS, например, в основной программе мы могли работать с регистрами 3-го банка на момент возникновения прерывания. Поэтому регистр W_TEMP должен быть определен во всех банках. После сохранения аккумулятора по вышеприведенному коду происходит очистка регистра STATUS, при этом выбирается 0-й банк памяти данных, соответственно остальные временные регистры STATUS_TEMP, PCLATH_TEMP, FSR_osn, FSR_prer, должны располагаться в 0-ом банке. Если мы работаем только в одном 0-ом банке, как было сказано выше, можно не очищать регистр STATUS, при этом все временные регистры должны располагаться в 0-ом банке. Разумеется, в самом обработчике прерываний после сохранения всех важных регистров, возможно, придется манипулировать банками памяти, смотря, как задумана программа и с какими регистрами придется работать. Вообще можно поступить проще, что я и советую, в большинстве микроконтроллеров последние 16 байт 0-го банка (по адресам 70h-7Fh) доступны из всех банков, поэтому все временные регистры можно смело расположить по этим адресам.

Требования к прерыванию VMQ — Windows drivers

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

  • Драйвер минипорта должен поддерживать MSI-X. Драйвер должен установить флаг NDIS_RECEIVE_FILTER_MSI_X_SUPPORTED в элементе суппортедкуеуепропертиес структуры NDIS_RECEIVE_FILTER_CAPABILITIES .

    Драйвер возвращает эту структуру в структуре NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES , которую драйвер использует при вызове функции ндисмсетминипортаттрибутес .

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

    Ндисжетрсспроцессоринформатион возвращает сведения о наборе процессоров, которые драйвер минипорта может использовать для RSS и VMQ. Эти сведения содержатся в структуре NDIS_RSS_PROCESSOR_INFO .

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

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

  • Драйвер минипорта должен поддерживать минимальное число векторов прерываний MSI-X, как указано в следующей таблице:

    Число очередей Минимальное число обязательных векторов прерываний MSI-X

    1 – 16

    1 – 16

    17 – 64

    16 – 32

    65 или более

    32 или более

  • Обработка прерываний (лекция 5) — презентация онлайн

    1. Обработка прерываний Лекция 5

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

    Прерывания – преднамеренное завершение
    текущей задачи и переход к следующей.
    Выполнение текущей программы прерывается
    и управление передаётся обработчику
    прерываний.

    3. Последовательность действий при обработке прерываний

    Обобщенно последовательность действий аппаратных и
    программных средств по обработке прерывания можно описать
    следующим образом:
    1) При возникновении сигнала (для аппаратных прерываний) или
    условия (для внутренних прерываний) прерывания происходит
    первичное аппаратное распознавание типа прерывания. Если
    прерывания данного типа в настоящий момент запрещены, то
    процессор продолжает поддерживать естественный ход выполнения
    команд. В противном случае в зависимости от поступившей в
    процессор информации происходит автоматический вызов
    процедуры обработки прерывания, адрес которой находится в
    специальной таблице операционной системы, размещаемой либо в
    регистрах процессора, либо в определенном месте оперативной
    памяти.
    Последовательность действий при
    обработке прерываний
    2) Автоматически сохраняется некоторая часть контекста
    прерванного потока, которая позволит ядру
    возобновить исполнение потока процесса после
    обработки прерывания. В это подмножество обычно
    включаются значения счетчика команд, слова
    состояния машины, хранящего признаки основных
    режимов работы процессора (пример такого слова —
    регистр EFLA6S в Intel Pentium), а также нескольких
    регистров общего назначения, которые требуются
    программе обработки прерывания.
    Последовательность действий при
    обработке прерываний
    3) Одновременно с загрузкой адреса процедуры
    обработки прерываний в счетчик команд может
    автоматически выполняться загрузка нового значения
    слова состояния машины (или другой системной
    структуры, например селектора кодового сегмента в
    процессоре Pentium), которое определяет режимы
    работы процессора при обработке прерывания, в том
    числе работу в привилегированном режиме
    Последовательность действий при
    обработке прерываний
    4) Временно запрещаются прерывания данного типа,
    чтобы не образовалась очередь вложенных друг в
    друга потоков одной и той же процедуры. Детали
    выполнения этой операции зависят от особенностей
    аппаратной платформы, например может
    использоваться механизм маскирования прерываний.
    Многие процессоры автоматически устанавливают
    признак запрета прерываний в начале цикла обработки
    прерывания, в противном случае это делает программа
    обработки прерываний.
    Последовательность действий при
    обработке прерываний
    5) После того как прерывание обработано ядром
    операционной системы, прерванный контекст
    восстанавливается и работа потока возобновляется с
    прерванного места. Часть контекста
    восстанавливается аппаратно по команде возврата из
    прерываний (например, адрес следующей команды и
    слово состояния машины), а часть — программным
    способом, с помощью явных команд извлечения
    данных из стека. При возврате из прерывания
    блокировка повторных прерываний данного типа
    снимается.

    8. Классы прерываний

    В зависимости от источника, прерывания
    делятся на три больших класса:
    внешние;
    внутренние;
    программные.

    9. Классы прерываний

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

    10. Классы прерываний

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

    12. Рабочая область прерываний

    13. Вектор прерывания

    Существуют два основных способа, с помощью
    которых шины выполняют прерывания:
    1.векторный (vectored)
    2.опрашиваемый (polled)
    В обоих способах процессору предоставляется
    информация об уровне приоритета прерывания на шине
    подключения внешних устройств. В случае векторных
    прерываний в процессор передается также информация
    о начальном адресе программы обработки возникшего
    прерывания — обработчика прерываний.
    Вектор прерывания
    Устройствам, которые используют векторные прерывания, назначается
    вектор прерываний. Он представляет собой электрический сигнал,
    выставляемый на соответствующие шины процессора и несущий в себе
    информацию об определенном, закрепленном за данным устройством
    номере, который идентифицирует соответствующий обработчик
    прерываний. Этот вектор может быть фиксированным, конфигурируемым
    (например, с использованием переключателей) или программируемым.
    Операционная система может предусматривать процедуру регистрации
    вектора обработки прерываний для определенного устройства, которая
    связывает некоторую подпрограмму обработки прерываний с
    определенным вектором. При получении сигнала запроса прерывания
    процессор выполняет специальный цикл подтверждения прерывания, в
    котором устройство должно идентифицировать себя. В течение этого
    цикла устройство отвечает, выставляя на шину вектор прерываний. Затем
    процессор использует этот вектор для нахождения обработчика данного
    прерывания.

    15. Вектор прерывания

    Механизм прерываний некоторой аппаратной платформы
    может сочетать векторный и опрашиваемый типы прерываний.
    Типичным примером такой реализации является платформа
    персональных компьютеров на основе процессоров Intel
    Pentium. Шины PCI, ISA, EISA или MCA, используемые в этой
    платформе в качестве шин подключения внешних устройств,
    поддерживают механизм опрашиваемых прерываний.
    Контроллеры периферийных устройств выставляют на шину не
    вектор, а сигнал запроса прерывания определенного уровня
    IRQ. Однако в процессоре Pentium система прерываний
    является векторной. Вектор прерываний в процессор Pentium
    поставляет контроллер прерываний, который отображает
    поступающий от шины сигнал IRQ на определенный номер
    вектора.
    Вектор прерывания
    Вектор прерываний, передаваемый в процессор, представляет собой
    целое число в диапазоне от 0 до 255, указывающее на одну из 256
    программ обработки прерываний, адреса которых хранятся в таблице
    обработчиков прерываний. В том случае, когда к каждой линии IRQ
    подключается только одно устройство, процедура обработки
    прерываний работает так, как если бы система прерываний была
    чисто векторной, то есть процедура не выполняет никаких
    дополнительных опросов для выяснения того, какое именно
    устройство запросило прерывание. Однако при совместном
    использовании одного уровня IRQ несколькими устройствами
    программа обработки прерываний должна работать в соответствии
    со схемой опрашиваемых прерываний, то есть дополнительно
    выполнить опрос всех устройств, подключенных к данному уровню
    IRQ.

    17. Стандартные программы обработки прерываний

    18. Приоритеты прерываний

    Прерываниям приписывается приоритет, с помощью которого они
    ранжируются по степени важности и срочности. О прерываниях, имеющих
    одинаковое значение приоритета, говорят, что они относятся к одному
    уровню приоритета прерываний.
    Прерывания обычно обрабатываются модулями операционной системы,
    так как действия, выполняемые по прерыванию, относятся к управлению
    разделяемыми ресурсами вычислительной системы — принтером, диском,
    таймером, процессором и т. п. Процедуры, вызываемые по прерываниям,
    обычно называют обработчиками прерываний, или процедурами
    обслуживания прерываний (Interrupt Service Routine, /57?). Аппаратные
    прерывания обрабатываются драйверами соответствующих внешних
    устройств, исключения — специальными модулями ядра, а программные
    прерывания — процедурами ОС, обслуживающими системные вызовы.
    Кроме этих модулей в операционной системе может находиться так
    называемый диспетчер прерываний, который координирует работу
    отдельных обработчиков прерываний.
    Приоритеты прерываний
    Все источники прерываний обычно делятся на несколько классов, причем
    каждому классу присваивается приоритет. В операционной системе
    выделяется программный модуль, который занимается диспетчеризацией
    обработчиков прерываний. Этот модуль в разных ОС называется по-разному,
    но для определенности будем его называть диспетчером прерываний.
    При возникновении прерывания диспетчер прерываний вызывается
    первым. Он запрещает ненадолго все прерывания, а затем выясняет
    причину прерывания. После этого диспетчер сравнивает назначенный
    данному источнику прерывания приоритет и сравнивает его с текущим
    приоритетом потока команд, выполняемого процессором. В этот момент
    времени процессор уже может выполнять инструкции другого обработчика
    прерываний, также имеющего некоторый приоритет. Если приоритет нового
    запроса выше текущего, то выполнение текущего обработчика
    приостанавливается и он помещается в соответствующую очередь
    обработчиков прерываний. В противном случае в очередь помещается
    обработчик нового запроса.

    20. Вложенные прерывания

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

    Лекция №9″Спящие» режимы центрального процессора — Лекции — Микропроцессорная техника


    Лекции — Микропроцессорная техника
    скачать (4640.4 kb.)

    Доступные файлы (14):


    содержание

    Лекция_09_Режимы энергосбережения.doc

    Лекция №9

    «Спящие» режимы центрального процессора

    Микроконтроллеры нередко применяются в приборах с питанием от аккуму­ляторов и батарей. В таких случаях особенно важно, чтобы потребление тока мик­роконтроллером было как можно меньшим. Микроконтроллеры семейства АVR изготовлены по технологии КМОП, и потому для их работы необходим ток не­большой силы. Благодаря выбору более низкого уровня питающего напряжения, потребление тока снижается еще больше. Если и этого недостаточно, то можно выбрать настолько низкую тактовую частоту, насколько позволяет прикладная за­дача, поскольку из-за токов перезарядки паразитных емкостей ток потребления КМОП-схем почти пропорционален тактовой частоте. В дополнение к перечисленным мерам, центральный процессор микроконтроллеров семейства АVR можно перевести в режим пониженного энергопотребления или «спящий режим» (Sleep Mode). В таком режиме потребление тока резко снижается.

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

    Таблица 9.1. Типичное потребление тока Icc центральным процессором модели АT90S 1200 для различных режимов работы


    Vcc

    Ф

    Icc/

    Активный


    Icc/

    Ждущий


    Icc/

    Пониженное потребление


    5 В

    12МГц

    9 мА

    2,4 мА

    0,75 мкА

    5 В

    2МГц

    4 мА

    1 мА

    0,75 мкА

    3,3 В

    6МГц

    2,5 мА

    0,7 мА

    0,1 мкА

    3,3 В

    2МГц

    1,8 мА

    0,4 мА

    0,1 мкА

    Для перевода микроконтроллера семейства АVR в один из режимов понижен­ного потребления энергии необходимо разряд SE (Sleep EnabIe) регистра управле­ния MCUCR установить в лог. 1, а затем выполнить команду sleep. Благодаря связи команды sleep с разрядом SE, центральный процессор не может быть не­преднамеренно переведен в режим пониженного энергопотребления.

    Когда во время режима пониженного энергопотребления происходит преры­вание, центральный процессор выходит из «спящего» режима, выполняет подпро­грамму обработки прерывания и продолжает выполнение программы с команды, следующей после команды sleep. Если во время режима пониженного энергопо­требления поступает сигнал сброса, то центральный процессор выходит из «спя­щего» режима и продолжает выполнение программы с команды, расположенной по адресу $000 области команд.

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

    Для микроконтроллеров семейства АVR может быть выбран один из двух «спящих» режимов:


    • в ждущем режиме (Idle Mode) работа центрального процессора приоста­навливается, но таймер/счетчик, сторожевой таймер, система прерываний и тактирования остаются активными. Благодаря этому, центральный процессор может быть возвращен в обычный режим работы с помощью стороже­вого таймера, таймера/счетчика или внешнего прерывания. Если нет необ­ходимости в том, чтобы выход из ждущего режима осуществлялся с помо­щью аналогового компаратора, то компаратор отключается посредством установки в лог. 1 разряда АСО регистра ACSR. Это еще более снижает потребление тока в ждущем режиме, как это показано в табл. 9.2.

    • В режиме пониженного энергопотребления (Power Down Mode) систем­ный осциллятор (а значит и весь микроконтроллер) находится в отключен­ном состоянии.


      Icc / Ждущий

      Ф

      Аналоговый компаратор

      Аналоговый компаратор

      включен

      отключен

      58

      12 МГц

      9мА

      2,9мА

      2,4мА

      58

      2МГц

      4мА

      1,5 мА

      1 мА

      3,38

      6МГц

      2,5 мА

      0,9 мА

      0,7 мА

      3,3 8

      2МГц

      1,8 мА

      0,5 мА

      0,4мА

      В табл. 9.3 показано потребление тока центральным процессором модели А T90S 1200 в режиме пониженного энергопотребления при активном и от­ключенном сторожевом таймере.

      Таблица 9.3. Типичное потребление тока lee центральным процессором модели AT90S1200 в режиме пониженного энергопотребления при активном и отключенном сторожевом таймере


      Vcc

      Icc / Пониженное потребление

      Icc / Пониженное потребление

      Сторожевой таймер включен

      Сторожевой таймер отключен

      58

      80 мкА

      0,75 мкА

      3,38

      18мкА

      0,1 мкА

      Выбор одного из «спящих» режимов осуществляется с помощью разряда SM регистра MCUCR. Если разряд SM установлен в лог. 1, то микроконтроллер пере­водится в режим пониженного энергопотребления последующей командой sleep, если же разряд SM сброшен в лог.

      Режимы энергосбережения нужны для того, чтобы экономить питание. Применять их следует при питании от автономного ис­точника — как правило, любой МК большую часть времени простаивает в ожидании событий. Например, процедура динамической индикации, повторяющаяся с частотой сотни герц, сама по себе выполняется всего за несколько десятков микросекунд, т. е. занимает сотые доли общего време­ни работы МК и даже меньше. Если считать, что в активном режиме МК по­требляет порядка 10-15 мА, то ввод его в режим энергосбережения в паузах между событиями позволяет снизить суммарное потребление до -100 мкА и повысить временной ресурс работы схемы в сотни раз.

      Но правильно организовать работу МК в режиме энергосбережения не так-то просто. Следует учитывать внешние соединения — один забытый в «нулевом состоянии» выход с подсоединенным подтягивающим резистором способен испортить всю картину. Переключение всех выводов на вход также может не дать нужного эффекта, если часть из них «висит в воздухе» — наводки будут переключать входную логику (если она не отключена) и тем самым повышать потребление. Отключение логики происходит автоматически при вводе в ре­жим энергосбережения, но не для всех контактов — остаются включенными, например, выводы внешних прерываний, если они разрешены в программе, а также некоторые другие, если они используются в режиме альтернативных функций. Следует также не забывать выключать аналоговый компаратор, ко­торый включен по умолчанию.

      Не имеет большого смысла заниматься энергосбережением, если у вас в схе­ме имеются другие элементы с большим потреблением, которые невозможно отключить. Большинство стан­дартных устройств, ориентированных на подключение к МК (EEPROM, часы, tlasll-карты, современные преобразователи уровня RS-232), автоматически (или по команде извне) устанавливаются в режим пониженного энергопо­требления, когда находятся в ожидании команд. Но могут быть и компонен­ты, для отключения которых приходится изобретать специальные способы.

      Нужно учитывать и нюансы внутренней работы МК. Скажем, когда вы посы­лаете байт через UART, то собственно передача после окончания операции записи в регистр данных начнет выполняться аппаратно, и может длиться порядка миллисекунды, в то время как GPU уже формально свободен для других операций.

      В различных моделях МК АVR имеется от 2-3 (семейства Classic и Tiny) до 5-6 (старшие Mega) режимов энергосбережения.

      Два базовых режима общие для всех моделей: Idle mode и Power Down mode. Отметим, что к режимам энергосбережения также относят стоящий несколько особняком специальный режим АDС Noise Reduction, который имеет иное назначение, и мы его рас­смотрим далее. При практическом использовании режимов энергосбере­жения следует учесть, что их нельзя вызывать из процедуры прерывания — только из основной программы.

      В МК АVR имеются следующие разновидности режимов энергосбережения.

      В Idle mode (режиме ожидания) останавливается GPU (а также устройство управления выборкой команд из памяти). Все периферийные устройства ­таймеры, АЦП, порты — продолжают функционировать. Поэтому значи­тельной экономии не получается: потребление снижается лишь на 30-50%. Очевидно, что режим Idle mode имеет смысл использовать тогда, когда общее по­требление устройства лимитируется именно МК, который при этом обяза­тельно должен находиться в состоянии постоянной готовности.

      Само по себе программирование режима энергосбережения — без учета всех отмеченных нюансов — очень простое.

      Некоторую сложность здесь пред­ставляет только выбор режима из-за того, что в разных моделях МК АVR управляющие биты SMx (в младших Tiny и в семействе Classic всего один та­кой бит SM, выбирающий между двумя режимами Idle и Power Down, в ос­тальных их больше) «разбросаны» по разным регистрам, и приходится смот­реть в описание, чтобы не ошибиться. В большинстве младших моделей Mega, а также в Tiny и Classic, эти биты находятся в регистре MCUCR – в том же, который отвечает и за внешние прерывания. Но вот, например в АTmega8515 (в отличие от сделанного на его же основе А Tmega8535, где также один ре­гистр MCUCR), три бита SM0..2 разбросаны по трем регистрам MSUCR, MCUCSR и IEMCUCR. Есть и другие варианты: в АTmega16 все эти биты также в одном ре­гистре MCUCR, но бит SM2 почему-то поменялся местами с битом разрешения slеер -режима SE.

      По умолчанию все биты установки ^ , сколько их есть (три SM0. . Он определяется установкой бита SM1 (либо SM, если бит уста­новки единственный) в единичное состояние. Удобен режим Standby (в тех МК, где он доступен), когда тактовый генератор продолжает работать, и по­тому для выхода из состояния «сна» требуется гораздо меньше времени ­всего шесть машинных циклов, в то время как выход из режима Power Down по времени аналогичен запуску МК после сброса.


      Скачать файл (4640.4 kb.)


      Как процессор находит код ядра после прерывания?

      Два других ответа (на момент написания) говорят о прерываниях и IDT. Это верно, однако, на современном процессоре Intel-esque существует не менее трех способов вызова ядра.

      Метод № 1: Прерывания.

      Это объяснено выше. Вы устанавливаете запись в таблице дескрипторов прерываний / векторе прерываний, а затем выполняете программное прерывание для входа в ядро.

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

      Способ № 2: вызов ворот.

      Шлюз вызова — это особый тип селектора сегмента. Цель вызова должна быть загружена в глобальную или локальную таблицу дескрипторов сегментов (GDT и LDT соответственно). Если затем выполнить инструкцию дальнего вызова с использованием шлюза вызова в качестве сегмента (смещение вызова игнорируется), это позволяет вам вызывать более привилегированный код. Ворота вызова чрезвычайно гибки; архитектура IA-32 имеет четыре уровня привилегий, а шлюзы вызовов позволяют вызывать любой уровень.

      Я не верю, что в Linux когда-либо использовались шлюзы вызовов, а в Windows 95 — нет. Службы ядра Win95 ( krnl386.exeи kernel.dll) фактически работали в пользовательском режиме (кольцо 3). Самый высокий уровень привилегий (кольцо 0) использовался только для драйверов и микроядра, которое выполняло только переключение процессов. Звонок в водителей был сделан с помощью ворот вызова. Это позволило старому 16-битному коду (которых было много!) Использовать драйверы Win95, просто используя стандартный дальний вызов, как они всегда это делали.

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

      Метод № 3: SYSCALL / SYSRET и SYSENTER / SYSEXIT

      Это два набора инструкций, независимо придуманных AMD и Intel, но по сути они делают то же самое. SYSCALL / SYSRET был первым и был только для AMD, SYSENTER / SYSEXIT был Intel, но AMD реализует его сейчас. Итак, я собираюсь описать SYSENTER / SYSEXIT.

      В отличие от шлюзов вызовов, SYSENTER может использоваться только для передачи на кольцо 0 и может быть переведен только в одно место. Однако его преимущество заключается в чрезвычайно низкой задержке, поскольку в отличие от вызова или прерывания он не затрагивает стек.

      Местоположение передачи устанавливается с использованием трех регистров, специфичных для модели: один для информации о сегменте, а другой — для указателя инструкций и указателя стека кода ядра. Поскольку ничто не «помещается» в стек, код пользовательского режима отвечает за указание ядру, куда возвращаться, путем передачи указателя инструкции возврата и указателя стека в регистрах. Ядро отвечает за восстановление указателя стека, а инструкция SYSEXIT восстанавливает указатель инструкции.

      Дополнительная информация об инструкциях SYSENTER и SYSEXIT.

      AVR: почему каждый вектор прерывания занимает два командных слова

      Размер блока векторной таблицы зависит от того, какой чип вы используете. Например, чипы ATTiny используют 2 байта (1 инструкция) для каждого вектора в таблице.

      Причина, по которой на более крупных процессорах разрешено использование нескольких инструкций, состоит в том, чтобы разрешить использование более крупных инструкций.

      Для AVR инструкция RJMP представляет собой 2-байтовую инструкцию для относительного перехода, однако она может получить доступ только к смещению +/-4 КБ из таблицы векторов.Это нормально для небольших процессоров с флэш-памятью менее 8 КБ, поскольку позволяет размещать ISR (процедуры обслуживания прерываний) в любом месте флэш-памяти. Однако для больших AVR, таких как флэш-память 32 КБ ATMega328, этого недостаточно (*).

      Чтобы получить доступ к полному пространству флэш-памяти, вам необходимо использовать инструкцию JMP . Это прямой переход, который позволяет вам получить доступ к флэш-памяти объемом до 4 МБ. Однако инструкция JMP на самом деле является 4-байтовой инструкцией. Чтобы использовать их в таблице векторов, вам нужно разрешить 2 командных слова для каждого вектора.И это только то, что они делают.

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

      Кроме того, вам не обязательно никуда прыгать. Представьте, что от вашего ISR не требуется ничего, кроме установки бита в регистре ввода-вывода. На AVR вы можете, если регистр находится в пределах диапазона, вы можете использовать инструкцию SBI или CBI , чтобы сделать это.Поскольку это не имеет побочных эффектов для флагов ALU, вы можете в таблице векторов из двух команд построить весь ISR (инструкция SBI , за которой следует инструкция RETI ) и сэкономить все накладные расходы на переход к ISR.


      (*) На самом деле можно, хотя и медленнее, использовать так называемые «батуты». В основном это случай размещения одной инструкции JMP во флэш-памяти в пределах смещения +/- 4k от векторной таблицы. Таблица векторов содержит инструкцию RJMP , которая переходит к ближайшей инструкции JMP , которая, в свою очередь, переходит в любое место во флэш-памяти.

      Руководство пользователя

      Cx51: Функции прерывания

      Главная  /  Руководство пользователя Cx51

      8051 и его производные предоставляют ряд аппаратных средств. прерывания, которые могут использоваться для подсчета, синхронизации, обнаружения внешних событий, а также отправки и получения данных с использованием последовательного интерфейса. Стандартные прерывания, имеющиеся в 8051/8052, перечислены в следующая таблица:

      Прерывание
      Номер
      Описание Адрес
      0 ВНЕШНИЙ ВНУТРЕННИЙ 0 0003ч
      1 ТАЙМЕР/СЧЕТЧИК 0 000Bh
      2 ВНЕШНИЙ ВНУТРЕННИЙ 1 0013ч
      3 ТАЙМЕР/СЧЕТЧИК 1 001Bh
      4 ПОСЛЕДОВАТЕЛЬНЫЙ ПОРТ 0023ч
      5 ТАЙМЕР/СЧЕТЧИК 2 (8052) 002Bh

      По мере того как поставщики 8051 создают новые детали, добавляются дополнительные прерывания. Компилятор Cx51 поддерживает функции прерывания для 32 прерываний (0-31). Используйте адрес вектора прерывания в следующей таблице, чтобы определить номер прерывания.

      Прерывание
      Номер
      Адрес
      0 0003ч
      1 000Bh
      2 0013ч
      3 001Bh
      4 0023ч
      5 002Bh
      6 0033ч
      7 003Bh
      8 0043ч
      9 004Bh
      10 0053ч
      11 005Bh
      12 0063ч
      13 006Bh
      14 0073ч
      15 007Bh
        
      Прерывание
      Номер
      Адрес
      16 0083ч
      17 008Bh
      18 0093ч
      19 009Bh
      20 00A3h
      21 00ABh
      22 00B3h
      23 00BBh
      24 00C3h
      25 00CBh
      26 00D3h
      27 00DBh
      28 00E3h
      29 00EBh
      30 00F3h
      31 00FBh

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

      беззнаковое прерывание;
      беззнаковая char секунда;
      
      void timer0 (void) прерывание 1 с использованием 2 {
        if (++interruptcnt == 4000) { /* считать до 4000 */
          второй++; /* второй счетчик */
          прерывание = 0; /* очистить счетчик целых чисел */
        }
      }
       

      Атрибут прерывания принимает в качестве аргумента целое число константа в диапазоне значений от 0 до 31. Выражения с операторами и атрибут прерывания не разрешен в функции прототипы.Атрибут прерывания влияет на объектный код функция следующая:

      • При необходимости содержимое ACC , B , DPH , DPL и PSW сохраняются в стеке по адресу время вызова функции.
      • Все рабочие регистры, используемые в функции прерывания, сохраняются в стеке, если банк регистров не указан с с использованием атрибута .
      • Рабочие регистры и специальные регистры, сохраненные на стек восстанавливается перед выходом из функции.
      • Функция завершается 8051 RETI инструкция.

      Кроме того, компилятор Cx51 генерирует вектор прерывания автоматически.

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

      источник уровня stmt
      
         1 внешняя битовая сигнализация;
         2 интервал_счетчик_сигналов;
         3
         4
         5 void falarm (void) прерывание 1 с помощью 3 {
         6 1 число_алармов *= 2;
         7 1 тревога = 1;
         8 1 }
      
      
      СБОРОЧНЫЙ ЛИСТИНГ СОЗДАННОГО ОБЪЕКТНОГО КОДА
      
            ; ФУНКЦИЯ фаларм (НАЧАЛО)
      0000 C0E0 НАЖАТЬ АКК
      0002 C0D0 PUSH PSW
                            ; ИСТОЧНИК ЛИНИЯ № 5
                            ; ИСТОЧНИК № 6
      0004 E500 R ДВИГАТЕЛЬ A, количество_сигналов+01H
      0006 25E0 ДОБАВИТЬ А,АКК
      0008 F500 R MOV alarm_count+01H,A
      000A E500 R MOV A,число_сигналов_
      000C 33 РЛК А
      000D F500 R MOV alarm_count,A
                            ; ИСТОЧНИК ЛИНИЯ № 7
      000F D200 E Аварийный сигнал SETB
                            ; ИСТОЧНИК № 8
      0011 D0D0 POP PSW
      0013 D0E0 ПОП АКК
      0015 32 РЭТИ
            ; ФУНКЦИЯ фаларм (КОНЕЦ)
       

      В приведенном выше примере обратите внимание, что ACC и PSW регистры сохраняются по смещению 0000h и восстанавливаются по смещению 0011h.Обратите также внимание на инструкцию RETI , сгенерированную для выхода из прерывать.

      Следующие правила применяются к функциям прерывания.

      • Для прерывания нельзя указывать аргументы функции. функция. Компилятор выдает сообщение об ошибке, если прерывание функция объявляется с любыми аргументами.
      • Объявления функций прерывания не могут включать возвращаемое значение. Они должны быть объявлены как недействительные (см. приведенные выше примеры). компилятор выдает сообщение об ошибке при любой попытке определить возвращаемое значение для функции прерывания. Неявный int возвращаемое значение, однако, игнорируется компилятором.
      • Компилятор распознает прямые вызовы функций прерывания и отвергает их. Бессмысленно вызывать процедуры прерывания напрямую, так как выход из процедуры приводит к выполнению Инструкция RETI , влияющая на систему аппаратных прерываний микросхемы 8051.Поскольку запрос на прерывание со стороны оборудование существовало, действие этой инструкции не определено и обычно фатальные. Не вызывайте функцию прерывания косвенно через указатель функции.
      • Компилятор генерирует вектор прерывания для каждого прерывания. функция. Код, сгенерированный для вектора, представляет собой переход к начало функции прерывания. Генерация прерывания векторы можно подавить, включив управляющую директиву NOINTVECTOR в Командная строка Cx51.В этом случае вы должны предоставить векторы прерывания из отдельных сборочных модулей. Дополнительные сведения см. в инструкциях по управлению INTVECTOR и INTERVAL . информация о таблице векторов прерываний.
      • Компилятор Cx51 позволяет 90 327 прерываний 90 328 номеров в диапазон 0-31. Обратитесь к производному документу 8051, чтобы определить какие прерывания доступны.
      • Функции, вызываемые из процедуры прерывания, должны работать с тот же банк регистров, что и процедура прерывания.Когда Директива NOAREGS не явно указано, компилятор может сгенерировать абсолютный регистр доступ с использованием банка регистров, выбранного с использованием атрибутом или элементом управления REGISTERBANK для этого функция. Непредсказуемые результаты могут возникнуть, когда функция предполагает зарегистрируйте банк, отличный от выбранного в данный момент. Ссылаться на Зарегистрируйте доступ к банку для Дополнительная информация.

      Связанные статьи базы знаний

      %PDF-1.6 % 6714 0 объект > эндообъект внешняя ссылка 6714 126 0000000016 00000 н 0000003937 00000 н 0000004072 00000 н 0000004321 00000 н 0000004359 00000 н 0000004411 00000 н 0000004479 00000 н 0000004516 00000 н 0000004898 00000 н 0000005018 00000 н 0000005137 00000 н 0000005256 00000 н 0000005376 00000 н 0000005497 00000 н 0000005616 00000 н 0000005736 00000 н 0000005855 00000 н 0000005975 00000 н 0000006096 00000 н 0000006216 00000 н 0000006336 00000 н 0000006457 00000 н 0000006577 00000 н 0000006698 00000 н 0000006783 00000 н 0000006867 00000 н 0000006949 00000 н 0000007031 00000 н 0000007113 00000 н 0000007195 00000 н 0000007277 00000 н 0000007359 00000 н 0000007441 00000 н 0000007523 00000 н 0000007605 00000 н 0000007687 00000 н 0000007769 00000 н 0000007851 00000 н 0000007933 00000 н 0000008015 00000 н 0000008097 00000 н 0000008179 00000 н 0000008261 00000 н 0000008343 00000 н 0000008425 00000 н 0000008507 00000 н 0000008588 00000 н 0000008669 00000 н 0000008750 00000 н 0000008927 00000 н 0000009528 00000 н 0000010067 00000 н 0000010451 00000 н 0000010490 00000 н 0000010569 00000 н 0000010793 00000 н 0000011023 00000 н 0000011274 00000 н 0000011892 00000 н 0000012318 00000 н 0000012666 00000 н 0000013104 00000 н 0000013511 00000 н 0000013937 00000 н 0000014365 00000 н 0000014534 00000 н 0000017229 00000 н 0000023892 00000 н 0000023953 00000 н 0000024114 00000 н 0000024249 00000 н 0000024398 00000 н 0000024529 00000 н 0000024685 00000 н 0000024913 00000 н 0000025075 00000 н 0000025235 00000 н 0000025444 00000 н 0000025562 00000 н 0000025697 00000 н 0000025919 00000 н 0000026130 00000 н 0000026332 00000 н 0000026511 00000 н 0000026675 00000 н 0000026855 00000 н 0000027071 00000 н 0000027284 00000 н 0000027482 00000 н 0000027663 00000 н 0000027843 00000 н 0000028022 00000 н 0000028203 00000 н 0000028347 00000 н 0000028560 00000 н 0000028764 00000 н 0000028971 00000 н 0000029144 00000 н 0000029300 00000 н 0000029475 00000 н 0000029632 00000 н 0000029790 00000 н 0000029914 00000 н 0000030087 00000 н 0000030243 00000 н 0000030465 00000 н 0000030670 00000 н 0000030872 00000 н 0000031076 00000 н 0000031266 00000 н 0000031457 00000 н 0000031630 00000 н 0000031791 00000 н 0000031976 00000 н 0000032117 00000 н 0000032265 00000 н 0000032520 00000 н 0000032774 00000 н 0000033051 00000 н 0000033314 00000 н 0000033535 00000 н 0000033757 00000 н 0000033894 00000 н 0000034066 00000 н 0000003679 00000 н 0000002896 00000 н трейлер ]>> startxref 0 %%EOF 6839 0 объект >поток xYH|%’_`KXy錙%UZ th j$U)?6Y’}»銈m%:@>v?_#),\KXH-O;d#c&Xq)[email protected]^D:P.o_L Bat

      (XC16) Где я могу найти имена векторов прерываний, доступных для устройства?

      Начиная с XC16 v1.22, список служб прерываний для каждого устройства можно найти в папке /docs/vector_docs. Удобный индекс можно найти в /docs/vector_index.html.

      16-битные устройства позволяют генерировать прерывания из многих источников прерываний. Большинство источников имеют свой собственный выделенный вектор прерывания.

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

      Имена векторов прерываний для конкретного устройства находятся в файле сценария компоновщика для конкретного устройства (GLD). Имя вектора прерывания в файле GLD имеет двойное подчеркивание (__), но при объявлении процедуры прерывания в исходном файле C вектор прерывания должен иметь только одно подчеркивание (_).

      Вы можете обратиться к файлу компоновщика для конкретного устройства (GLD) для семейства PIC24F в папке \support\PIC24F\gld.

      Устаревший синтаксис

      Пример 1:

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

      Используемое устройство: dsPIC33EP512GM710

      Пример 2:

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

      Используемое устройство: dsPIC33EP512GM710

      Синтаксис CCI

      Синтаксис Common Compiler Infrastructure (CCI) можно включить в Project Properties > XC16-gcc > Preprocessing and messages .

      При включенном синтаксисе CCI прерывание записывается следующим образом:

      Пример 1 с включенным синтаксисом CCI

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

      Используемое устройство: dsPIC33EP512GM710

      Пример 2 с включенным синтаксисом CCI

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

      Используемое устройство: dsPIC33EP512GM710

      Что такое таблица векторов прерываний (IVT)

      В этом уроке мы обсудим основы таблицы векторов прерываний (IVT) . «Таблица векторов прерываний» (IVT) — это структура данных, которая связывает список обработчиков прерываний со списком запросов на прерывание в таблице векторов прерываний.Каждая запись таблицы векторов прерываний, называемая вектором прерывания, является адресом обработчика прерывания.

      Что такое таблица векторов прерываний (IVT)?

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

      Прерывания и исключения в ARM MCU

      Основное различие между системными исключениями и прерываниями заключается в том, что системные исключения генерируются ЦП, а периферийные прерывания генерируются различными периферийными модулями, доступными в микроконтроллерах на основе ARM cortex.Например, в микроконтроллере TM4C123G ARM Cortex M4 исключения и прерывания контролируются и управляются вложенным векторным контроллером прерываний (NVIC) в системе ARM® Cortex®-M4.

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

      Где хранится IVT в памяти микроконтроллера?

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

      Таблица векторов прерываний, или мы называем ее IVT , находится в ПЗУ любого микроконтроллера.Мы знаем, что каждый микроконтроллер имеет определенное количество ОЗУ и ПЗУ. Это ПЗУ, предоставленное производителем, — это место, где мы храним флэш-память / кодовую память микроконтроллеров ARM Cortex M4. каждый производитель будет писать это, и вы можете найти информацию о IVT микроконтроллера из таблицы данных и руководства пользователя.

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

      ЦП

      ARM Cortex-M имеет два режима работы, такие как режим потока и режим исключения. В обычном исполнении ЦП работает в потоковом режиме.Но когда происходит прерывание, ЦП переходит из режима потока в режим исключения. В режиме исключений вложенный контроллер векторов прерываний управляет всеми запросами прерываний и исключений.

      Когда происходит прерывание x, запрос на прерывание будет отправлен в NVIC. Если NVIC принимает запрос исключения/прерывания x, следующим шагом NVIC является поиск начального адреса процедуры обслуживания прерывания или обработчика исключений. Начальный адрес соответствующего ISR или обработчика исключений хранится в таблице векторов прерываний.Затем NVIC использует номер исключения x для вычисления адреса исключения путем поиска в таблице векторов прерываний и использования содержимого этого адреса памяти (который является адресом соответствующего обработчика исключений) для выполнения обработчика исключений. Счетчик программ будет загружен адресом обработчика исключений, и ЦП начнет выполнять процедуру обработки исключений.

      Родственные

      Определения векторов прерываний

      Имя

      Определения векторов прерываний AT91SAM7 — Определения векторов расширенного контроллера прерываний

      Определения векторов прерываний

      Файл (находится по адресу hal/arm/arm9/at91sam7/ ВЕРСИЯ /include/hal_platform_ints.h в исходном репозитории eCos) содержит определения номеров векторов прерываний для использовать с ядром eCos и API-интерфейсами прерывания драйвера. Точный набор поддерживаемые векторы зависят от модели AT91SAM7:

      Для семейства AT91SAM7S:

       #define CYGNUM_HAL_INTERRUPT_FIQ 0 // Расширенный контроллер прерываний (FIQ)
      #define CYGNUM_HAL_INTERRUPT_SYS 1 // Системная периферия (блок отладки, системный таймер)
      #define CYGNUM_HAL_INTERRUPT_PIOA 2 // Контроллер параллельного ввода-вывода A
      #define CYGNUM_HAL_INTERRUPT_ADC 4 // Аналого-цифровой преобразователь
      #define CYGNUM_HAL_INTERRUPT_SPI 5 // Последовательный периферийный интерфейс
      #define CYGNUM_HAL_INTERRUPT_USART0 6 // USART 0
      #define CYGNUM_HAL_INTERRUPT_USART1 7 // USART 1
      #define CYGNUM_HAL_INTERRUPT_SSC 8 // Последовательный синхронный контроллер
      #define CYGNUM_HAL_INTERRUPT_TWI 9 // Двухпроводной интерфейс (I2C)
      #define CYGNUM_HAL_INTERRUPT_PWMC 10 // ШИМ-контроллер
      #define CYGNUM_HAL_INTERRUPT_UDP 11 // Порт USB-устройства
      #define CYGNUM_HAL_INTERRUPT_TC0 12 // Счетчик таймера 0
      #define CYGNUM_HAL_INTERRUPT_TC1 13 // Счетчик таймера 1
      #define CYGNUM_HAL_INTERRUPT_TC2 14 // Счетчик таймера 2
      #define CYGNUM_HAL_INTERRUPT_IRQ0 30 // Внешний IRQ0
      #define CYGNUM_HAL_INTERRUPT_IRQ1 31 // Внешний IRQ0
      
      // Прерывания, мультиплексированные в системное прерывание
      #define CYGNUM_HAL_INTERRUPT_PITC 32 // Таймер интервала периода
      #define CYGNUM_HAL_INTERRUPT_RTTC 33 // Таймер реального времени
      #define CYGNUM_HAL_INTERRUPT_PMC 34 // Контроллер управления питанием
      #define CYGNUM_HAL_INTERRUPT_MC 35 // Контроллер памяти
      #define CYGNUM_HAL_INTERRUPT_WDTC 36 // Сторожевой таймер
      #define CYGNUM_HAL_INTERRUPT_RSTC 37 // Сброс контроллера
      #define CYGNUM_HAL_INTERRUPT_DEBUG 38 // Последовательный порт отладки 

      Для семейства AT91SAM7X:

       #define CYGNUM_HAL_INTERRUPT_FIQ 0 // Расширенный контроллер прерываний (FIQ)
      #define CYGNUM_HAL_INTERRUPT_SYS 1 // Системная периферия (блок отладки, системный таймер)
      #define CYGNUM_HAL_INTERRUPT_PIOA 2 // Контроллер параллельного ввода-вывода A
      #define CYGNUM_HAL_INTERRUPT_PIOB 3 // Контроллер параллельного ввода-вывода B
      #define CYGNUM_HAL_INTERRUPT_SPI 4 // Последовательный периферийный интерфейс
      #define CYGNUM_HAL_INTERRUPT_SPI1 5 // Последовательный периферийный интерфейс 1
      #define CYGNUM_HAL_INTERRUPT_USART0 6 // USART 0
      #define CYGNUM_HAL_INTERRUPT_USART1 7 // USART 1
      #define CYGNUM_HAL_INTERRUPT_SSC 8 // Последовательный синхронный контроллер
      #define CYGNUM_HAL_INTERRUPT_TWI 9 // Двухпроводной интерфейс (I2C)
      #define CYGNUM_HAL_INTERRUPT_PWMC 10 // ШИМ-контроллер
      #define CYGNUM_HAL_INTERRUPT_UDP 11 // Порт USB-устройства
      #define CYGNUM_HAL_INTERRUPT_TC0 12 // Счетчик таймера 0
      #define CYGNUM_HAL_INTERRUPT_TC1 13 // Счетчик таймера 1
      #define CYGNUM_HAL_INTERRUPT_TC2 14 // Счетчик таймера 2
      #define CYGNUM_HAL_INTERRUPT_CAN 15 // Контроллер CAN
      #define CYGNUM_HAL_INTERRUPT_EMAC 16 // Ethernet MAC
      #define CYGNUM_HAL_INTERRUPT_ADC 17 // Аналого-цифровой преобразователь
      #define CYGNUM_HAL_INTERRUPT_IRQ0 30 // Внешний IRQ0
      #define CYGNUM_HAL_INTERRUPT_IRQ1 31 // Внешний IRQ0
      
      // Прерывания, мультиплексированные в системное прерывание
      #define CYGNUM_HAL_INTERRUPT_PITC 32 // Таймер интервала периода
      #define CYGNUM_HAL_INTERRUPT_RTTC 33 // Таймер реального времени
      #define CYGNUM_HAL_INTERRUPT_PMC 34 // Контроллер управления питанием
      #define CYGNUM_HAL_INTERRUPT_MC 35 // Контроллер памяти
      #define CYGNUM_HAL_INTERRUPT_WDTC 36 // Сторожевой таймер
      #define CYGNUM_HAL_INTERRUPT_RSTC 37 // Сброс контроллера
      #define CYGNUM_HAL_INTERRUPT_DEBUG 38 // Последовательный порт отладки 

      Для AT91SAM7A3:

       #define CYGNUM_HAL_INTERRUPT_FIQ 0 // Расширенный контроллер прерываний (FIQ)
      #define CYGNUM_HAL_INTERRUPT_SYS 1 // Системная периферия (блок отладки, системный таймер)
      #define CYGNUM_HAL_INTERRUPT_PIOA 2 // Контроллер параллельного ввода-вывода A
      #define CYGNUM_HAL_INTERRUPT_PIOB 3 // Контроллер параллельного ввода-вывода B
      #define CYGNUM_HAL_INTERRUPT_CAN0 4 // Контроллер CAN 0
      #define CYGNUM_HAL_INTERRUPT_CAN1 5 // CAN-контроллер 1
      #define CYGNUM_HAL_INTERRUPT_USART0 6 // USART 0
      #define CYGNUM_HAL_INTERRUPT_USART1 7 // USART 1
      #define CYGNUM_HAL_INTERRUPT_USART2 8 // USART 2
      #define CYGNUM_HAL_INTERRUPT_MCI 9 // Интерфейс мультимедийной карты
      #define CYGNUM_HAL_INTERRUPT_TWI 10 // Двухпроводной интерфейс (I2C)
      #define CYGNUM_HAL_INTERRUPT_SPI 11 // Последовательный параллельный интерфейс 0
      #define CYGNUM_HAL_INTERRUPT_SPI1 12 // Последовательный параллельный интерфейс 1
      #define CYGNUM_HAL_INTERRUPT_SSC0 13 // Последовательный синхронный контроллер 0
      #define CYGNUM_HAL_INTERRUPT_SSC1 14 // Последовательный синхронный контроллер 1
      #define CYGNUM_HAL_INTERRUPT_TC0 15 // Счетчик таймера 0
      #define CYGNUM_HAL_INTERRUPT_TC1 16 // Счетчик таймера 1
      #define CYGNUM_HAL_INTERRUPT_TC2 17 // Счетчик таймера 2
      #define CYGNUM_HAL_INTERRUPT_TC3 18 // Счетчик таймера 3
      #define CYGNUM_HAL_INTERRUPT_TC4 19 // Счетчик таймера 4
      #define CYGNUM_HAL_INTERRUPT_TC5 20 // Счетчик таймера 5
      #define CYGNUM_HAL_INTERRUPT_TC6 21 // Счетчик таймера 6
      #define CYGNUM_HAL_INTERRUPT_TC7 22 // Счетчик таймера 7
      #define CYGNUM_HAL_INTERRUPT_TC8 23 // Счетчик таймера 8
      #define CYGNUM_HAL_INTERRUPT_ADC0 24 // Аналого-цифровой преобразователь 0
      #define CYGNUM_HAL_INTERRUPT_ADC1 25 // Аналого-цифровой преобразователь 1
      #define CYGNUM_HAL_INTERRUPT_PWMC 26 // ШИМ-контроллер
      #define CYGNUM_HAL_INTERRUPT_UDP 27 // Порт USB-устройства
      #define CYGNUM_HAL_INTERRUPT_IRQ0 28 // Внешнее прерывание 0
      #define CYGNUM_HAL_INTERRUPT_IRQ1 29 // Внешнее прерывание 1
      #define CYGNUM_HAL_INTERRUPT_IRQ2 30 // Внешнее прерывание 2
      #define CYGNUM_HAL_INTERRUPT_IRQ3 31 // Внешнее прерывание 3
      
      // Прерывания, мультиплексированные в системное прерывание
      #define CYGNUM_HAL_INTERRUPT_PITC 32 // Таймер интервала периода
      #define CYGNUM_HAL_INTERRUPT_RTTC 33 // Таймер реального времени
      #define CYGNUM_HAL_INTERRUPT_PMC 34 // Контроллер управления питанием
      #define CYGNUM_HAL_INTERRUPT_MC 35 // Контроллер памяти
      #define CYGNUM_HAL_INTERRUPT_WDTC 36 // Сторожевой таймер
      #define CYGNUM_HAL_INTERRUPT_RSTC 37 // Сброс контроллера
      #define CYGNUM_HAL_INTERRUPT_DEBUG 38 // Последовательный порт отладки 

      Для AT91SAM7A1 и AT91SAM7A2:

       #define CYGNUM_HAL_INTERRUPT_FIQ 0 // Расширенный контроллер прерываний (FIQ)
      #define CYGNUM_HAL_INTERRUPT_SWIIRQ0 1 // Программное прерывание 0
      #define CYGNUM_HAL_INTERRUPT_WD 2 // Сторожевой таймер
      #define CYGNUM_HAL_INTERRUPT_WT 3 // Смотреть таймер
      #define CYGNUM_HAL_INTERRUPT_USART0 4 // USART 0
      #define CYGNUM_HAL_INTERRUPT_USART1 5 // USART 1
      #define CYGNUM_HAL_INTERRUPT_CAN3 6 // Контроллер CAN 3
      #define CYGNUM_HAL_INTERRUPT_SPI 7 // Последовательный периферийный интерфейс
      #define CYGNUM_HAL_INTERRUPT_CAN1 8 // CAN-контроллер 1
      #define CYGNUM_HAL_INTERRUPT_CAN2 9 // CAN-контроллер 2
      #define CYGNUM_HAL_INTERRUPT_ADC0 10 // Аналого-цифровой преобразователь 0
      #define CYGNUM_HAL_INTERRUPT_ADC1 11 // Аналого-цифровой преобразователь 1
      #define CYGNUM_HAL_INTERRUPT_GPT0CH0 12 // Таймер общего назначения 0 Канал 0
      #define CYGNUM_HAL_INTERRUPT_GPT0Ch2 13 // Таймер общего назначения 0 Канал 1
      #define CYGNUM_HAL_INTERRUPT_GPT0Ch3 14 // Таймер общего назначения 0 Канал 2
      #define CYGNUM_HAL_INTERRUPT_SWIIRQ1 15 // Программное прерывание 1
      #define CYGNUM_HAL_INTERRUPT_SWIIRQ2 16 // Программное прерывание 2
      #define CYGNUM_HAL_INTERRUPT_SWIIRQ3 17 // Программное прерывание 3
      #define CYGNUM_HAL_INTERRUPT_GPT1CH0 18 // Таймер общего назначения 1 Канал 0
      #define CYGNUM_HAL_INTERRUPT_PWM 19 // ШИМ-контроллер
      #define CYGNUM_HAL_INTERRUPT_CAN0 20 // Контроллер CAN 0
      #define CYGNUM_HAL_INTERRUPT_UPIO 21 // Унифицированный параллельный контроллер ввода-вывода
      #define CYGNUM_HAL_INTERRUPT_CAPT0 22 // Захват 0
      #define CYGNUM_HAL_INTERRUPT_CAPT1 23 // Захват 1
      #define CYGNUM_HAL_INTERRUPT_ST0 24 // Простой таймер 0
      #define CYGNUM_HAL_INTERRUPT_ST1 25 // Простой таймер 1
      #define CYGNUM_HAL_INTERRUPT_SWIIRQ4 26 // Программное прерывание 4
      #define CYGNUM_HAL_INTERRUPT_SWIIRQ5 27 // Программное прерывание 5
      #define CYGNUM_HAL_INTERRUPT_IRQ0 28 // Внешнее прерывание 0
      #define CYGNUM_HAL_INTERRUPT_IRQ1 29 // Внешнее прерывание 1
      #define CYGNUM_HAL_INTERRUPT_SWIIRQ6 30 // Программное прерывание 6
      #define CYGNUM_HAL_INTERRUPT_SWIIRQ7 31 // Программное прерывание 7 

      avr-libc: : Interrupts

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

      В среде AVR-GCC таблица векторов предварительно определена так, чтобы указывать на подпрограммы обработки прерываний с заранее определенными именами. Используя соответствующее имя, ваша подпрограмма будет вызываться при возникновении соответствующего прерывания. Библиотека устройств предоставляет набор процедур прерывания по умолчанию, которые будут использоваться, если вы не определите свои собственные.

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

      Эти детали, кажется, делают процедуры обработки прерываний немного запутанными, но все эти детали обрабатываются Interrupt API. Процедура прерывания определяется с помощью ISR(). Этот макрос регистрирует и помечает подпрограмму как обработчик прерывания для указанного периферийного устройства.Ниже приведен пример определения обработчика прерывания ADC.

      Обратитесь к главе, объясняющей программирование на ассемблере, для получения пояснений о подпрограммах обработки прерываний, написанных исключительно на языке ассемблера.

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

      Аппаратное обеспечение AVR очищает глобальный флаг прерывания в SREG перед вводом вектора прерывания . Таким образом, обычно прерывания остаются отключенными внутри обработчика до тех пор, пока обработчик не выйдет, где инструкция RETI (которая выдается компилятором как часть обычного эпилога функции для обработчика прерываний) в конечном итоге снова разрешает дальнейшие прерывания.По этой причине обработчики прерываний обычно не вкладывают друг в друга. Для большинства обработчиков прерываний это желаемое поведение, а для некоторых оно даже требуется для предотвращения бесконечно рекурсивных прерываний (таких как прерывания UART или внешние прерывания, запускаемые по уровню). Однако в редких случаях может потребоваться как можно раньше снова включить глобальный флаг прерывания в обработчике прерывания, чтобы не откладывать любое другое прерывание больше, чем это абсолютно необходимо. Это можно сделать с помощью инструкции sei() в самом начале обработчика прерывания, но это по-прежнему оставляет мало инструкций в прологе функции, сгенерированном компилятором, для запуска с отключенными глобальными прерываниями.Компилятору можно дать указание вставить инструкцию SEI прямо в начало обработчика прерывания, объявив обработчик следующим образом:

      , где XXX_vect — имя допустимого вектора прерывания для рассматриваемого типа MCU, как объяснено ниже. .

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

      Обратите внимание, что для функции ISR_ALIASOF() требуется GCC 4.2 или выше (или исправленная версия GCC 4.1.x). См. документацию макроса ISR_ALIAS() для реализации, которая менее элегантна, но может быть применена ко всем версиям компилятора.

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

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

      Обработчик для такого вектора прерывания может быть объявлен с помощью макроса EMPTY_INTERRUPT():

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

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

      Другое решение состоит в том, чтобы по-прежнему реализовать ISR на языке C, но взять на себя работу компилятора по созданию пролога и эпилога. Это можно сделать с помощью атрибута ISR_NAKED макроса ISR(). Обратите внимание, что компилятор не генерирует ничего в качестве пролога или эпилога, поэтому окончательный reti() должен быть обеспечен фактической реализацией. SREG должен быть сохранен вручную, если код ISR изменяет его, и подразумеваемое компилятором предположение о том, что __zero_reg__ всегда равно 0, может быть неверным (т.грамм. при прерывании сразу после инструкции MUL).

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

      В настоящее время существует два разных стиля именования векторов. В одной форме используются имена, начинающиеся с SIG_ , за которыми следует относительно подробное, но произвольно выбранное имя, описывающее вектор прерывания. Это был единственный доступный стиль в avr-libc до версии 1.2.x.

      Начиная с avr-libc версии 1.4.0, был добавлен второй стиль имен векторов прерываний, где за короткой фразой описания вектора следует _vect .Короткая фраза соответствует имени вектора, как описано в таблице данных соответствующего устройства (и в XML-файлах Atmel), с заменой пробелов символом подчеркивания и удалением других небуквенно-цифровых символов. Использование суффикса _vect предназначено для улучшения переносимости на другие компиляторы C, доступные для AVR, которые используют аналогичное соглашение об именах.

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

      90 108 аналогового компаратора 0 Запрос Запрос Запрос 90 108 TIMER0_COMP_A_vect 90 108 TIMER1_CMPB_vect

      8 Таймер / контр 50057

      8, ATMEGA1280, ATMEGA1281, ATMEGA2560, ATMEGA1281, ATMEGA2560, ATMEGA2561

      8 TIMER5_COMPC_VECT

      8 UART1_UDRE_VECT

      8 SIG_UART1_DATA

      8 UART1 Регистрация данных пустой

      8 ATMEGA161

      8 UART_RX_VECT

      90 108 SIG_USI_START
      Имя вектора Старое имя вектора Описание

      Применимо к устройству

      ADC_vect SIG_ADC АЦП преобразования Полное AT90S2333, AT90S4433, AT90S4434, AT90S8535, AT90PWM216, AT90PWM2B, AT90PWM316, AT90PWM3B, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega1284P, ATmega16 , ATmega163, ATmega165, ATmega165P, ATmega168P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega3250P, ATmega328P, ATmega329, ATmega3290, ATmega3290P, ATmega48P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8535, ATmega88P, ATmega168 , ATMEGA48, ATMEGA88, ATMEGA640, ATMEGA1280, ATMEGA1281, ATMEGA2560, ATMEGA2561, ATMEGA2560, ATMEGA2561, ATMEGA324P, ATMEGA164P, ATMEGA644P, ATMEGA644, ATTINY13, ATTINY15, ATTINY24, attiny43u, attiny48, attiny45, attiny25, attiny85, attiny261, attiny461, attiny861 , AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      ANALOG_COMP_0_vect SIG_COMPARATOR0 AT90PWM3, AT90PWM2, AT90PWM1
      ANALOG_COMP_1_vect SIG_COMPARATOR1 Аналоговый компаратор 1 AT90PWM3, AT90PWM2, AT90PWM1
      ANALOG_COMP_2_vect SIG_COMPARATOR2 Аналоговый Компаратор 2 AT90PWM3, AT90PWM2, AT90PWM1
      ANALOG_COMP_vect SIG_COMPARATOR аналоговый компаратор AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega1284P, ATmega165, ATmega165P, ATmega168P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega3250P, ATmega328P, ATmega329, ATmega3290, ATmega3290P , ATmega48P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 90 057
      ANA_COMP_vect SIG_COMPARATOR Аналоговый компаратор AT90S1200, AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega16, ATmega161, ATmega162, ATmega163, ATmega32, ATmega323, ATmega8, ATmega8515, ATmega8535, ATtiny11, Attiny12, attiny13, attiny15, attiny2313, attiny26, attiny28, attiny43u, attiny48, attiny24, attiny44, attiny84, attiny45, attiny25, attiny85, attiny261, attiny461, attiny861
      Canit_vect SIG_CAN_INTERRUPT1 AT90CAN128, AT90CAN32, AT90CAN64
      EEPROM_READY_vect SIG_EEPROM_READY, SIG_EE_READY ATtiny2313
      EE_RDY_vect SIG_EEPROM_READY EEPROM Готовые AT90S2333, AT90S4433, AT90S4434, AT90S8535, ATmega16, ATmega161, ATmega162, ATmega163, АТмега32, АТмега323, ATmega8, ATmega8515, ATmega8535, ATtiny12, ATtiny13, ATtiny15, ATtiny26, ATtiny43U, ATtiny48, ATtiny24, ATtiny44, ATtiny84, Attiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861
      EE_READY_vect SIG_EEPROM_READY EEPROM Готовые AT90PWM3 , AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega1284P, ATmega165, ATmega165P, ATmega168P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega3250P, ATmega328P, ATmega329, ATmega3290, ATmega3290P, ATmega32HVB, ATmega406, ATmega48P, ATmega64, ATmega645 , ATmega6450, ATmega649, ATmega6490, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATmega16HVA, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      EXT_INT0_vect SIG_INTERRUPT0 Запрос внешнего прерывания 0 ATti ny24, ATtiny44, ATtiny84
      INT0_vect SIG_INTERRUPT0 Внешнее прерывание 0 AT90S1200, AT90S2313, AT90S2323, AT90S2333, AT90S2343, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM216, AT90PWM2B, AT90PWM316, AT90PWM3B, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega1284P, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega168P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega3250P, ATmega328P, ATmega329, ATmega3290, ATmega3290P, ATmega32HVB, ATmega406, ATmega48P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATmega16HVA, ATtiny11, ATtiny12, ATtiny13, ATtiny15, ATtiny22, ATtiny2313, ATtiny26, ATtiny28, ATtiny43U, ATtiny48, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      INT1_vect SIG_INTERRUPT1 Внешнее прерывание запроса 1 AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535 , AT90PWM216, AT90PWM2B, AT90PWM316, AT90PWM3B, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega1284P, ATmega16, ATmega161, ATmega162, ATmega163, ATmega168P, ATmega32, ATmega323, ATmega328P, ATmega32HVB, ATmega406, ATmega48P, ATmega64 , ATmega8, ATmega8515, ATmega8535, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATmega16HVA, ATtiny2313, ATtiny28, ATtiny48, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82 , AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      INT2_vect SIG_INTERR UPT2 Внешнее прерывание Запрос 2 AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega1284P, ATmega16, ATmega161, ATmega162, ATmega32, ATmega323, ATmega32HVB, ATmega406, ATmega64, ATmega8515, ATmega8535, ATmega640, ATmega1280 , ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATmega16HVA, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      INT3_vect SIG_INTERRUPT3 Внешнее прерывание Запрос 3 AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega32HVB, ATmega406, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      INT4_vect SIG_INTERRUPT4 Внешнее прерывание запроса 4 АТ90КАН128, АТ90КАН32, АТ90КАН64, АТ mega103, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      INT5_vect SIG_INTERRUPT5 Внешнее прерывание 5 AT90CAN128, AT90CAN32, AT90CAN64, ATmega103 , ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      INT6_vect SIG_INTERRUPT6 Внешнее прерывание Запрос 6 AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      INT7_vect SIG_INTERRUPT7 Внешнее прерывание 7 AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128 , ATmega64, ATme ga640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      IO_PINS_vect SIG_PIN, SIG_PIN_CHANGE Внешнее прерывание 0 ATtiny11, ATtiny12, ATtiny15, ATtiny26
      LCD_vect SIG_LCD LCD начало кадра ATmega169, ATmega169P, ATmega329, ATmega3290, ATmega3290P, ATmega649, ATmega6490
      LOWLEVEL_IO_PINS_vect SIG_PIN низкий уровень входного сигнала на порт B ATtiny28
      OVRIT_vect SIG_CAN_OVERFLOW1 CAN Таймер Переполнение AT90CAN128, AT90CAN32, AT90CAN64
      PCINT0_vect SIG_PIN_CHANGE0 Pin Change Interrupt Request 0 ATmega162, ATmega165, ATmega165P, ATmega168P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega3250P, ATmega328P, ATmega329, ATmega3290, ATmega3290P, ATmega32HVB, ATmega406, ATmega48P, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny13, ATtiny43U, ATtiny48, ATtiny24, ATtiny44, ATtiny84, Attiny45, ATtiny25, ATtiny85, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      PCINT1_vect SIG_PIN_CHANGE1 Pin Change Interrupt Request 1 ATmega162, ATmega165, ATmega165P, ATmega168P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega3250P, ATmega328P, ATmega329, ATmega3290, ATmega3290P, ATmega32HVB, ATmega406, ATmega48P, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny43U, ATtiny48, ATtiny24, ATti ny44, ATtiny84, AT90USB162, AT90USB82
      PCINT2_vect SIG_PIN_CHANGE2 Pin Change Interrupt Request 2 ATmega3250, ATmega3250P, ATmega328P, ATmega3290, ATmega3290P, ATmega48P, ATmega6450, ATmega6490, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny48
      PCINT3_vect SIG_PIN_CHANGE3 Pin Change Interrupt Request 3 ATmega3250, ATmega3250P, ATmega3290, ATmega3290P, ATmega6450, ATmega6490, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny48
      PCINT_vect SIG_PIN_CHANGE, SIG_PCINT ATtiny2313, ATtiny261, ATtiny461, ATtiny861
      PSC0_CAPT_vect SIG_PSC0_CAPTURE PSC0 Capture Event AT90PWM3, AT90PWM2, AT90PWM1
      PSC0_EC_vect SIG_PSC0_END_CYCLE PSC0 Конец цикла AT90PWM3, AT90PWM2, AT90PWM1
      PSC1_CAPT_vect SIG_PSC1_CAPTURE PSC1 Capture Event AT90PWM3, AT90PWM2, AT90PWM1
      PSC1_EC_vect SIG_PSC1_END_CYCLE PSC1 End Цикл AT90PWM3, AT90PWM2, AT90PWM1
      PSC2_CAPT_vect SIG_PSC2_CAPTURE PSC2 Capture Event AT90PWM3, AT90PWM2, AT90PWM1
      PSC2_EC_vect SIG_PSC2_END_CYCLE PSC2 Конец цикла AT90PWM3, AT90PWM2, AT90PWM1
      SPI_STC_vect SIG_SPI Последовательная передача Полная AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM216, AT90PWM2B, AT90PWM316, AT90PWM3B, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, А T90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega1284P, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega168P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega3250P, ATmega328P, ATmega329, ATmega3290, ATmega3290P, ATmega32HVB, ATmega48P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATmega16HVA, ATtiny48, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      SPM_RDY_vect SIG_SPM_READY магазин памяти программ Готовые ATmega16, ATmega162, ATmega32, ATmega323, ATmega8, ATmega8515, ATmega8535
      SPM_READY_vect SIG_SPM_READY Программа магазин памяти чтения АТ90ПВМ3, АТ90ПВМ2, АТ90ПВМ1, АТ90КАН128, АТ90КАН32, АТ90 CAN64, ATmega128, ATmega1284P, ATmega165, ATmega165P, ATmega168P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega3250P, ATmega328P, ATmega329, ATmega3290, ATmega3290P, ATmega406, ATmega48P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      TIM0_COMPA_vect SIG_OUTPUT_COMPARE0A Таймер / Счетчик Сравнить Совпадение ATtiny13 , ATtiny43U, ATtiny24, ATtiny44, ATtiny84, Attiny45, ATtiny25, ATtiny85
      TIM0_COMPB_vect SIG_OUTPUT_COMPARE0B Таймер / Счетчик Сравнить Match B ATtiny13, ATtiny43U, ATtiny24, ATtiny44, ATtiny84, Attiny45, ATtiny25, ATtiny85
      TIM0_OVF_vect SIG_OVERFLOW0 Таймер/Ко unter0 Переполнение ATtiny13, ATtiny43U, ATtiny24, ATtiny44, ATtiny84, Attiny45, ATtiny25, ATtiny85
      TIM1_CAPT_vect SIG_INPUT_CAPTURE1 Таймер / Counter1 Capture Event ATtiny24, ATtiny44, ATtiny84
      TIM1_COMPA_vect SIG_OUTPUT_COMPARE1A Таймер / Counter1 Сравнить 130057, ATTINY84, ATTINY45, ATTINY84, ATTINY45, ATTINY25, ATTINY85
      SIG_OUTPUTT_COMPARE1B TIMER / COMPLE1 Сравнить матч B Attiny24, attiny44, attiny84, attiny45, attiny25, attiny85
      TIM1_OVF_vect SIG_OVERFLOW1 Таймер / Counter1 Переполнение ATtiny24, ATtiny44, ATtiny84, Attiny45, ATtiny25, ATtiny85
      TIMER0_CAPT_vect SIG_INPUT_CAPTURE0 АЦП преобразования Полное ATtiny261, ATtiny4 61, ATtiny861
      TIMER0_COMPA_vect SIG_OUTPUT_COMPARE0A TimerCounter0 Сравнить Совпадение ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATmega16HVA, ATtiny2313, ATtiny48, ATtiny261 , ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      TIMER0_COMPB_vect SIG_OUTPUT_COMPARE0B, SIG_OUTPUT_COMPARE0_B Таймер Счетчик 0 Сравнить Match B AT90PWM3, AT90PWM2, AT90PWM1, ATmega1284P, ATmega168P, ATmega328P, ATmega32HVB, ATmega48P, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATmega16HVA, ATtiny2313, ATtiny48, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      SIG_OUTPUT_COMPARE0A, SIG_OUTPUT_COMPARE0_A Таймер / Counter0 Сравнить Совпадение AT90PWM3, AT90PWM2, AT90PWM1
      TIMER0_COMP_vect SIG_OUTPUT_COMPARE0 Таймер / Counter0 Сравнить Match AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16 , ATmega161, ATmega162, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega3250P, ATmega329, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8515, ATmega8535
      TIMER0_OVF0_vect SIG_OVERFLOW0 Таймер / счетчик 0 Переполнение AT90S2313, AT90S2323, AT90S2343, ATtiny22, ATtiny26
      TIMER0_OVF_vect SIG_OVERFLOW0 Таймер / счетчик 0 Переполнение AT90S1200, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM2 16, AT90PWM2B, AT90PWM316, AT90PWM3B, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega1284P, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega168P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega3250P, ATmega328P, ATmega329, ATmega3290, ATmega3290P, ATmega32HVB, ATmega48P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATmega16HVA, ATtiny11, ATtiny12, ATtiny15, ATtiny2313, ATtiny28, ATtiny48, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      TIMER1_CAPT1_vect SIG_INPUT_CAPTURE1 Таймер /Counter1 Capture Event AT90S2313
      TIMER1_CAPT_vect SIG_INPUT _CAPTURE1 Таймер / Счетчик Capture Event AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM216, AT90PWM2B, AT90PWM316, AT90PWM3B, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega1284P, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega168P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega3250P, ATmega328P, ATmega329, ATmega3290, ATmega3290P, ATmega48P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, ATtiny48, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      TIMER1_CMPA_vect SIG_OUTPUT_COMPARE1A Таймер/счетчик 1 Сравнение совпадений 1A ATtiny26
      SIG_OUTPUT_COMPARE1B Таймер / Counter1 Сравнить Match 1B ATtiny26
      TIMER1_COMP1_vect SIG_OUTPUT_COMPARE1A Таймер / Counter1 Сравнить Совпадение AT90S2313
      TIMER1_COMPA_vect SIG_OUTPUT_COMPARE1A Таймер / COUNTER1 Сравнить Совпадение AT90S4414, AT90S4434, AT90S8515, AT90S8535, AT90PWM216, AT90PWM2B, AT90PWM316, AT90PWM3B, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega1284P, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega168P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega3250P, ATmega328P, ATmega329, ATmega3290, ATmega3290P, ATmega32HVB, ATmega48P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATmega16HVA, ATtiny2313, ATtiny48, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      TIMER1_COMPB_vect SIG_OUTPUT_COMPARE1B Таймер / Counter1 Сравнить MatchB AT90S4414, AT90S4434, AT90S8515, AT90S8535, AT90PWM216, AT90PWM2B, AT90PWM316, AT90PWM3B, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega1284P, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega168P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega3250P, ATmega328P, ATmega329, ATmega3290, ATmega3290P, ATmega32HVB, ATmega48P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATme ga644, ATmega16HVA, ATtiny2313, ATtiny48, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      TIMER1_COMPC_vect SIG_OUTPUT_COMPARE1C Таймер / Counter1 Сравнить Match C AT90CAN128, AT90CAN32, AT90CAN64, ATmega128 , ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      TIMER1_COMPD_vect SIG_OUTPUT_COMPARE0D Таймер / Counter1 Сравнить Match D ATtiny261, ATtiny461, ATtiny861
      TIMER1_COMP_vect SIG_OUTPUT_COMPARE1A Таймер / Counter1 Сравнить Match AT90S2333, AT90S4433, ATtiny15
      TIMER1_OVF1_vect SIG_OVERFLOW1 Таймер / Counter1 Переполнение AT90S2313, ATtiny26
      TIMER1_OV F_vect SIG_OVERFLOW1 Таймер / счетчик1 Переполнение AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM216, AT90PWM2B, AT90PWM316, AT90PWM3B, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega1284P, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega168P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega3250P, ATmega328P, ATmega329, ATmega3290, ATmega3290P, ATmega32HVB, ATmega48P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATmega16HVA, ATtiny15, ATtiny2313, ATtiny48, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      TIMER2_COMPA_vect SIG_OUTPUT_COMPARE2A 90 057 Таймер / Counter2 Сравнить Совпадение ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      TIMER2_COMPB_vect SIG_OUTPUT_COMPARE2B Таймер / Counter2 Сравнить Совпадение ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      TIMER2_COMP_vect SIG_OUTPUT_COMPARE2 Таймер / Counter2 Сравнить Match AT90S4434, AT90S8535, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega3250P, ATmega329, ATmega3290 , ATmega3290P, ATmega64, ATmega645, ATmega6450, А Tmega649, ATmega6490, ATmega8, ATmega8535
      TIMER2_OVF_vect SIG_OVERFLOW2 Таймер / Counter2 Переполнение AT90S4434, AT90S8535, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega1284P, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P , ATmega168P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega3250P, ATmega328P, ATmega329, ATmega3290, ATmega3290P, ATmega48P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8535, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640 , ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      TIMER3_CAPT_vect SIG_INPUT_CAPTURE3 Таймер / Counter3 Capture Event AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega1284P , ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, А Tmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      TIMER3_COMPA_vect SIG_OUTPUT_COMPARE3A Таймер / Counter3 Сравнить Совпадение AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega1284P, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560 , ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      TIMER3_COMPB_vect SIG_OUTPUT_COMPARE3B Таймер / Counter3 Сравнить Match B AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega1284P, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      TIMER3_COMPC_vect SIG_OUTPUT_COMPARE3C Таймер / Counter3 Сравнить Match C AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90 USB1286, AT90USB647, AT90USB646
      TIMER3_OVF_vect SIG_OVERFLOW3 Таймер / Counter3 Переполнение AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega1284P, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647 , AT90USB646
      TIMER4_CAPT_vect SIG_INPUT_CAPTURE4 Таймер / Counter4 Capture Event ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
      TIMER4_COMPA_vect SIG_OUTPUT_COMPARE4A Таймер / Counter4 Сравнить Совпадение ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
      TIMER4_COMPB_vect SIG_OUTPUT_COMPARE4B Таймер / Counter4 Сравнить Match B ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
      TIMER4_COMPC_vect SIG _OUTPUT_COMPARE4C Таймер / Counter4 Сравнить Match C ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
      TIMER4_OVF_vect SIG_OVERFLOW4 Таймер / Counter4 Переполнение ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
      TIMER5_CAPT_vect SIG_INPUT_CAPTURE5 Таймер / Counter5 Захват событий ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
      TIMER5_COMPA_vect SIG_OUTPUT_COMPARE5A Таймер / Counter5 Сравнить Совпадение ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
      Timer5_Comppb_vect SIG_OUTPUT_COMPARE5B
      Таймер / Counter5 Сравнить Match C ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
      TIMER5_OVF_vect SIG_OVERFLOW5 Таймер / Counter5 Переполнение ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
      TWI_vect SIG_2WIRE_SERIAL 2-проводной последовательный интерфейс AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega1284P, ATmega16, ATmega163, ATmega168P, ATmega32, ATmega323, ATmega328P, ATmega32HVB, ATmega406, ATmega48P, ATmega64, ATmega8, ATmega8535, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny48, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      TXDONE_vect SIG_TXDONE Передача Done, бит таймера Флаг 2 Прерывание AT86RF401
      TXEMPTY_vec т SIG_TXBE Передача опустошения буфера, бит Itmer Флаг 0 Прерывание AT86RF401
      UART0_RX_vect SIG_UART0_RECV UART0, Rx Полная ATmega161
      UART0_TX_vect SIG_UART0_TRANS UART0, Tx Complete ATmega161
      UART0_UDRE_vect SIG_UART0_DATA UART0 Регистр данных Пусто ATmega161
      UART1_RX_vect SIG_UART1_RECV UART1, Rx Полная ATmega161
      UART1_TX_vect SIG_UART1_TRANS UART1, Tx Complete ATMEGA161
      SIG_UART_RECV UART, RX Complete AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega103, ATmega163, ATmega8515
      UART_TX_vect SIG_UART_TRANS UART, Tx Complete AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega103, ATmega163, ATmega8515
      UART_UDRE_vect SIG_UART_DATA UART Data Register Empty AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega103, ATmega163, ATmega8515
      USART0_RXC_vect SIG_USART0_RECV USART0, Rx Complete ATmega162
      USART0_RX_vect SIG_UART0_RECV USART0, Rx Complete AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega1284P, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega329, ATmega64, ATmega645, ATme ga649, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644
      USART0_TXC_vect SIG_USART0_TRANS USART0, Tx Complete ATmega162
      USART0_TX_vect SIG_UART0_TRANS USART0, Tx Complete AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega1284P, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega3250P, ATmega329, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644
      USART0_UDRE_vect SIG_UART0_DATA USART0 Data Register Empty AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega1284P, ATmega162, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega329, ATmega64, ATmega645, ATmega6 49, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644
      USART1_RXC_vect SIG_USART1_RECV USART1, Rx Complete ATmega162
      USART1_RX_vect SIG_UART1_RECV USART1, Rx Complete AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega1284P, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      USART1_TXC_vect SIG_USART1_TRANS USART1, Tx Complete ATmega162
      USART1_TX_vect SIG_UART1_TRANS USART1, Tx Complete AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega1284P, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega32 4P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      USART1_UDRE_vect SIG_UART1_DATA USART1, Data Register Empty AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega1284P, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      USART2_RX_vect SIG_USART2_RECV USART2, Rx Complete ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
      USART2_TX_vect SIG_USART2_TRANS USART2, Tx Complete ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
      USART2_UDRE_vect SIG_USART2_DATA USART2 Data register Empty ATmega640 , ATmega1280, ATmega1281, ATmega2560, ATmega2561
      USART3_RX_vect SIG_USART3_RECV USART3, Rx Complete ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
      USART3_TX_vect SIG_USART3_TRANS USART3, Tx Complete ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
      USART3_UDRE_vect SIG_USART3_DATA USART3 Data register Empty ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
      USART_RXC_vect SIG_USART_RECV, SIG_UART_RECV USART, Rx Complete ATmega16, ATmega32, ATmega323, ATmega8
      USART_RX_vect SIG_USART_RECV, SIG_UART_RECV USART, Rx Complete AT90PWM3, AT90PWM2, AT90PWM1, ATmega168P, ATmega3250, ATmega3250P, ATmega328P, ATmega3290, AT mega3290P, ATmega48P, ATmega6450, ATmega6490, ATmega8535, ATmega88P, ATmega168, ATmega48, ATmega88, ATtiny2313
      USART_TXC_vect SIG_USART_TRANS, SIG_UART_TRANS USART, Tx Complete ATmega16, ATmega32, ATmega323, ATmega8
      USART_TX_vect SIG_USART_TRANS, SIG_UART_TRANS USART, Tx Complete AT90PWM3, AT90PWM2, AT90PWM1, ATmega168P, ATmega328P, ATmega48P, ATmega8535, ATmega88P, ATmega168, ATmega48, ATmega88, ATtiny2313
      USART_UDRE_vect SIG_USART_DATA, SIG_UART_DATA USART Data Register Empty AT90PWM3, AT90PWM2, AT90PWM1, ATmega16, ATmega168P, ATmega32, ATmega323, ATmega3250, ATmega3250P, ATmega328P, ATmega3290, ATmega3290P, ATmega48P, ATmega6450, ATmega6490, ATmega8, ATmega8535, ATmega88P, ATmega168, ATmega48, ATmega88, ATtiny2313
      USI_OVERFLOW_vect SIG_USI_OVERFLOW USI Overflow ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega3250P, ATmega329, ATmega3290, ATmega3290P, ATmega645, ATmega6450, ATmega649, ATmega6490, ATtiny2313
      USI_OVF_vect SIG_USI_OVERFLOW USI Overflow ATtiny26, ATtiny43U, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861
      USI_START_vect SIG_USI_START USI Start Condition ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega3250P, ATmega329, ATmega3290, ATmega3290P, ATmega645, ATmega6450, ATmega649, ATmega6490, ATtiny2313, ATtiny43U, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861
      USI_STRT_vect SIG_USI_START USI Start ATtiny26
      USI_STR_vect USI START ATtiny24, ATtiny44, ATtiny84
      WATCHDOG_vect SIG_WATCHDOG_TIMEOUT Watchdog Time-out ATtiny24, ATtiny44, ATtiny84
      WDT_OVERFLOW_vect SIG_WATCHDOG_TIMEOUT, SIG_WDT_OVERFLOW Watchdog Timer Overflow ATtiny2313
      WDT_vect SIG_WDT, SIG_WATCHDOG_TIMEOUT Watchdog Timeout Interrupt AT90PWM3, AT90PWM2, AT90PWM1, ATmega1284P, ATmega168P, ATmega328P, ATmega32HVB, ATmega406, ATmega48P, ATmega88P, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATmega16HVA, ATtiny13, ATtiny43U, ATtiny48, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
      .

    Добавить комментарий

    Ваш адрес email не будет опубликован.