Вектор прерывания — это… Что такое Вектор прерывания?
- Вектор прерывания
Прерывание (англ. interrupt) — сигнал, сообщающий процессору о наступлении какого-либо события. При этом выполнение текущей последовательности команд приостанавливается, и управление передаётся обработчику прерывания, который выполняет работу по обработке события и возвращает управление в прерванный код.
В зависимости от источника возникновения сигнала прерывания делятся на:
- Аппаратные — события от периферийных устройств (например, нажатия клавиш клавиатуры, движение мыши, сигнал от таймера, сетевой карты или дискового накопителя) — внешние прерывания, или события в микропроцессоре — (например, деление на ноль) — внутренние прерывания;
- Программные — инициируются выполняемой программой явным исполнением специальных инструкций, то есть синхронно, а не асинхронно. Программные прерывания могут служить для вызова сервисов операционной системы.
Термин «ловушка» (trap) иногда используется как синоним термина «прерывание», или же синоним термина «внутреннее прерывание» (см. выше). Единого словоупотребления этих терминов не существует ни в русском, ни в английском языке. Как правило, словоупотребление устанавливается в документации производителя конкретной архитектуры процессора.
Маскирование
В зависимости от возможности запрета аппаратные прерывания делятся на:
- Маскируемые — прерывания, которые можно запрещать установкой соответствующих битов в соответствующем регистре маски прерываний;
- Немаскируемые — обрабатываются всегда, независимо от значения флага IF (в процессорах
Обработчики прерываний обычно пишутся таким образом, чтобы время их обработки было как можно меньшим.
Приоритезация
До окончания обработки прерывания обычно устанавливается запрет на обработку этого типа прерывания, чтобы процессор не входил в цикл обработки одного прерывания. Приоритезация означает, что все источники прерываний делятся на классы и каждому классу назначается свой уровень приоритета запроса на прерывание. Приоритеты могут обслуживаться как относительные и абсолютные. Относительное обслуживание прерываний означает, что если во время обработки прерывания поступает более приоритетное прерывание, то это прерывание (более приоритетное) будет обработано только после завершения текущей процедуры обработки прерывания. Абсолютное обслуживание прерываний означает, что если во время обработки прерывания поступает более приоритетное прерывание, то текущая процедура обработки прерывания вытесняется, и процессор начинает выполнять обработку вновь поступившего более приоритетного прерывания. После завершения этой процедуры процессор возвращается к выполнению вытесненной процедуры обработки прерывания.
Перехват прерывания — изменение обработчика прерывания на свой собственный.
Таблица прерываний
Вектор прерывания
См. также
Wikimedia Foundation. 2010.
- Вектор перемещения
- Вектор скорости
Смотреть что такое «Вектор прерывания» в других словарях:
вектор прерывания — Одна или несколько ячеек памяти, содержащих адрес программы реакции на прерывание и/или параметры вызова этой программы. [ГОСТ Р 50304 92 ] Тематики системы для сопряж. радиоэлектр. средств интерфейсные Обобщающие термины структурная организация… … Справочник технического переводчика
вектор прерывания — pertraukties vektorius statusas T sritis automatika atitikmenys: angl. interrupt vector vok. Unterbrechungsvektor, m rus. вектор прерывания, m pranc. vecteur d interruption, m … Automatikos terminų žodynas
вектор прерывания — 44 вектор прерывания: Одна или несколько ячеек памяти, содержащих адрес программы реакции на прерывание и/или параметры вызова этой программы Источник: ГОСТ Р 50304 92: Системы для сопряжения радиоэлектронных средств интерфейсные. Термины и… … Словарь-справочник терминов нормативно-технической документации
Вектор прерывания — 1. Одна или несколько ячеек памяти, содержащих адрес программы реакции на прерывание и/или параметры вызова этой программы Употребляется в документе: ГОСТ Р 50304 92 Системы для сопряжения радиоэлектронных средств интерфейсные. Термины и… … Телекоммуникационный словарь
Вектор — Вектор многозначный термин; величина, характеризующаяся размером и направлением. В Викисловаре есть статья «вектор» … Википедия
Вектор (значения) — Вектор: Содержание 1 В биологии 2 В информатике 3 В математике 4 В физике … Википедия
вектор — 01.03.02 вектор [ vector] (1)1): Величина, представляемая значением, направлением, смысловым содержанием и началом. 1)Терминологические статьи 01.03.02 и 01.03.03 относятся к одному понятию. Источник … Словарь-справочник терминов нормативно-технической документации
Прерывания — Прерывание (англ. interrupt) сигнал, сообщающий процессору о наступлении какого либо события. При этом выполнение текущей последовательности команд приостанавливается, и управление передаётся обработчику прерывания, который выполняет работу по… … Википедия
Компонента вектора — Вектор: Содержание 1 В биологии 2 В информатике 3 В математике 4 В физике … Википедия
ГОСТ Р 50304-92: Системы для сопряжения радиоэлектронных средств интерфейсные. Термины и определения — Терминология ГОСТ Р 50304 92: Системы для сопряжения радиоэлектронных средств интерфейсные. Термины и определения оригинал документа: 75 абонент интерфейса: Радиоэлектронное средство, подключенное к интерфейсу для выдачи или приема информации… … Словарь-справочник терминов нормативно-технической документации
Прерывания
ПрерыванияПрерывания
(классификация и описание)
Введение
Все
прерывания в компьютере делятся на
аппаратные, программные и
исключения. Аппаратные прерывания
могут быть маскируемыми и
немаскируемыми. Маскируемые
прерывания могут быть запрещены
установкой флага IF, немаскируемые
прерывания не могут быть
запрещены и возникают при сбоях и
ошибках аппаратуры (например,
ошибка паритета памяти). Аппаратные
прерывания — это запросы от
периферийных устройств на
обработку данных.
Ниже представлены таблицы с описанием прерываний DOS, BIOS и некоторых других прерываний.
Прерывания BIOS
Номер прерывания | Описание |
0x00 | Деление на 0 |
0x01 | Пошаговый режим (отладка) |
0x02 | Немаскируемое прерывание |
0x03 | Точка останова (breakpoint) |
0x04 | Переполнение |
0x05 | Печать экрана (Print Screen) |
0x06 | Недопустимая команда (для 286 и выше) |
0x07 | Вызов отсутствующего сопроцессора |
0x08 | Таймер (IRQ0) |
0x09 | Клавиатура (IRQ1) |
0x0A-0x0F | IRQ2-IRQ7 |
0x10 | Видеосервис BIOS |
0x11 | Список оборудования |
0x12 | Размер нижней памяти (640 или 512Кб) |
0x13 | Дисковый ввод/вывод (работа с физическими секторами на низком уровне) |
0x14 | Обслуживание COM портов |
0x15 | AT функции (задержка, работа с джойстиком и др.) |
0x16 | Клавиатурный ввод/вывод (чтение клавиш и др.) |
0x17 | Обслуживание LPT портов |
0x18 | ROM-Basic |
0x19 | Начальная загрузка |
0x1A | Системное время |
0x1B | Обработчик Ctrl+Break |
0x1C | Процедура, вызываемая обработчиком INT 08h (заглушка) |
0x1D | Адрес таблицы параметров дисплея |
0x1E | Адрес таблицы параметров дисковода |
0x1F | Адрес таблицы графических символов |
0x33 | Функции драйвера мыши |
0x40 | Функции BIOS для дискет |
0x41 | Параметры жёсткого диска 0 |
0x42 | Перемещённый обработчик видео |
0x43 | Знакогенератор EGA |
0x44 | Nowell Netware API |
0x45 | Зарезервировано |
0x46 | Параметры жёсткого диска 1 |
0x47-0x49 | Зарезервировано |
0x4A | Будильник пользователя |
0x67 | Память EMS |
Прерывания DOS
Номер прерывания | Описание |
0x20 | Завершение программы (обычно, для COM файлов) |
0x21 | Обращение к функциям DOS |
0x22 | Адрес обработчика завершения задачи |
0x23 | Адрес обработчика Ctrl+Break |
0x24 | Адрес обработчика критической ошибки |
0x25 | Чтение логических секторов |
0x26 | Запись логических секторов |
0x27 | Создание резидентной программы |
0x28 | Ожидание нажатия клавиши |
0x29 | Вывод символа (используется DOS) |
0x2A | Сеть Microsoft |
0x2B-0x2D | Зарезервировано |
0x2E | Выполнение команды DOS |
0x2F | Мультиплексное прерывание (связь процессов) |
0x30-0x32 | Зарезервировано |
0x34-0x3E | Зарезервировано |
0x3F | Обработчик оверлеев |
Другие прерывания
Номер прерывания | Описание |
0x4B-0x5F | Зарезервировано |
0x60-0x63 | Резерв прикладных программ |
0x64 | Nowell Netware API |
0x65-0x66 | Резерв прикладных программ |
0x68-0x6F | Зарезервировано |
0x78-0x79 | Зарезервировано |
0x7A | Nowell Netware API |
0x7B-0x7F | Зарезервировано |
0x80-0xF0 | Зарезервировано для ROM BASIC |
0xF1-0xFF | Резерв прикладных программ |
Примечание: Некоторые приведённые выше прерывания DOS (например, 0x28h, 0x29) являются недокументированными. Это означает, что в последующих версиях DOS они могут быть заменены другими или вообще удалены. Использовать эти прерывания не рекомендуется.
Copyright © 1999 by HackMaster
Механизм прерывания, его общие свойства (как это обычно делается)
- Подробности
- Родительская категория: Ввод-вывод
- Категория: Прерывания
При возникновении события, на которое надо отреагировать (запроса на прерывание), обычно процессор автоматически (без участия программиста) выполняет следующие действия:
1. Заканчивается выполнение текущей команды (иногда прерывается, если команда длинная, а иногда выполняется еще одна или несколько команд).
2. Анализируется, разрешено ли прерывание. Если нет, то осуществляется переход к выполнению следующей команды.
3. Если запросов несколько, принимается решение, какой запрос обслуживать (разрешение приоритета, priority resolving). Если система запросов радиальная или источник запроса — внутреннее событие процессора (exception), то переход к .п.6.
4. При магистральной схеме запросов:
Процессор передает источникам запросов подтверждение приема запроса (этот сигнал должен достигнуть только того источника запроса, который имеет наивысший приоритет).
5. Источник запроса передает процессору идентифицирующую его информацию (каждый источник запроса может иметь собственную программу обработки, и процессор должен узнать, какой обработчик использовать).
6. Процессор сохраняет информацию о текущем контексте (текущий вектор состояния — почти всегда неполностью).
7. Адрес перехода на программу обработки прерывания хранится в определенной для каждого источника запроса прерывания области памяти, называемой вектором прерывания. Процессор загружает начальный адрес программы обработки прерывания из вектора прерывания в счетчика команд.
8. Для возврата из прерывания в системе команд обычно есть специальная команда «возврат из прерывания» (мнемоника iret, retiили rti). По этой команде восстанавливается контекст прерванной программы в том объеме, в котором он быь сохранен при входе в перывание (п.6). Эта команда должна быть последней исполняемой командой обработчика.
Приведенное описание соответствует обработке внешнего аппаратного прерывания. В случае, если причина прерывания — внутреннее событие процессора (исключительная ситуация — exception), то этапы 4 и 5 отсутствуют, как в случае радиальных прерываний.
Опишем перечисленные этапы более детально.
1. Внешний запрос прерывания приходит асинхронно (без какой-либо привязки во времени) по отношению к выполняемому потоку команд. Произвести переход на обработчик в большинстве процессоров можно только в промежутке между выполнением соседних команд, поэтому обычно выполнение текущей команды заканчивается.
В некоторых процессорах, если время выполнения текущей команды велико, ее выполнение прерывается, а после выхода из прерывания команда начинает выполняться сначала (это, например, типично для команд плавающей точки в процессорах, где они реализованы микропрограммно). В процессорах х86 прерываются команды строковых операций, но после выхода из прерывания они не начинаются сначала, а продолжают работу с того места, где были прерваны. Некоторые комбинации команд используются совместно, и прерывание между ними может привести к фатальным результатам. Такова в х86 пара команд, переустанавливающих положение стека: для этого надо поменять содержимое регистра сегмента стека и затем содержимое указателя стека. Поскольку в х86 для сохранения контекста используется стек, то прерывание между указанными двумя командами вызовет сохранение контекста (якобы в стеке) в неверном месте памяти. Для исключения такой ситуации команда загрузки в регистр сегмента стека автоматически запрещает прерывание до окончания следующей команды.
2. В некоторых ситуациях прерывание недопустимо (например, при выполнении участков программы, критичных ко времени выполнения), поэтому во всех процессорах имеется возможность запретить прерывания (по крайней мере, некоторые). Возникшие в этот период запросы могут быть потеряны, либо могут ждать обслуживания, которое произойдет, когда прерывания будут разрешены. Это зависит от устройства конкретного процессора и от свойств входов запроса прерываний. В некоторых процессорах можно программно управлять свойствами входа: запоминается или теряется запрос, который приходит в период, когда прерывания процессору запрещены. В системе команд обычно есть команды, запрещающие и разрешающие прерывание. Кроме того, внешние устройства-источники запросов нередко позволяют программно разрешить/запретить прерывание от данного устройства (прерывания от других устройств при этом будут обрабатываться).
3. При нескольких источниках запроса возможна ситуация, когда в процессор поступают одновременно несколько запросов. Это вовсе не значит, что запросы одновременно возникают, это крайне маловероятно. Однако нередка ситуация, когда в течение некоторого времени прерывание запрещено и в этот период (не одновременно) возникает несколько запросов. Когда выполнится команда «разрешить прерывание», запросы поступают в процессор равноправно. Надо каким-нибудь способом определить порядок, в котором запросы будут обрабатываться (их приоритеты). Используется несколько способов:
•а) приоритеты фиксированы и не могут быть изменены;
•б) приоритеты определяются электрической схемой, и для их изменения надо произвести переключения в схеме;
•в) приоритеты изменяются циклически: последнему обслуженному устройству присваивается самый низкий приоритет;
•г) приоритеты могут быть программно заданы в произвольной комбинации;
•… и множество других и вариантов…
4. Далее происходит обмен сигналами между источником запроса и процессором. Сначала процессор посылает сигнал подтверждения приема запроса. В частном случае сигнал подтверждения распространяется только до устройства, наиболее близкого к процессору из всех, выставивших запрос прерывания.
5. Используется несколько способов идентификации источника прерывания. В случае магистральной архитектуры устройство обычно передает процессору по магистрали информацию о себе. Эта информация обычно содержит условный код (номер) источника запроса, по которому процессор способен определить адрес памяти, содержащий информацию о местонахождении в памяти обработчика. В качестве условного кода может использоваться адрес вектора прерывания, стартовый адрес обработчика или даже полный код команды call перехода на обработчик (так было сделано в процессоре i8080).
Термин “вектор прерывания” используют в двух разных значениях:
•а) контекст (вектор состояния) обработчика, автоматически загружаемый при выполнении прерывания,
•б) участок памяти, где хранится этот контекст. Обычно для хранения контекстов обработчиков разработчики процессора выделяют в адресном пространстве специальную область векторов прерывания.
Для некоторых из прерываний разработчики процессора могут предопределить положение векторов и значения адресов перехода, в то время как другие программист может задавать по своему усмотрению программно.
6. Сохранение текущего контекста процессор чаще всего делает в стеке. В простейшем случае сохраняется содержимое счетчика команд и содержимое регистра состояния. Во многих процессорах в регистре состояния отдельные биты имеют отношение к управлению прерываниями и автоматическое сохранение слова состояния предоставляет ряд дополнительных возможностей, а иногда является просто необходимым (см. например далее «пошаговую отладку» для процессоров х86).
7. Загрузка контекста обработчика (вектора прерывания). Результат этого действия — переход на первую команду обработчика. Используются различные способы указания того, в каком адресе памяти расположена эта первая команда. Чаще всего адрес обработчика содержится в соответствующем векторе прерывания. Существенным является вопрос о том, разрешено ли прерывание после перехода на обработчик. В большинстве процессоров при входе в прерывание повторное (вложенное) прерывание автоматически запрещается. Обработчик может разрешить прерывание соответствующей командой (например, в процессорах х86 это команда sti). В этом случае возможно «вложенное» прерывание, в том числе, и от этого же источника, но для этого обработчик прерывания должен быть реентерабельным, т.е. допускать рекурсивный вызов. Кроме того, это может привести к нарушению приоритетов: менее приоритетное событие будет обслужено раньше, чем более приоритетное.
8. Возврат из прерывания восстанавливает контекст прерванной программы. Существенно, что восстанавливается состояние «разрешено/запрещено прерывание»: после возврата из прерывания возможно следующее прерывание, если есть запрос.
- < Назад
- Вперёд >
РадиоКот :: Для чего нужны прерывания?
РадиоКот >Обучалка >Микроконтроллеры и ПЛИС >Микроконтроллеры AVR — пишем, компилируем, прошиваем… >Для чего нужны прерывания?
Прерывание — это остановка извне выполнения текущей программы на время выполнения некоторой подпрограммы (которая называется «обработчик прерывания»).
Что это значит?
Прерывание возникает по некоторому внешнему сигналу, поступающему в процессор. При этом, основная программа останавливается в совершенно произвольном месте (где ее застанет прерывание), и начинается выполнение подпрограммы-обработчика. По окончании работы обработчика, выполнение основной программы возобновляется с места останова. Это бывает очень полезно, если необходимо оперативно среагировать на какое-то внешнее событие. Например, на нажатие кнопочки, на начало передачи данных… И т.д. и т.п.
В AT90s2313 существует 11 событий, по которым можно установить прерывания (прерывание — дело добровольное, хочешь — ставишь, хочешь — не ставишь). Что это за события? Открываем даташит по микросхеме на стр.19 и смотрим табличку «Reset and interrupt vectors».
Для ленивых привожу ее здесь:
Английский знаем? Ну ладно, переведу 🙂
- Reset — прерывание по сбросу (подача 0 на вывод микросхемы «Reset»; или включение питания; или по переполнению сторожевого таймера)
- INT_0 — первое внешнее прерывание (сигнал на вывод микросхемы «INT0»)
- INT_1 — второе внешнее прерывание (сигнал на «INT1»)
- Timer1_capt1 — прерывание защелки 1-го таймера
- Timer1_comp1 — прерывание компаратора 1-го таймера
- Timer1_OVF1 — по переполнению 1-го таймера
- Timer0_OVF0 — по переполнению 0-го таймера
- UART_RX — по окончанию приема пакета по протоколу UART
- UART_UDRE — по опустошению регистра данных UART
- UART_TX — по окончанию передачи пакета по UART
- ANA_COMP — прерывание аналогового компаратора
Если некоторые слова вам еще не знакомы — не отчаивайтесь, так и должно быть. Давайте лучше разбираться, что такое — Interrupt Vectors — Вектора Прерываний? А это ни что иное, как указатели на адрес ПЗУ, на который мы переходим в результате прерывания. Все векторы расположены в самом начале адресного пространства, и занимают первые 11 адресов ПЗУ (с $000 по $00A). Это прекрасно видно из таблицы. То есть, если мы, скажем, хотим активизировать прерывание Timer1_comp1, то мы должны по адресу $004 поставить ссылку на подпрограмму — обработчик этого прерывания. А вообще, лучше расставить в начале программы ссылки на все прерывания. Давайте так и сделаем.
.cseg .org 0 rjmp Reset rjmp INT_0 rjmp INT_1 rjmp Timer1_capt1 rjmp Timer1_comp1 rjmp Timer1_OVF1 rjmp Timer0_OVF0 rjmp UART_RX rjmp UART_UDRE rjmp UART_TX rjmp ANA_COMP
Так как эти команды стоят в самом начале программы, значит они как раз таки будут расположены в ПЗУ по первым 11-ти адресам. Таким образом, при каждом прерывании, будет вызываться соответствующий обработчик.
Например: по прерыванию компаратора таймера 1 (Timer1_comp1), мы перескакиваем на адрес $004, то есть — на 5-ю строчку программы. В пятой строчке стоит безусловный переход на метку Timer1_comp1. Где-то ниже в программе, мы пишем обработчик этого прерывания и в его начале ставим эту метку. Вот так все несложно…
Ну а что делать с остальными прерываниями, которые не используются? Надо все равно прописать на них метки (иначе компилятор страшно выругается), но по этим меткам ничего не делать, а тут же выходить.
Кстати, чуть не забыл:
reti — Interrupt return — выход из обработчика прерывания
Итак, пишем:
Reset: INT_0: INT_1: Timer1_capt1: Timer1_comp1: Timer1_OVF1: Timer0_OVF0: UART_RX: UART_UDRE: UART_TX: ANA_COMP: reti
Пусть вас не смущает, что столько меток стоят на одну команду: это не страшно, так можно делать. Нельзя ставить несколько ОДИНАКОВЫХ меток…
Теперь в этой куче остается только закомментировать те прерывания, которые мы используем. В частности, в любой программе используется прерывание по сбросу (Reset). Поэтому его комментируем сразу же, а уже непосредственно текст основной программы начинаем с метки Reset.
Ну вот. Теперь возвращаемся к нашим баранам. То есть — бегущим огонечкам.
<<—Вспомним пройденное—-Поехали дальше—>>
Как процессор находит код ядра после прерывания?
Два других ответа (на момент написания) говорят о прерываниях и 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.
Assembler: 26. Прерывание. Классификация. Команда INT
Прерывание означает временное прекращение основного процесса вычислений для выполнения некоторых запланированных или незапланированных действий, вызванных работой устройств или программы.
В зависимости от источника различают прерывания:
- Аппаратные (внешние) – реакция процессора на физический сигнал от некоторого устройства. Возникают в случайные моменты времени, а значит – асинхронные
- Программные (внутренние) – возникает в заранее запланированный момент времени — синхронные
- Исключения – разновидность программных прерываний, реакция процессора на некоторую не стандартную ситуацию возникшую во время выполнения команды;
Вектор прерываний – адрес процедуры обработки прерываний. Адреса размещаются в специальной области памяти доступной для всех подпрограмм. Вектор прерывания одержит 4 байта: старшее слово содержит сегментную составляющую адреса процедуры обработки исключения, младшее — смещение.
Вызов прерывания осуществляется с помощью директивы INT номер_прерывания.
00h – 1Fh – прерывания BIOS
20h – 3Fh – прерывания DOS
40h – 5Fh – зарезервировано
60h – 7Fh – прерывания пользователя
80h – FFh – прерывания Бейсика
Порядок выполнения INT:
1) В стек помещается содержимое регистра флагов FLAGS
2) Флаги трассировки и прерывания устанавливаются в нуль (TF = 0, IF = 0)
3) Вычисляется адрес соответствующего вектора прерываний – 4*номер_прерывания
4) Содержимое сегментного регистра CS помещается в стек
5) Содержимое второго слова вектора прерываний заносится в CS
6) Содержимое управляющего регистра IP заносится в стек
7) Первое слово вектора прерываний помещается в IP
Процедура используемая для обработки прерывания должна быть дальней (FAR). Возврат с прерывания осуществляется при помощи директивы IRET, которая восстанавливает CS:IP и FLAGS. Все параметры в процедуру и из нее передаются через регистры, какое – зависит от прерывания.
Векторное имя |
Старое векторное имя |
Описание |
Применим для устройства |
ADC_vect |
SIG_ADC |
аналого-цифровое преобразование завершено |
AT90S2333, AT90S4433, AT90S4434, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny13, ATtiny15, ATtiny26, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
ANALOG_COMP_0_vect |
SIG_COMPARATOR0 |
Аналоговый компаратор 0 |
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, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
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, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861 |
CANIT_vect |
SIG_CAN_INTERRUPT1 |
CAN Передача завершена или ошибка |
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, ATmega32, ATmega323, ATmega8, ATmega8515, ATmega8535, ATtiny12, ATtiny13, ATtiny15, ATtiny26, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861 |
EE_READY_vect |
SIG_EEPROM_READY |
EEPROM Готовый |
AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega406, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
EXT_INT0_vect |
SIG_INTERRUPT0 |
Внешний Запрос на прерывание 0 |
ATtiny24, ATtiny44, ATtiny84 |
INT0_vect |
SIG_INTERRUPT0 |
Внешнее Прерывание 0 |
AT90S1200, AT90S2313, AT90S2323, AT90S2333, AT90S2343, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega406, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny11, ATtiny12, ATtiny13, ATtiny15, ATtiny22, ATtiny2313, ATtiny26, ATtiny28, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
INT1_vect |
SIG_INTERRUPT1 |
Внешний Запрос на прерывание 1 |
AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega32, ATmega323, ATmega406, ATmega64, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, ATtiny28, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
INT2_vect |
SIG_INTERRUPT2 |
Внешний Запрос на прерывание 2 |
AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega32, ATmega323, ATmega406, ATmega64, ATmega8515, ATmega8535, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
INT3_vect |
SIG_INTERRUPT3 |
Внешний Запрос на прерывание 3 |
AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega406, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
INT4_vect |
SIG_INTERRUPT4 |
Внешний Запрос на прерывание 4 |
AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, 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, ATmega640, 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, ATmega329P, 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 |
прерывание по изменению уровня на выводе параллельного порта 0 |
ATmega162, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega406, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
PCINT1_vect |
SIG_PIN_CHANGE1 |
прерывание по изменению уровня на выводе параллельного порта 1 |
ATmega162, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega406, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny24, ATtiny44, ATtiny84, AT90USB162, AT90USB82 |
PCINT2_vect |
SIG_PIN_CHANGE2 |
прерывание по изменению уровня на выводе параллельного порта 2 |
ATmega3250, ATmega3290, ATmega3290P, ATmega6450, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644 |
PCINT3_vect |
SIG_PIN_CHANGE3 |
прерывание по изменению уровня на выводе параллельного порта 3 |
ATmega3250, ATmega3290, ATmega3290P, ATmega6450, ATmega6490, ATmega324P, ATmega164P, ATmega644P, ATmega644 |
PCINT_vect |
SIG_PIN_CHANGE, SIG_PCINT |
|
ATtiny2313, ATtiny261, ATtiny461, ATtiny861 |
PSC0_CAPT_vect |
SIG_PSC0_CAPTURE |
PSC0 Случай захвата |
AT90PWM3, AT90PWM2, AT90PWM1 |
PSC0_EC_vect |
SIG_PSC0_END_CYCLE |
PSC0 Конечный Цикл |
AT90PWM3, AT90PWM2, AT90PWM1 |
PSC1_CAPT_vect |
SIG_PSC1_CAPTURE |
PSC1 Случай захвата |
AT90PWM3, AT90PWM2, AT90PWM1 |
PSC1_EC_vect |
SIG_PSC1_END_CYCLE |
PSC1 Конечный Цикл |
AT90PWM3, AT90PWM2, AT90PWM1 |
PSC2_CAPT_vect |
SIG_PSC2_CAPTURE |
PSC2 Случай захвата |
AT90PWM3, AT90PWM2, AT90PWM1 |
PSC2_EC_vect |
SIG_PSC2_END_CYCLE |
PSC2 Конечный Цикл |
AT90PWM3, AT90PWM2, AT90PWM1 |
SPI_STC_vect |
SIG_SPI |
прерывание от SPI |
AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, 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 |
память программ готова |
AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega406, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIM0_COMPA_vect |
SIG_OUTPUT_COMPARE0A |
Таймер/Счетчик Совпадение A |
ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85 |
TIM0_COMPB_vect |
SIG_OUTPUT_COMPARE0B |
Таймер/Счетчик Совпадение B |
ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85 |
TIM0_OVF_vect |
SIG_OVERFLOW0 |
Таймер/Счетчик 0 Переполнение |
ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85 |
TIM1_CAPT_vect |
SIG_INPUT_CAPTURE1 |
Таймер/Счетчик 1 Захват |
ATtiny24, ATtiny44, ATtiny84 |
TIM1_COMPA_vect |
SIG_OUTPUT_COMPARE1A |
Таймер/Счетчик 1 Совпадение A |
ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85 |
TIM1_COMPB_vect |
SIG_OUTPUT_COMPARE1B |
Таймер/Счетчик 1 Совпадение B |
ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85 |
TIM1_OVF_vect |
SIG_OVERFLOW1 |
Таймер/Счетчик 1 Переполнение |
ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85 |
TIMER0_CAPT_vect |
SIG_INPUT_CAPTURE0 |
прерывание по захвату на входе |
ATtiny261, ATtiny461, ATtiny861 |
TIMER0_COMPA_vect |
SIG_OUTPUT_COMPARE0A |
Таймер/Счетчик 0 Совпадение A |
ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIMER0_COMPB_vect |
SIG_OUTPUT_COMPARE0B, SIG_OUTPUT_COMPARE0_B |
Таймер/Счетчик 0 Совпадение B |
AT90PWM3, AT90PWM2, AT90PWM1, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIMER0_COMP_A_vect |
SIG_OUTPUT_COMPARE0A, SIG_OUTPUT_COMPARE0_A |
Таймер/Счетчик 0 Совпадение A |
AT90PWM3, AT90PWM2, AT90PWM1 |
TIMER0_COMP_vect |
SIG_OUTPUT_COMPARE0 |
Таймер/Счетчик 0 Совпадение |
AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, 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, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny11, ATtiny12, ATtiny15, ATtiny2313, ATtiny28, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIMER1_CAPT1_vect |
SIG_INPUT_CAPTURE1 |
Таймер/Счетчик 1 Захват |
AT90S2313 |
TIMER1_CAPT_vect |
SIG_INPUT_CAPTURE1 |
Таймер/Счетчик 1 Захват |
AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIMER1_CMPA_vect |
SIG_OUTPUT_COMPARE1A |
Таймер/Счетчик 1 совпадение A |
ATtiny26 |
TIMER1_CMPB_vect |
SIG_OUTPUT_COMPARE1B |
Таймер/Счетчик 1 совпадение B |
ATtiny26 |
TIMER1_COMP1_vect |
SIG_OUTPUT_COMPARE1A |
Таймер/Счетчик 1 совпадение A |
AT90S2313 |
TIMER1_COMPA_vect |
SIG_OUTPUT_COMPARE1A |
Таймер/Счетчик1 Совпадение A |
AT90S4414, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIMER1_COMPB_vect |
SIG_OUTPUT_COMPARE1B |
Таймер/Счетчик1 Совпадение B |
AT90S4414, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIMER1_COMPC_vect |
SIG_OUTPUT_COMPARE1C |
Таймер/Счетчик 1 Совпадение C |
AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIMER1_COMPD_vect |
SIG_OUTPUT_COMPARE0D |
Таймер/Счетчик 1 Совпадение D |
ATtiny261, ATtiny461, ATtiny861 |
TIMER1_COMP_vect |
SIG_OUTPUT_COMPARE1A |
Таймер/Счетчик 1 Совпадение A |
AT90S2333, AT90S4433, ATtiny15 |
TIMER1_OVF1_vect |
SIG_OVERFLOW1 |
Таймер/Счетчик 1 Переполнение |
AT90S2313, ATtiny26 |
TIMER1_OVF_vect |
SIG_OVERFLOW1 |
Таймер/Счетчик 1 Переполнение |
AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny15, ATtiny2313, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIMER2_COMPA_vect |
SIG_OUTPUT_COMPARE2A |
Таймер/Счетчик 2 Совпадение A |
ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIMER2_COMPB_vect |
SIG_OUTPUT_COMPARE2B |
Таймер/Счетчик 2 Совпадение A |
ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIMER2_COMP_vect |
SIG_OUTPUT_COMPARE2 |
Таймер/Счетчик 2 Совпадение |
AT90S4434, AT90S8535, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8535 |
TIMER2_OVF_vect |
SIG_OVERFLOW2 |
Таймер/Счетчик 2 Переполнение |
AT90S4434, AT90S8535, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIMER3_CAPT_vect |
SIG_INPUT_CAPTURE3 |
Таймер/Счетчик 3 Захват |
AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIMER3_COMPA_vect |
SIG_OUTPUT_COMPARE3A |
Таймер/Счетчик 3 Совпадение A |
AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIMER3_COMPB_vect |
SIG_OUTPUT_COMPARE3B |
Таймер/Счетчик 3 Совпадение B |
AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIMER3_COMPC_vect |
SIG_OUTPUT_COMPARE3C |
Таймер/Счетчик 3 Совпадение C |
AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIMER3_OVF_vect |
SIG_OVERFLOW3 |
Таймер/Счетчик 3 Переполнение |
AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TIMER4_CAPT_vect |
SIG_INPUT_CAPTURE4 |
Таймер/Счетчик 4 Захват |
ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561 |
TIMER4_COMPA_vect |
SIG_OUTPUT_COMPARE4A |
Таймер/Счетчик 4 Совпадение A |
ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561 |
TIMER4_COMPB_vect |
SIG_OUTPUT_COMPARE4B |
Таймер/Счетчик 4 Совпадение B |
ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561 |
TIMER4_COMPC_vect |
SIG_OUTPUT_COMPARE4C |
Таймер/Счетчик 4 Совпадение C |
ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561 |
TIMER4_OVF_vect |
SIG_OVERFLOW4 |
Таймер/Счетчик 4 Переполнение |
ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561 |
TIMER5_CAPT_vect |
SIG_INPUT_CAPTURE5 |
Таймер/Счетчик 5 Совпадение |
ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561 |
TIMER5_COMPA_vect |
SIG_OUTPUT_COMPARE5A |
Таймер/Счетчик 5 Совпадение A |
ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561 |
TIMER5_COMPB_vect |
SIG_OUTPUT_COMPARE5B |
Таймер/Счетчик 5 Совпадение B |
ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561 |
TIMER5_COMPC_vect |
SIG_OUTPUT_COMPARE5C |
Таймер/Счетчик 5 Совпадение C |
ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561 |
TIMER5_OVF_vect |
SIG_OVERFLOW5 |
Таймер/Счетчик 5 Переполнение |
ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561 |
TWI_vect |
SIG_2WIRE_SERIAL |
2-проводный последовательный интерфейс (I2C) |
AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega16, ATmega163, ATmega32, ATmega323, ATmega406, ATmega64, ATmega8, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
TXDONE_vect |
SIG_TXDONE |
Transmission Done, Bit Timer Flag 2 Interrupt |
AT86RF401 |
TXEMPTY_vect |
SIG_TXBE |
Transmit Buffer Empty, Bit Itmer Flag 0 Interrupt |
AT86RF401 |
UART0_RX_vect |
SIG_UART0_RECV |
UART0, Приём закончен |
ATmega161 |
UART0_TX_vect |
SIG_UART0_TRANS |
UART0, Передача закончена |
ATmega161 |
UART0_UDRE_vect |
SIG_UART0_DATA |
UART0 опустошение регистра данных |
ATmega161 |
UART1_RX_vect |
SIG_UART1_RECV |
UART1, Приём закончен |
ATmega161 |
UART1_TX_vect |
SIG_UART1_TRANS |
UART1, Передача закончена |
ATmega161 |
UART1_UDRE_vect |
SIG_UART1_DATA |
UART1 опустошение регистра данных |
ATmega161 |
UART_RX_vect |
SIG_UART_RECV |
UART, Приём закончен |
AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega103, ATmega163, ATmega8515 |
UART_TX_vect |
SIG_UART_TRANS |
UART, Передача закончена |
AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega103, ATmega163, ATmega8515 |
UART_UDRE_vect |
SIG_UART_DATA |
UART опустошение регистра данных |
AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega103, ATmega163, ATmega8515 |
USART0_RXC_vect |
SIG_USART0_RECV |
USART0, Приём закончен |
ATmega162 |
USART0_RX_vect |
SIG_UART0_RECV |
USART0, Приём закончен |
AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega329, ATmega329P, ATmega64, ATmega645, ATmega649, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644 |
USART0_TXC_vect |
SIG_USART0_TRANS |
USART0, Передача закончена |
ATmega162 |
USART0_TX_vect |
SIG_UART0_TRANS |
USART0, Передача закончена |
AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644 |
USART0_UDRE_vect |
SIG_UART0_DATA |
USART0 опустошение регистра данных |
AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega329, ATmega329P, ATmega64, ATmega645, ATmega649, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644 |
USART1_RXC_vect |
SIG_USART1_RECV |
USART1, Приём завершен |
ATmega162 |
USART1_RX_vect |
SIG_UART1_RECV |
USART1, Приём завершен |
AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
USART1_TXC_vect |
SIG_USART1_TRANS |
USART1, Передача закончена |
ATmega162 |
USART1_TX_vect |
SIG_UART1_TRANS |
USART1, Передача закончена |
AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
USART1_UDRE_vect |
SIG_UART1_DATA |
USART1, опустошение регистра данных |
AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 |
USART2_RX_vect |
SIG_USART2_RECV |
USART2, Приём завершен |
ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561 |
USART2_TX_vect |
SIG_USART2_TRANS |
USART2, Передача закончена |
ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561 |
USART2_UDRE_vect |
SIG_USART2_DATA |
USART2 опустошение регистра данных |
ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561 |
USART3_RX_vect |
SIG_USART3_RECV |
USART3, Приём завершен |
ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561 |
USART3_TX_vect |
SIG_USART3_TRANS |
USART3, Передача закончена |
ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561 |
USART3_UDRE_vect |
SIG_USART3_DATA |
USART3 опустошение регистра данных |
ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561 |
USART_RXC_vect |
SIG_USART_RECV, SIG_UART_RECV |
USART, Приём завершен |
ATmega16, ATmega32, ATmega323, ATmega8 |
USART_RX_vect |
SIG_USART_RECV, SIG_UART_RECV |
USART, Приём завершен |
AT90PWM3, AT90PWM2, AT90PWM1, ATmega3250, ATmega3290, ATmega3290P, ATmega6450, ATmega6490, ATmega8535, ATmega168, ATmega48, ATmega88, ATtiny2313 |
USART_TXC_vect |
SIG_US |
|
|
Управление флагом глобального разрешения прерываний |
|
||
Флаг глобального разрешения прерываний расположен в регистре состояния (SREG). |
|
||
#define |
sei() |
|
|
#define |
cli() |
|
|
Макроопределения для написания функций обработки прерываний |
|
||
|
|
||
#define |
ISR(vector) |
|
|
#define |
SIGNAL(vector) |
|
|
#define |
EMPTY_INTERRUPT(vector) |
|
|
#define |
ISR_ALIAS(vector, target_vector) |
|
freescale — Расчет вектора прерывания в контроллерах на базе PowerPC
Никогда не работал с PowerPC, но с e200z3 Power Architecture ™ Базовое справочное руководство, вы сможете лучше понять.
Capter 10 в Справочном руководстве микроконтроллера MPC5534 упоминает это руководство: Прерывания, реализуемые MCU, определены в Справочном руководстве e200z3 PowerPC tm Core.
ИВПР
Основное справочное руководство, раздел 2.В 8.1.6 говорится об IVPR:
.IVPR, показанный на рисунке 2-16, используется во время обработки прерывания для определения начального адреса для программного обработчика прерывания. Значение, содержащееся в поле векторного смещения IVOR, выбранного для определенного типа прерывания, объединяется со значением в IVPR для формирования адреса инструкции, с которой должно начинаться выполнение.
В нем перечислены битовые поля этого регистра, из которых только одно: База векторов :
Определяет базовое расположение векторной таблицы, выровненное по границе 64 Кбайт.Предоставляет старшие 16 бит расположения всех обработчиков прерываний. IVPR || Значения IVORn объединяются для формирования адреса обработчика в памяти.
IVORn
IVOR, показанные на рисунке 2-17, содержат индекс четвертого слова из базового адреса, предоставленного IVPR для каждого типа прерывания.
Кроме того, в разделе 4.5 говорится:
Значение в поле векторного смещения IVOR, присвоенное типу прерывания, объединяется со значением в IVPR для формирования адреса инструкции, с которой должно начинаться выполнение.
Заключение
После того, как логика приоритета прерывания решит, какой вектор прерывания активировать, счетчик программ перейдет на адрес IVPR || ИВОРН
.
Обратите внимание, что в каждом прерывании есть место только для четырех инструкций, поэтому, если вы хотите выполнить тяжелую работу, вам нужно выполнить переход. Установка быстрого флага или переключение вывода ввода / вывода должна быть возможна без каких-либо ответвлений.
Что такое таблица векторов прерываний в микроконтроллерах ARM Cortex M?
В этом уроке мы поговорим о таблице векторов прерываний.Во-первых, мы определим таблицу векторов прерываний (IVT). Во-вторых, мы увидим роль IVT для обработки прерываний и исключений в микроконтроллерах или микропроцессорах. После этого мы увидим таблицу векторов прерываний микроконтроллера TM4C123G ARM Cortex M4.
Почти все современные процессоры и микроконтроллеры поддерживают функции прерываний и исключений, чтобы обеспечить возможность выполнения задач или потоков, управляемых событиями. В отличие от метода опроса, задачи, управляемые событиями, более эффективно используют ресурсы ЦП.В наши дни микроконтроллеры или микропроцессоры поддерживают сотни прерываний и исключений. Каждое прерывание / исключение имеет подпрограмму обслуживания прерывания (ISR), определенную где-то в памяти кода. Но вопрос в том, как процессор определяет, где находится ISR в памяти кода для конкретного прерывания? Ответ прост: микроконтроллеры используют таблицы векторов прерываний, чтобы найти начальный адрес подпрограмм ISR.
Теперь давайте начнем с определения IVT. В литературе это также обозначается аббревиатурой VT.
Что такое таблица векторов прерываний (IVT)?
Как следует из названия, это таблица, содержащая векторы. Но что такое векторы? В мире физики термин вектор означает измерение или направление. Но во встроенном программировании вектор означает адрес памяти. Следовательно, векторная таблица — это таблица, содержащая адреса памяти. Но вопрос в том, адреса какого фрагмента кода или инструкций? Ответ — прерывания или исключения. Короче говоря, таблица векторов прерываний содержит адреса (указатели функций) служб / подпрограмм прерываний и функций обработчиков исключений.
Таблица векторов прерываний — это таблица адресов памяти подпрограмм обработки прерываний / исключений. Другими словами, он определяет, где в памяти микроконтроллера находится код конкретной процедуры прерывания / исключения.
Прерывания и исключения в ARM MCU
Как мы обсуждали в последнем разделе, таблица векторов содержит адреса процедур ISR для всех прерываний и исключений, которые поддерживает микроконтроллер.
Если вы посмотрите таблицу микроконтроллера TM4C123G ARM Cortex M4, то обнаружите 15 системных исключений и 138 периферийных прерываний.Периферийные прерывания также определяются в литературе как простые исключения. Основное различие между системными исключениями и прерываниями заключается в том, что системные исключения генерируются ЦП, а периферийные прерывания генерируются различными периферийными модулями, доступными в микроконтроллерах на базе ARM Cortex.
Короче говоря, IVT микроконтроллера TM4C123GH6PM имеет 154 записи для всех прерываний и исключений.
Но не все прерывания доступны в микроконтроллере TM4C123G.Доступно только 78, и в таблице векторов зарезервировано место для тех периферийных прерываний, которые недоступны. Эти резервные прерывания могут быть доступны в других микроконтроллерах TI.
Где хранится IVT в памяти микроконтроллера?
В микроконтроллерах есть типы памяти, такие как память кода или память данных. Таблица векторов прерываний хранится во флэш-памяти / кодовой памяти микроконтроллеров ARM Cortex M4.
Если вы не знаете о типах памяти или организации памяти микроконтроллеров, прочтите этот пост:
Организация и типы памяти микроконтроллера — объяснение с помощью сегментов памяти
Если вы изучите таблицу микроконтроллера TM4C123GH6PM (стр. 107), таблица векторов прерываний хранится по начальным адресам памяти кода (начиная с 0x0000_0000).Поскольку микроконтроллер TM4C123GH6PM имеет 154 исключения (включая системные и простые исключения), таблица векторов содержит 154 записи. Первые две записи векторной таблицы — это начальное значение указателя стека и адрес функции обработчика сброса. Потому что всякий раз, когда микроконтроллер перезагружается, он выполняет шаги инициализации оборудования. Вы можете прочитать это подробное руководство по процессу загрузки микроконтроллера:
Процесс загрузки микроконтроллера — последовательность сброса
На рисунке ниже показана таблица векторов прерываний, а также их адреса и содержимое памяти.Каждый адрес памяти содержит адрес обработчиков исключений. Например. адрес 0x0000_003C содержит расположение адреса обработчика прерывания таймера systick.
Еще один момент, на который следует обратить внимание, — это номер исключения. Номер исключения используется ЦП ARM Cortex M для индексации местоположения таблицы векторов прерываний.
Таблица векторов и процедуры обслуживания прерываний / обработчики исключений определены в файле запуска микроконтроллера. Файл запуска и файл сценария компоновщика определяют способ хранения таблицы векторов прерываний в начальных 256 ячейках памяти кода микроконтроллера.Если вы не знаете о файле запуска, вам следует прочитать эту статью:
Что такое файл запуска микроконтроллеров — описание его различных функций
Потому что TM4C123G MCU поддерживает 154 исключения и прерывания. Следовательно, IVT сохраняет сначала 154 слова ПЗУ или кодовой памяти. Одно дополнительное место используется для хранения начального адреса указателя основного стека.
Роль таблицы векторов прерываний в обработке прерываний
ARM Cortex-M CPU имеет два режима работы, такие как режим потока и исключение.В обычном режиме ЦП работает в потоковом режиме. Но когда происходит прерывание, ЦП переходит из режима потока в режим исключения. В режиме исключений контроллер вложенных векторов прерываний управляет всеми запросами прерываний и исключений.
Когда происходит прерывание x, запрос прерывания будет отправлен в NVIC. Если NVIC принимает запрос исключения / прерывания x, следующим шагом NVIC является поиск начального адреса подпрограммы обслуживания прерывания или обработчика исключений. Начальный адрес соответствующей ISR или обработчика исключений хранится в таблице векторов прерываний.Затем NVIC использует номер исключения x для вычисления адреса исключения, просматривая таблицу векторов прерываний и используя содержимое этого адреса памяти (который является адресом соответствующего обработчика исключения) для выполнения обработчика исключения.
Счетчик программы будет загружен с адресом обработчика исключений, и ЦП начнет выполнять процедуру исключения.
Процедура обработки прерывания ARM cortex-M довольно длительна. Поэтому мы разместим об этом отдельную статью.
Таким образом, таблица векторов прерываний представляет собой массив указателей функций, указывающих на начальный адрес исключений или обработчиков прерываний микроконтроллера или микропроцессора. IVT обычно хранится по начальным адресам флэш-памяти или кодовой памяти.
Дополнительная литература:
Вектор прерывания — zxc.wiki
Вектор прерывания находится в компьютерной системе, привязан один программный адрес к возникновению аппаратного или программного прерывания или исключительной ситуации.Там находится программа обслуживания прерывания (ISR), которая отвечает на прерывание. Каждый источник прерывания имеет свой собственный вектор прерывания, чтобы иметь возможность выполнять определенную реакцию на прерывание с другим ISR. Специальным вектором прерывания является вектор сброса , который указывает на первую команду, которая должна быть выполнена после сброса.
Таблица векторов прерываний
Местоположение, из которого считываются векторы прерывания, отличается и точно определено для каждого типа процессора.Векторы обычно хранятся в таблице в оперативной памяти, что обеспечивает большую гибкость при манипулировании адресами перехода. Но есть также процессоры, в которых векторы прерывания жестко зашиты (например, PICmicro), или системы, в которых вектор извлекается из периферийного модуля во время цикла подтверждения прерывания.
Таблица векторов прерываний (IVT) более крупной операционной системы — это центральная структура, которая должна быть хорошо защищена от несанкционированного доступа.
Вычисление адреса подпрограммы обслуживания прерывания в реальном режимеx86
В процессоре x86 таблица векторов прерываний в реальном режиме обычно находится по адресу 0x00000000 и имеет 256 записей по 32 бита каждая (CS, IP).Чтобы найти адрес обработчика прерывания, который он ищет, ЦП нужно всего лишь умножить номер прерывания на 4, чтобы получить смещение к базовому адресу. Из имеющихся там 4 байтов он может затем вычислить сегмент и адрес смещения обработчика.
Начиная с 80286, ЦП имеет свой собственный регистр — IDTR (регистр таблицы дескрипторов прерываний), который содержит физический базовый адрес и длину IVT. IDTR также используется в реальном режиме, так что в реальном режиме теоретически возможно другое положение IVT.Однако по причинам совместимости с DOS IVT обычно не перемещается в реальном режиме.
В защищенном режиме таблица может быть размещена в любом месте адресной области и содержит до 256 дескрипторов прерываний, которые, помимо адреса перехода, содержат дополнительную информацию и спецификации приоритета. В случае неавторизованных состояний процессора или ошибок вычислений векторы исключений, содержащиеся в таблице векторов прерываний, считываются и переходят к ним.
IA-32
IA-32 имеет таблицы, которые зависят от режима работы.В реальном режиме, в котором процессор запускается, это происходит из адреса памяти 0x00000000 и имеет длину 1024 байта. У процессора 256 прерываний, размер каждого вектора — 4 байта. Вектор состоит из адреса сегмента и смещения, которые загружаются в регистры CS и IP при вызове.
В защищенном режиме таблица прерываний (которая здесь называется таблицей дескрипторов прерываний) может располагаться в любом месте памяти. Позиция указывается или считывается с помощью команд ЦП LIDT и SIDT через регистр IDT, в котором указываются физический начальный адрес и длина таблицы.Каждая запись составляет 8 байтов, поэтому максимальный размер таблицы составляет 2048 байтов. Записи отличаются от реального режима, потому что они являются дескрипторами, специфичными для IA-32. В качестве шлюза прерывания или прерывания они указывают на селектор для сегмента кода, а также содержат адрес смещения для этого сегмента или относятся к сегменту состояния задачи, структуре данных, в которой хранится полный статус программы (значения Для всех регистров и т. Д.). Записи в векторных таблицах вызываются из-за внутренних ошибок процессора (записи от 0 до 31) через внешнее соединение, которое отправляет номер вектора процессору или программным обеспечением в запущенной программе.
8080/8085 / Z80
На этих процессорах 8 прерываний. Адреса входа фиксированы и вычисляются путем умножения вектора на 8 (т.е. 00 шестнадцатеричный на 38 шестнадцатеричный ). После сброса процессоры начинают выполнение программы с 00 hex , что одновременно соответствует вектору 0. Прерывания могут быть вызваны внешним запросом — затем компонент отправляет соответствующий код операции (от C7 шестнадцатеричный до FF шестнадцатеричный ) процессору.
Модель 8085 является преемником 8080 с расширенной системой прерывания. Есть 3 строки внешних запросов, которые напрямую связаны с адресом входа. Это 5.5, 6.5 и 7.5. Адреса входа находятся посередине между адресами входа 8080: от 5,5 до 2C в шестнадцатеричном формате , от 6,5 до 34 в шестнадцатеричном формате и от 7,5 до 3C в шестнадцатеричном формате .
Z80 получил NMI (немаскируемое прерывание) как расширение 8080. Его адрес входа фиксированный: 66 шестнадцатеричный . После сброса процессор находится в режиме прерывания, совместимом с 8080.Программное обеспечение можно использовать для переключения на два других режима прерывания. В режиме IM1 всегда есть переход к вектору 7 (38 шестнадцатеричный ) для запросов внешнего прерывания . В режиме IM2 может быть создана таблица прерываний длиной 256 байт со 128 адресами входа. Для этого биты с 15 по 8 начального адреса этой таблицы вводятся в регистр процессора I. Затем модуль запуска прерывания передает биты с 7 по 1. Затем процессор считывает ячейку памяти [100 шестнадцатеричный × I + V] и [100 шестнадцатеричный × I + V + 1], который представляет начальный адрес подпрограммы обслуживания прерывания.
68 КБ
Этот процессор поддерживает 256 прерываний, начальные адреса которых хранятся в таблице. Базовый адрес сохраняется в векторном базовом регистре, к которому затем добавляется четырехкратное количество прерываний.
Вектор сброса
Эта статья или следующий раздел не обеспечены должным образом подтверждающими документами (например, индивидуальными доказательствами). Информация без достаточных доказательств может быть вскоре удалена. Пожалуйста, помогите Википедии, исследуя информацию и добавляя убедительные доказательства.Аппаратный сброс — это специальное немаскируемое прерывание, которое прерывает выполняющуюся программу и в то же время сбрасывает регистры. Для него также есть вектор, вектор сброса . Это программный адрес, к которому выполняется переход после сброса при включении питания или аппаратного сброса. Поскольку сразу после сброса содержимое ОЗУ недоступно, вектор сброса всегда находится в постоянном запоминающем устройстве ПЗУ, хранящемся в системе. Для 8086 это адрес FFFF: 0000, для 80286 — F000: FFF0.Команда перехода на пересечение сегментов, обычно находящаяся по адресам FFFF0 … FFFF4, приводит к одинаковому поведению в обоих процессорах.
C: \> отладка -u f000: fff0 F000: FFF0 EA5BE000F0 JMP F000: E05B F000: FFF5 3033 XOR [BP + DI], DH F000: FFF7 2F DAS F000: FFF8 3137 XOR [BX], SI F000: FFFA 2F DAS F000: FFFB 3038 XOR [BX + SI], BH F000: FFFD 00FC ДОБАВИТЬ AH, BH F000: FFFF C430 LES SI, [BX + SI]
У других процессоров это часто адрес 0 (0x0000).Том Шенли: Архитектура программного обеспечения защищенного режима, MindShare Inc., 1996, стр.
Векторы прерывания AVR
Ниже приведены таблицы прерываний, доступных на микроконтроллерах AVR, используемых в классе. Имя вектора — это идентификатор, который следует использовать в начале процедура обслуживания прерывания (ISR). Например, ISR для вывода ATmega328P Запрос на изменение прерывания 0 будет выглядеть так.
ISR (PCINT0_vect) { // код ISR }
Примечание: имена векторов не всегда одинаковы для одного и того же прерывания. в разных процессорах.Перед написание ISR.
ATmega328P
Номер вектора | Определение прерывания | Имя вектора | |||||||||
2 | Запрос внешнего прерывания 0 | INT0_vect | |||||||||
3 | Внешний запрос прерывания 1 | Запрос прерывания смены контакта 0 | PCINT0_vect | ||||||||
5 | Запрос прерывания смены контакта 1 | PCINT1_vect | |||||||||
6 | 902 9002 7 | Прерывание тайм-аута сторожевого таймера | WDT_vect | ||||||||
8 | Таймер / счетчик2 Сопоставление A | TIMER2_COMPA_vect | |||||||||
9 | |||||||||||
9 902 Счетчик 902 MER2_COMPB_vect | |||||||||||
10 | Переполнение таймера / счетчика2 | TIMER2_OVF_vect | |||||||||
11 | Таймер / счетчик1 Время захвата события | ER14 900C 902 902 TIMER1_COMPA_vect | |||||||||
13 | Таймер / счетчик1 Сравнение совпадений B | TIMER1_COMPB_vect | |||||||||
14 | Таймер / счетчик1 902 902 9014 902 | TIMER0_COMPA_vect | |||||||||
16 | Таймер / Счетчик 0 Сравнить Соответствие B | TIMER0_COMPB_vect | |||||||||
17 90OV214 | TIMER 902 | Таймер переполнения | Таймер переполнения 902 | Последовательная передача SPI завершена | SPI_STC_vect | ||||||
19 | USART Rx Complete | USART_RX_vect | |||||||||
20 | |||||||||||
20 | USART 902 Tx Complete USART_TX_vect | ||||||||||
22 | Преобразование в АЦП завершено | ADC_vect | |||||||||
23 | EEPROM Ready | 4 | ANSI | 900Y402_REE_REE_REE_REE||||||||
25 | Двухпроводной последовательный интерфейс | TWI_vect | |||||||||
26 | Сохранение памяти программ для чтения | SPM_READY_vect |
ATt9
Номер вектора | Определение прерывания | Имя вектора | |||
2 | Запрос внешнего прерывания 0 | INT0_vect | |||
3 | Внешний запрос прерывания 1 | Timer / Counter1 Capture Event | TIMER1_CAPT_vect | ||
5 | Timer / Counter1 Compare Match A | TIMER1_COMPA_vect 900_V214 | 902 902 902 902 902 7 | Таймер / счетчик0 Переполнение | TIMER0_OVF_vect |
8 | USART Rx Complete | USART0_RX_vect | |||
USART0_RX_vect | |||||
9 | Регистр данных ct|||||
10 | USART Tx Complete | USART0_TX_vect | |||
11 | Аналоговый компаратор | ANA_COMP_vect | |||
13 | Таймер / Счетчик1 Сравнить Соответствие B | TIMER1_COMPB_vect | |||
14 | Таймер / Счетчик0 Сравнить Совпадение A | TIMER0_COMPA_vect 9013 902 902 902 902 902 902 902 902 902 902 902 902 902 Счетчик 902 902 TIMER0_COMPB_vect | |||
16 | Условие запуска USI | USI_START_vect | |||
17 | Переполнение USI |
| |||
19 | Переполнение сторожевого таймера | WDT_OVERFLOW_vect | |||
20 | Запрос прерывания по смене пина 1 |
ATtiny85
Номер вектора | Определение прерывания | Имя вектора | ||||
1 | Запрос внешнего прерывания 0 | INT0_vect | ||||
2 | 45 PC 13 | 3Таймер / Счетчик1 Сравнить Соответствие A | TIMER1_COMPA_vect | |||
4 | Таймер / счетчик1 Переполнение | TIMER1_OVF_vect 900_ | TIMER1_OVF_vect 900_0214 | 5 6 | EEPROM Ready | EE_RDY_vect |
7 | Аналоговый компаратор | ANA_COMP_vect | ||||
45 8 | ADC2 | 45 | ADC2 902 12 | 9 | Таймер / Счетчик1 Сопоставление B | TIMER1_COMPB_vect |
10 | Таймер / Счетчик0 Сопоставление Сравнения A | TIMER0_COMPA_vect | Счетчик | Сравнить | ||
12 | Тайм-аут сторожевого таймера | WDT_vect | ||||
13 | Условие запуска USI | USI_START214 9019 902 |