Вектор прерывания это: Вектор прерывания — это… Что такое Вектор прерывания?

Содержание

Вектор прерывания — это… Что такое Вектор прерывания?

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

Прерывание (англ. 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, а также вызов пользовательских функций. Исключения возникают при возникновении какой-либо критической ошибки (например, деление на 0, отсутствие сопроцессора и т.д.) или при пошаговом выполнении программы (трассировка). Каждому прерыванию сопоставляется некоторая программа — обработчик прерывания, которая выполняет те или иные действия при возникновении прерывания. Для аппаратных прерываний обработчики, помимо всего прочего, выполняют управление аппаратурой. Обработчики программных прерываний обычно выполняют некоторые функции, в зависимости от входных параметров, заданных в регистрах, и могут возвращать результаты в регистрах или иным образом. Обработчики исключений выполняют специфические задачи, зависящие от конкретного случая (например, обработчик прерывания «деление на 0» обычно выдаёт сообщение об ошибке на экран). Для привязки каждого прерывания к его обработчику существует специальная таблица — так называемая таблица векторов прерываний, в которой для каждого прерывания хранится адрес обработчика в формате сегмент:смещение. Таблица располагается в памяти по абсолютному адресу 0x00000000 и собержит 256 ячеек — столько прерываний может быть в компьютере IBM PC. Сюда включены аппаратные и программные прерывания, а также исключения. Размер таблицы — 1024 байта, а размер ячейки — 4 байта (2 байта на сегмент и 2 на смещение). Некоторые ячейки в таблице векторов прерываний зарезервированы и не должны использоваться. Некоторые являются свободными и предназначены для установки пользовательских обработчиков.

Ниже представлены таблицы с описанием прерываний 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».

Для ленивых привожу ее здесь:

Английский знаем? Ну ладно, переведу 🙂

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

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


.cseg
.org 0

rjmp Reset
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP

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

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

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

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

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

Итак, пишем:


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

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

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

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

<<—Вспомним пройденное—-Поехали дальше—>>

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

Два других ответа (на момент написания) говорят о прерываниях и 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. Все параметры в процедуру и из нее передаются через регистры, какое – зависит от прерывания.

avr-libc: : Interrupts

Примечание: Это описание прерываний взято из документа Рича Несуолда. См. Благодарности.

В различных компиляторах обработка прерываний реализована по-разному, так как язык C старается оставаться подальше от машинно-зависимых подробностей. В среде WinAVR используется предустановленная таблица векторов прерываний, содержащая адреса соответствующих подпрограмм обслуживания с заранее определенными именами. Для каждой такой подпрограммы в этом библиотечном файле определен макрос: ISR(). Этот макрос регистрирует и помечает некоторую функцию как обработчик прерывания. Например, так выглядит определение обработчика для прерывания от АЦП.

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

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

Однако в редких случаях необходимо как можно раньше установить флаг глобального разрешения прерываний. Это можно сделать, используя sei () в начале программы обработки прерывания, но и в этом случае все еще остаются несколько команд в сгенерированной компилятором вводной части, с запрещёнными вложенными прерываниями. Компилятор можно проинструктировать, чтобы вставить право команды SEI в начале программы обработки прерывания, используя следующий путь:

где XXX_vect допустимое имя вектора прерывания для рассматриваемого типа MCU (рассмотрено ниже).

Прерывание выбрано, если снабжено одним из имён нижеприведённой таблицы.

В последних версиях WinAVR допустимы две формы имён векторов. Одна форма использует имена, типа SIG_XXX — это была единственная доступная форма в avr-libc до версии 1.2.x. Начиная с avr-libc версии 1.4.0, добавилась вторая форма имен вектора прерывания, XXX_vect. Где XXX соответствует векторному имени, как описано в datasheet-e соответствующего устройства (и в файлах Atmel) с пробелами, замененными символом подчеркивания, и исключены другие не алфавитно-цифровые символы. Использование суффикса _vect применено, для того чтобы улучшить совместимость с другими компиляторами C, доступным для AVR. Форма SIG_XXX в будущем может стать осуждаемой, так что использовать её в новых проектах не рекомендуется.

Макрокоманда ISR() не может осуществить побуквенную проверку переданного ей параметра. Компилятор генерирует предупреждение лишь, если обнаруживает подозрительнее имя ISR() функции, такое, после которого, макрозамена начинается не с «__vector_».

- запрещает прерывания, сбрасывая флаг глобального разрешения прерываний.

- разрешает прерывания, устанавливая флаг глобального разрешения прерываний.

- обработка прерывания, выполняется с первоначально заблокированными глобальными прерываниями.

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

- устаревший вариант, аналог - макрокоманды ISR. Не используйте SIGNAL() в новых программах. Вместо этого используйте ISR().

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

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

Этот марос поддержан только в последних версиях AVR-GCC, (GCC 4.2 или исправленной GCC 4.1.x).

Векторное имя

Старое векторное имя

Описание

Применим для устройства

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
INT ER14 USART 902 Tx Complete 900Y402_REE_REE_REE_REE
Номер вектора Определение прерывания Имя вектора
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 Время захвата события 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_TX_vect
22 Преобразование в АЦП завершено ADC_vect
23 EEPROM Ready

4

ANSI
25 Двухпроводной последовательный интерфейс TWI_vect
26 Сохранение памяти программ для чтения SPM_READY_vect
43
ATt9
INT Регистр данных ct 902 902 902 PCINT_A_A_A_A_A_
Номер вектора Определение прерывания Имя вектора
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
10 USART Tx Complete USART0_TX_vect
11 Аналоговый компаратор ANA_COMP_vect

4

ANA_COMP_vect

4

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 USI_OVERFLOW2 902 USI_OVERFLOW_ve M_READY_vect
19 Переполнение сторожевого таймера WDT_OVERFLOW_vect
20 Запрос прерывания по смене пина 1
ATtiny85
3 TIMER0_COMPB_vect
Номер вектора Определение прерывания Имя вектора
1 Запрос внешнего прерывания 0 INT0_vect
2 45 PC

13

Таймер / Счетчик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 USI_START214 9019 902 9019 USI_START214 902 9019 Таблица векторов прерываний

- OSDev Wiki

В архитектуре x86 таблица векторов прерываний (IVT) представляет собой таблицу, которая определяет адреса всех 256 обработчиков прерываний, используемых в реальном режиме.

IVT обычно располагается по адресу 0000: 0000H, и имеет размер 400H байтов (4 байта на каждое прерывание). Хотя адрес по умолчанию можно изменить с помощью инструкции LIDT на новых процессорах, обычно этого не делают, потому что это неудобно и несовместимо с другими реализациями и / или более старым программным обеспечением (например, программами MS-DOS). Однако обратите внимание, что код должен оставаться в первом МиБ ОЗУ.

Строение

Записи являются последовательными, то есть первая запись, на которую указывает IDTR, является обработчиком прерывания 0, а остальные следуют последовательно.Формат записи:

 + ----------- + ----------- +
 | Сегмент | Смещение |
 + ----------- + ----------- +
 4 2 0
 

Таким образом, мы видим, что действительно легко получить адрес искомого обработчика прерывания: IDTR * 4. Чтобы изменить обработчик прерывания, все, что нужно сделать, это изменить его адрес в таблице.

Схема прерывания ЦП

 IVT Смещение | INT # | Описание
----------- + ----------- + -------------------------- ---------
0x0000 | 0x00 | Разделить на 0
0x0004 | 0x01 | Зарезервированный
0x0008 | 0x02 | NMI прерывание
0x000C | 0x03 | Точка останова (INT3)
0x0010 | 0x04 | Переполнение (INTO)
0x0014 | 0x05 | Превышен диапазон границ (BOUND)
0x0018 | 0x06 | Неверный код операции (UD2)
0x001C | 0x07 | Устройство недоступно (WAIT / FWAIT)
0x0020 | 0x08 | Двойная ошибка
0x0024 | 0x09 | Перерасход сегмента сопроцессора
0x0028 | 0x0A | Недействительный УТП
0x002C | 0x0B | Сегмент отсутствует
0x0030 | 0x0C | Ошибка сегмента стека
0x0034 | 0x0D | Общая неисправность защиты
0x0038 | 0x0E | Ошибка страницы
0x003C | 0x0F | Зарезервированный
0x0040 | 0x10 | x87 ошибка FPU
0x0044 | 0x11 | Проверка соосности
0x0048 | 0x12 | Проверка машины
0x004C | 0x13 | Исключение SIMD с плавающей запятой
0x00xx | 0x14-0x1F | Зарезервированный
0x0xxx | 0x20-0xFF | Определяется пользователем
 

Схема аппаратного прерывания по умолчанию

Мастер 8259:

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

 IVT Смещение | INT # | IRQ # | Описание
----------- + ------- + ------- + ---------------------- --------
0x0020 | 0x08 | 0 | ЯМА
0x0024 | 0x09 | 1 | Клавиатура
0x0028 | 0x0A | 2 | 8259A подчиненный контроллер
0x002C | 0x0B | 3 | COM2 / COM4
0x0030 | 0x0C | 4 | COM1 / COM3
0x0034 | 0x0D | 5 | LPT2
0x0038 | 0x0E | 6 | Контроллер гибких дисков
0x003C | 0x0F | 7 | LPT1
 

Подчиненный 8259:

 IVT Смещение | INT # | IRQ # | Описание
----------- + ------- + ------- + ---------------------- --------
0x01C0 | 0x70 | 8 | RTC
0x01C4 | 0x71 | 9 | Не назначен
0x01C8 | 0x72 | 10 | Не назначен
0x01CC | 0x73 | 11 | Не назначен
0x01D0 | 0x74 | 12 | Контроллер мыши
0x01D4 | 0x75 | 13 | Математический сопроцессор
0x01D8 | 0x76 | 14 | Контроллер жесткого диска 1
0x01DC | 0x77 | 15 | Контроллер жесткого диска 2
 

См. Также

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

- HandWiki

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

Фон

Большинство процессоров имеют таблицу векторов прерываний, включая чипы Intel, AMD, Infineon, Microchip [1] Atmel, [2] NXP и т. Д.

Обработчики прерываний

Основная страница: Обработчик прерываний

Методы обработки

Таблица векторов прерываний используется в трех наиболее популярных методах нахождения начального адреса процедуры обслуживания прерывания:

«Предопределенный»

«Предопределенный» метод загружает программный счетчик (ПК) непосредственно адресом некоторой записи в таблице векторов прерываний. Сама таблица переходов содержит исполняемый код.Хотя в принципе чрезвычайно короткий обработчик прерывания может быть полностью сохранен внутри таблицы векторов прерываний, на практике код в каждой записи представляет собой одиночную инструкцию перехода, которая переходит к подпрограмме полного обслуживания прерывания (ISR) для этого прерывания. Intel 8080 [3] , Atmel AVR [4] [5] и все 8051 и микроконтроллеры Microchip [6] используют предопределенный подход.

"Fetch"

Метод "выборки" загружает ПК косвенно, используя адрес некоторой записи в таблице векторов прерываний для извлечения адреса из этой таблицы, а затем загружая ПК с этим адресом. [6] Каждая запись в IVT является адресом процедуры обслуживания прерывания. Все микроконтроллеры Motorola / Freescale используют метод выборки. [6]

«Подтверждение прерывания»

Для метода «подтверждения прерывания» внешнее устройство дает ЦП номер обработчика прерывания. Метод подтверждения прерывания используется Intel Pentium и многими более старыми микропроцессорами. [6]

Когда на ЦП влияет прерывание, он ищет обработчик прерывания в таблице векторов прерываний и передает ему управление.

См. Также

  • Таблица дескрипторов прерываний (реализация архитектуры x86)

Ссылки

Внешние ссылки

% PDF-1.3 % 1 0 объект > поток конечный поток эндобдж 2 0 obj > эндобдж 3 0 obj > эндобдж 4 0 obj > / Родительский 3 0 R / Содержание [19 0 R] / Тип / Страница / Ресурсы> / ProcSet [/ PDF / Text / ImageC] / Шрифт >>> / MediaBox [0 0 595.

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

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