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

Содержание

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

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

Процессор способен обработать до 256 различных прерываний. Все возможные события, требующие описанной выше реакции, пронумерованы от 0 до 100h (номер прерывания), и с каждым из них связана определенная программа обработки прерывания. Часть номеров прерываний зарезервированы системой, остальные предоставлены разработчику.

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

. Таблица векторов прерываний формируется в ОЗУ и занимает первый килобайт адресного пространства (с 0000:0000 до 0000:3FFFh). Таблица состоит из 256 четырехбайтовых элементов – векторов прерываний. Каждый из элементов описывает один вектор (адрес) в формате <сегмент>:<смещение>, причем в младшем двухбайтовом слове вектора записывается смещение, а в старшем — номер сегмента.

Вектора в таблице расположены в порядке возрастания номеров прерываний: нулевому прерыванию соответствует вектор, записанный по адресу 0000:0000, первому — 0000:0004 и т.д. Таким образом, номер прерывания n, умноженный на 4, однозначно указывает на точку входа в таблицу векторов прерывания (0000:4*n – адрес расположения вектора), в которой, в свою очередь, располагается указатель (адрес) на программу обработки этого прерывания9.

Таблица векторов прерываний частично инициализируется BIOS перед началом загрузки DOS, частично — при загрузке DOS. Пользовательские программы также могут модифицировать эту таблицу, переназначая некоторые из векторов прерываний (например, программы русификации клавиатуры переключают «на себя» 9-е прерывание).

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

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

Запросы центральному процессору на обработку внешних аппаратных прерываний генерируются контроллером прерываний, который принимает от внешнего источника сигнал прерывания, формирует на шине управления

запрос на прерывание и на шине данных – номер прерывания (число в диапазоне от 0 до 256), соответствующий номеру линии контроллера, на которую поступил сигнал от внешнего источника прерывания.

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

  • Из двух одновременно поступивших прерываний первым будет обрабатываться прерывание с высшим приоритетом, и только по завершению его обработки – второе прерывание.

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

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

Приоритет прерывания связан с номером линии (уровня) прерывания контроллера, к которой подключен внешний источник прерывания (не путать с номером прерывания !). Все уровни прерываний последовательно пронумерованы и сокращенно обозначаются IRQ<m>, где m – номер уровня.

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

Программное прерывание является «искусственным», оно инициируется специальной командой процессора

INT n, где n — номер прерывания. По сути дела, программное прерывание реализует специфический способ запуска программ с использованием механизма, созданного для обработки аппаратных прерываний.

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

Процедура обработки прерывания. Если запрос прерывания принят процессором на обслуживание, выполняется следующая процедура:

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

  • в процессор вводится номер прерывания, указывающий на точку входа в таблицу векторов прерываний;

  • вектор прерывания из таблицы вводится в соответствующие адресные регистры процессора, и выполняется программа обработки прерывания;

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

3.3. Таблица векторов прерываний. 3. Структура и функционирование памяти и устройств ввода-вывода вычислительных систем. Вычислительные системы, сети и телекоммуникации

Категория: 3. Структура и функционирование памяти и устройств ввода-вывода вычислительных систем

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

Процессор, получив прерывание

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

Рисунок 3.3 – Упрощенный алгоритм обработки прерывания

Пусть, например, процессор (рис. 3.3) выполнял основную программу и команду, находящуюся в адресе памяти 5000 (условно). В этот момент он получил запрос прерывания с номером (адресом вектора) 4. Процессор заканчивает выполнение команды из адреса 5000. Затем он сохраняет в стеке текущее значение счетчика команд (5001) и текущее значение PSW. После этого процессор читает из адреса 4 памяти код вектора прерывания. Пусть этот код равен 6000. Процессор переходит в адрес памяти 6000 и приступает к выполнению программы обработки прерывания, начинающейся с этого адреса. Пусть эта программа заканчивается в адресе 6100. Дойдя до этого адреса, процессор возвращается к выполнению прерванной программы. Для этого он извлекает из стека значение адреса (5001), на котором его прервали, и бывшее в тот момент PSW. Затем процессор читает команду из адреса 5001 и дальше последовательно выполняет команды основной программы.

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

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

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

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

Cтраница 1


Таблица векторов прерываний EFCOP показана ниже.  [2]

За таблицей векторов прерываний следует область, используемая для хранения ряда программ и данных MS DOS. Далее располагаются программы-обработчики прерываний. Самая большая область оперативной памяти, как правило, отведена для выполнения программы пользователя. Эта область, обычно, распадается на сегменты кода, данных стека и дополнительный, адресуемые соответствующими сегментными регистрами.  [3]

Программное прерывание тоже обслуживается через таблицу векторов прерываний, но номер прерывания указывается в составе команды, вызывающей прерывание.  [5]

В младших адресах оперативной памяти расположена таблица векторов прерываний, содержащая двести пятьдесят шесть адресов программ-обработчиков прерываний.  [6]

Отметим, что в более сложных случаях в таблице векторов прерываний могут находиться не адреса начала программ обработки прерываний, атак называемые дескрипторы ( описатели) прерываний. Но конечным результатом обработки этого дескриптора все равно будет адрес начала программы обработки прерываний.  [7]

Микропроцессор ВМ86 / ВМ88 использует эту информацию для вычисления адреса входа в таблицу векторов прерываний. Кроме того, в режиме ВМ86 функция ADI ( управления адресным интервалом) подавляется. Состояние поля А7 — А5 в ICW1, а также А10 — А8 в ICW2 игнорируется.  [9]

Процессор, получив аппаратное прерывание, заканчивает выполнение текущей команды и обращается к памяти в область

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

При каждом включении напряжения питания или нажатии клавиши сброса ПО мМС1204 инициализирует систему прерываний с базой таблицы векторов прерываний. При этом все векторы принимают нулевое значение. Пользователь управляет средствами поддержки режима реального времени, используя вышеуказанные процедуры.  [11]

Начальный адрес желательно определять, начиная с ячейки 100 памяти, чтобы не было пересечения с областью памяти, отведенной под таблицу векторов прерываний.  [12]

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

В составе подсистемы памяти МК мМС1212 ОЗУ используется для хранения данных, ПЗУ-для хранения констант и программного кода. ОЗУ статического типа реализовано на четырех БИС К541РУ2 ( 1Кх4бит) [39] и размещено в области ОООООН — 007FFH 1М — байтового адресного пространства памяти МК. Первая половина ОЗУ резервируется под организацию 256-эле-ментной таблицы векторов прерываний, вторая предназначена для организации системного стека и хранения ряда переменных. Реальный раздел резидентного ОЗУ между таблицей прерываний и оставшейся областью пользователя зависит от конкретного приложения МК.  [15]

Страницы:      1    2

Система прерываний микропроцессора. Таблица векторов прерывания

Билет 26

Система прерываний микропроцессора. Таблица векторов прерывания.

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

Чтобы не нарушить нормальный ход работы, ЭВМ должна:

–  прервать текущее выполнение программы;

–  перейти на программу обработки возникших событий;

–  обработать возникшее событие;

–  вернуться к выполнению прерванной программы.

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

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

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

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)

 

AVR Studio: как написать обработчик прерывания | avr

Микроконтроллеры без использования прерываний практически ничего не стоят. Прерывание (interrupt) получило свое название из того факта, что при срабатывании прерывания по какому-нибудь событию нормальное выполнение программы прерывается, и выполняется особый код — код обработчика прерывания (interrupt handler). Прерывания можно рассматривать просто как подпрограммы, которые приостанавливают нормальный процесс выполнения программы до тех пор, пока код подпрограммы обработчика прерывания не будет завершен. После того, как обработчик прерывания завершит свою работу, ядро микроконтроллера вернется к исполнению основной программы точно в той точке, где она была прервана прерыванием. События прерывания обычно происходят от каких-то внешних асинхронных воздействий на микроконтроллер — например, переключение логического уровня на внешнем выводе порта, либо переполнение регистра таймера, что означает истечение заданного интервала времени, и т. д.

Почему же прерывания так важны? Например, мы могли бы обойтись без прерываний, в бесконечном цикле опрашивая возникновение интересующих нас событий. Такое функционирование программы называется опросом (polling). Но опрос имеет много недостатков и неудобств — к примеру, программа будет тратить на циклы ресурс ядра, который мог быть потрачен на выполнение других действий. Это одна из причин, почему у микроконтроллера есть много источников прерывания, которые могут использоваться при необходимости. Вместо проверки событий на возникновение микроконтроллер имеет возможность прервать нормальный поток программы при возникновении события и переключиться на действия обработчика события прерывания (ISR, interrupt service routine), затем вернуться обратно и продолжить выполнение основной программы.

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

Векторами прерывания называют адреса перехода на обработчик прерывания. Список таких адресов называется таблицей векторов прерываний, и он находится в памяти программ по заранее известному адресу. У микроконтроллеров AVR таблица векторов прерываний находится в самом начале памяти программ FLASH по адресу 0. Содержимое таблицы векторов прерываний определяет программист, когда ему нужно реализовать обработку прерываний.

Каждый вектор прерывания AVR занимает в памяти 2 байта (1 слово кода инструкций AVR), и представляет из себя команду rjmp относительный_адрес. Вот так, например, выглядит на языке ассемблера полностью заполненная таблица прерываний микроконтроллера ATmega16:

$000 rjmp RESET               ;сброс (начало программы)
$001 rjmp INT0_vect           ;внешнее прерывание 0
$002 rjmp INT1_vect           ;внешнее прерывание 1
$003 rjmp TIMER2_COMP_vect    ;прерывание совпадения сравнения таймера 2
$004 rjmp TIMER2_OVF_vect     ;прерывание переполнения таймера 2
$005 rjmp TIMER1_CAPT_vect    ;прерывание события захвата таймера 1
$006 rjmp TIMER1_COMPA_vect   ;прерывание совпадения сравнения A таймера 1
$007 rjmp TIMER1_COMPB_vect   ;прерывание совпадения сравнения B таймера 1
$008 rjmp TIMER1_OVF_vect     ;прерывание переполнения таймера 1
$009 rjmp TIMER0_OVF_vect     ;прерывание переполнения таймера 0
$00A rjmp SPI_STC_vect        ;прерывание завершения передачи SPI
$00B rjmp USART_RXC_vect      ;прерывание завершения приема байта UART
$00C rjmp USART_UDRE_vect     ;прерывание опустошения регистра передачи UART
$00D rjmp USART_TXC_vect      ;прерывание завершения передачи байта UART
$00E rjmp ADC_vect            ;прерывание завершения преобразования АЦП
$00F rjmp EE_RDY_vect         ;прерывание готовности EEPROM
$010 rjmp ANA_COMP_vect       ;прерывание изменения сигнала на выходе компаратора
$011 rjmp TWI_vect            ;прерывание двухпроводного интерфейса TWI (I2C)
$012 rjmp INT2_vect           ;внешнее прерывание 2
$013 rjmp TIMER0_COMP_vect    ;прерывание совпадения сравнения таймера 0
$014 rjmp SPM_RDY_vect        ;прерывание готовности к записи памяти программ

Такая полностью заполненная векторами таблица никогда не применяется. На практике обычно используется только 1..4 прерывания, в этом случае не используемые адреса векторов могут остаться не инициализированными. Обратите внимание, что в левом столбце метками обозначены шестнадцатеричные адреса инструкций, соответствующие байтовые адреса будут в 2 раза больше (потому что инструкция rjmp занимает 2 байта).

В этой статье на примере обработчика прерывания таймера 1 для ATmega16 рассказывается, как организовать обработчик прерывания в проекте GCC. Показаны два варианта реализации — на языке C и ассемблера. В примерах алгоритм работы таймера отличается, но это не важно для рассмотрения методов организации обработчика прерывания.

[Обработчик прерывания на C]

Это самый простой вариант. В данном примере используется следующий алгоритм — основная программа настраивает таймер 1 и запускает обработчик прерывания. Этот обработчик срабатывает раз в секунду и заботится о себе сам, подстраивая величину счетчика TCNT1 (чтобы прерывания происходили точно раз в секунду). Обработчик раз в секунду также декрементирует счетчик времени timer, который устанавливается и отслеживается в основной программе. Прерывание таймера разрешено постоянно (разрешается при старте программы). Таким образом, основная программа может получить любую задержку времени в интервале от 1 до 255 секунд.

Процесс по шагам:

1. Настраиваем таймер и разрешаем прерывание для него. Этот код должен вызываться однократно, при старте программы. Для этого можно написать отдельную процедуру, например:

#include <avr/io.h>
..
 void SetupTIMER1 (void){
    //На частоте тактов 16 МГц прерывание переполнения T/C1
    // произойдет через (счет до 65535):
    // 1 << CS10 4096 mkS (нет прескалера Fclk)
    // 1 << CS11 32.768 mS (Fclk/8)
    // (1 << CS11)|(1 << CS10) 262.144 mS (Fclk/64)
    // 1 << CS12 1048.576 mS (Fclk/256)
    TCCR1B = (1 << CS12);
    TCNT1 = 65536-62439;        //коррекция счетчика, чтобы время было ровно 1 секунда
    /* Разрешение прерывания overflow таймера 1. */
    TIMSK = (1 << TOIE1);}

2. В любом из модулей проекта (можно в общем, где функция main, а можно в отдельном, например timer.c) пишем код обработчика прерывания таймера. Вот пример такого кода:

#include <avr/interrupt.h>#include <avr/io.h>
..
 u8 timer;
 
ISR (TIMER1_OVF_vect){
    //теперь прерывание будет происходить через 62439 тиков
    // таймера 1, что на частоте 16 МГц составит 1 сек.
    TCNT1 = 65536-62439;
    //Далее идет код, который будет работать каждую секунду.
    //Желательно, чтобы этот код был короче.
    if (timer)
        timer--;}

3. В нужном месте разрешаем прерывания программы. Это делается также однократно, после того как сделаны все приготовления:

    sei();

[Обработчик прерывания на ASM]

Этот вариант не многим сложнее, просто организован по-другому. Я его сделал на основе отдельного файла, который содержит только код на языке ассемблера. Алгоритм тут тоже другой — обработчик прерывания срабатывает раз в секунду и сам себя запрещает. Основная программа отслеживает это событие и меняет секундные счетчики (выполняет все действия, которые нужно выполнять раз в секунду), и нова разрешает прерывание. Такой алгоритм позволяет ускорить обработку прерывания, что может быть критично для некоторых задач (например, только так можно организовать точный отсчет времени при использовании библиотеки V-USB). Процесс по шагам:

1. Настраиваем таймер. Это может делать код на C. Все точно так же, как и с обработчиком прерывания на C (см. шаг 1).

2. Готовим файл с нашим кодом обработчика на языке ассемблера. Вот пример кода:

#include <avr/io.h>
    .text
    .global TIMER1_OVF_vect
TIMER1_OVF_vect:
    push    R24
    ldi     R24, 0
    out     _SFR_IO_ADDR(TIMSK), R24
    pop     R24
    reti

Этот код будет работать очень быстро, поскольку короткий. Он почти ничего не делает, только запрещает прерывание от таймера 1 (в регистре TIMSK сбрасываются все флаги, в том числе и нужный нам флаг TOIE1). Запускать прерывание будет основная программа, как только обнаружит, что прерывание запрещено (путем анализа состояния флага TOIE1).

3. В нужном месте разрешаем прерывания программы. Это делается также однократно, после того как сделаны все приготовления:

    sei();

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

..void main (void){
    ..
    while (1)
    {
        ..
        if (0==(TIMSK & (1 << TOIE1)))
        {
            TCNT1 = ONE_SECOND;
            TIMSK = (1 << TOIE1);
            //далее действия, которые будут происходить 
            // раз в секунду
            ..
        }
        ..
    }}

[Общие замечания]

Можно заметить, что в обоих примерах использовалась именованная константа TIMER1_OVF_vect, которая задает адрес вектора прерывания таймера 1. Имена констант можно узнать во включаемом файле процессора. Для ATmega16, например, это будет файл c:\WinAVR-20080610\avr\include\avr\iom16.h. Чтобы имена стали доступны, не нужно добавлять именно этот файл в проект директивой #include, достаточно добавить #include <avr/io.h> и задать макроопределение, задающее тип процессора (например, MCU = atmega16. Это можно сделать либо в Makefile, либо в свойствах проекта).

При использовании одновременно нескольких прерываний в AVR важно помнить, что прерывания имеют фиксированный, ненастраиваемый приоритет. Чем меньше адрес вектора прерывания, тем приоритет у прерывания выше. Этот приоритет срабатывает, если при выходе из прерывания имеется несколько необработанных флагов прерывания. Прерывание с более высоким приоритетом НЕ может временно приостановить уже работающий обработчик прерывания с меньшим приоритетом, чтобы немедленно выполнить свой код. Работает система примерно так:

— когда общие прерывания разрешены (установлен бит I в регистре SREG, этот бит называют Global Interrupt Enable), то может быть вызвано любое разрешенное прерывание с любым приоритетом. Бит Global Interrupt Enable может быть принудительно сброшен или установлен командами CLI или SEI соответственно.
— для того, чтобы прерывание могло сработать и вызвать свой обработчик, кроме установки бита Global Interrupt Enable необходимо также установить бит разрешения соответствующего прерывания. Для таймеров-счетчиков это биты регистра TIMSK, для интерфейса SPI — бит SPIE в регистре SPCR, и т. д.
— когда срабатывает любое прерывание, то сразу очищается флаг I (Global Interrupt Enable), и автоматически запрещаются все прерывания, пока не произойдет выход из обработчика прерывания. Если во время работы обработчика прерывания возникали условия, при которых должны были сработать другие прерывания, то эти другие прерывания не вызываются, а просто запоминаются соответствующие им флаги (прерывания «откладываются» на будущее). При выходе из обработчика прерывания запомненные флаги прерывания запустят нужный обработчик прерывания в соответствии с назначенным ему приоритетом (если на данный момент имеется несколько отложенных прерываний).
— разработчик может в обработчике прерывания вызвать команду SEI (которая установит флаг Global Interrupt Enable), тем самым разрешив выполнение других прерываний во время работы этого обработчика прерывания. Тогда, если произойдет новое другое прерывание до завершения текущего обработчика (в котором уже была вызвана команда SEI), текущий обработчик прерывания будет приостановлен, адрес возврата в него будет сохранен в стеке и будет вызвано новое прерывание. Таким способом можно обеспечить некое подобие соблюдения приоритета — в низкоприоритетных обработчиках прерывания должна первой стоять команда SEI, а в высокоприоритетных обработчиках команда SEI должна отсутствовать, что обеспечит выполнение этого обработчика полностью.

Отсутствие возможности четко настроить приоритет — довольно серьезный недостаток платформы AVR.

[Ссылки]

1. Как комбинировать программу на Си (C) с кодом ассемблера (ASM).

Таблица дескрипторов прерываний IDT | dev64

В данном посте речь пойдёт об Interrupt Descriptor Table. Я продолжаю перевод 6 главы руководства: “Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A & 3B): System Programming Guide”.

6.10 INTERRUPT DESCRIPTOR TABLE (IDT)

Таблица дескрипторов прерываний (IDT) задает каждому исключению или вектору прерывания gate дескриптор для процедуры или задачи, используемой для обработки связанного исключения или прерывания. Подобно GDT и LDT, таблица дескрипторов прерываний является массивом 8-ми байтных дескрипторов (в защищённом режиме). В отличии от GDT, первый дескриптор в таблице дескрипторов прерываний IDT содержит дескриптор. Для вычисления смещения (index) в IDT, процессор умножает вектор исключения или прерывания на 8 (размер дескриптора прерывания в байтах). Так как есть только 256 векторов прерываний или исключений, в таблице дескрипторов прерываний не нужно хранить больше чем 256 дескрипторов. Все пустые дескрипторы в таблице дескрипторов прерываний должны иметь флаг present установленный в 0.

Базовый адрест таблицы дескрипторов прерываний IDT должен быть выравнен на 8-ми байтной границы для максимизации скорости работы кэша. Значение limit выраженное в байтах добавляется к базовому адресу для получения адреса последнего валидного байта. Значение limit = 0 означает ровно 1 валидный байт. Поскольку записи в таблице дескрипторов прерываний — 8ми байтные, limit должен быть всегда на 1-цу меньше, чем произведение N на 8. (т.е. 8*N — 1).

Таблица дескрипторов прерываний IDT может распологаться где угодно в линейном адресном пространстве. Как показано на рисунке 6-1, процессор находит таблицу дескрипторов прерываний используя регистр IDTR. Этот регистр хранит и 32-битный базовый адрес и 16-ти битный limit для таблицы векторов прерываний IDT.


(Иллюстрация взята из руководства Intel)

Инструкции LIDT (load IDT register) и SIDT (store IDT register) загружают и сохраняют содержимое регистра IDTR. Инструкция LIDT загружает регистр IDTR базовым адресом и лимитом передаваемым операндом в памяти. Эта инструкция может быть выполнена только когда CPL (Current Protection Level) = 0. Обычно эта инструкция используется инициализирующим кодом операционной системы при создании таблицы дескрипторов прерываний IDT. Операционная система также может использовать инструкцию для переключения с одной таблицы дескрипторов прерываний на другую. Инструкция SIDT копирует значение base и limit хранящаеся в IDTR в память. Эта инструкция может выполняться на любом уровне привилегий.

Если вектор прерываения ссылается на десриптор за пределами лимита IDT, генерируется general-protection exception (#GP).

Замечание

Поскольку прерывания доставляются в processor code лишь один раз, неверно сконфигурированная таблица дескрипторов прерываний может привести к неполной обработке прерывания и(или) блокированию доставки прерываний. Архитектура IA-32 требует установки полей base/limit/access для каждого поля в gate дескрипторах. То же самое относится к Intel 64 архитектуре. Это включает явные ссылки на destination code segment через GDT или LDT и доступ к стеку.

Продолжение здесь…

Понравилось это:

Нравится Загрузка…

Похожее

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

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

Регулировка распределения стека. Для процессоров Cortex-M требования к размеру стека могут сильно отличаться от 8-битной или 16-битной архитектуры.Кроме того, методы определения местоположения и размера стека также отличаются от 8-битных и 16-битных средств разработки.

Расширения языка C, специфичные для архитектуры/инструментальной цепочки. Многие компиляторы C для 8-разрядных и 16-разрядных микроконтроллеров поддерживают ряд расширений языка C. К ним относятся специальные типы данных, такие как регистры специальных функций (SFR) и битовые данные в 8051, или различные операторы «#pragma» в различных компиляторах C.

Управление прерываниями – при программировании 8-битных и 16-битных микроконтроллеров конфигурация прерываний обычно выполняется путем записи непосредственно в регистры управления прерываниями.При переносе приложений на семейство процессоров ARM ® Cortex-M такой код необходимо преобразовать для использования функций управления прерываниями CMSIS-Core. Например, включение и отключение прерываний можно преобразовать в «__enable_irq()» и «__disable_irq()». Конфигурация отдельных прерываний может обрабатываться различными функциями NVIC в CMSIS-Core.

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

Ассемблерный код и встроенный ассемблер. Очевидно, что весь ассемблерный и встроенный ассемблерный код необходимо будет переписать. В большинстве случаев можно переписать нужную функцию на C при портировании приложения на микроконтроллеры Cortex-M.

Невыровненные данные — некоторые 8-битные или 16-битные микроконтроллеры могут поддерживать невыровненные данные. В обычных ситуациях компиляторы C не генерируют невыровненные данные, если мы не используем атрибут __packed при объявлении данных.Обработка невыровненных данных менее эффективна, чем выровненные данные в Cortex-M3 и Cortex-M4, и не поддерживается в Cortex-M0/M0+. В результате может потребоваться изменить некоторые определения структур данных или код манипулирования указателями для лучшей переносимости и эффективности. При необходимости мы все еще можем применить атрибут __packed в структурах данных для поддержки невыровненных элементов данных внутри.

Корректировка кода из-за различий в размерах данных – Как описано в разделе 24.2.1 целые числа в большинстве 8-битных и 16-битных процессоров являются 16-битными, тогда как в архитектурах ARM целые числа являются 32-битными. Например, при переносе файла программы с этих процессоров на архитектуру ARM мы можем захотеть изменить «int» в коде на «short int» или «int16_t» (в «stdint.h», представленном в C99), поэтому чтобы размер не изменился.

Плавающая запятая. Как описано в разделе 24.2.1, программа, использующая вычисления с плавающей запятой, может потребовать модификации при переносе с 8-битной/16-битной архитектуры на архитектуру ARM.

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

ivt (WinDbg) — драйверы Windows

  • Статья
  • 2 минуты на чтение
Полезна ли эта страница?

Полезна ли эта страница?

да Нет

Любая дополнительная обратная связь?

Отзыв будет отправлен в Microsoft: при нажатии кнопки отправки ваш отзыв будет использован для улучшения продуктов и услуг Microsoft.Политика конфиденциальности.

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

В этой статье

Расширение !ivt отображает таблицу векторов прерываний Itanium.

  !ivt [-v] [-a] [Вектор]
!ivt -?
  

Важно   Эта команда устарела в отладчике Windows версии 10.0.14257 и более поздних и больше недоступна.

Параметры

Vector
Задает запись в таблице векторов прерываний для текущего процессора. Если Вектор опущен, отображается вся таблица векторов прерываний для текущего процессора на целевом компьютере. Неназначенные векторы прерывания не отображаются, если не указана опция -a .

-a
Отображает все векторы прерываний, включая неназначенные.

-v
Отображает подробный вывод.

-?
Отображает справку для этого расширения в окне команд отладчика.

DLL

Windows 2000

Недоступно

Windows XP и более поздние версии

Kdexts.dll

Эту команду расширения можно использовать только с целевым компьютером Itanium.

Дополнительная информация

Дополнительные сведения о том, как отображать таблицы диспетчеризации прерываний на целевом компьютере x64 или x86, см. в разделе !idt .

Замечания

Вот пример вывода этого расширения:

  kd> !ivt

Сброс IA64 IVT:

00:e000000083005f60 nt!KiPassiveRelease
0f:e000000083576830 hal!HalpPCIISALine2Pin
10:e0000000830067f0 nt!KiApcInterrupt
20:e000000083006790 nt!KiDispatchInterrupt
30:e000000083576b30 hal!HalpCMCIHandler
31:e000000083576b20 hal!HalpCPEIHandler
41:e000000085039680 i8042prt!I8042KeyboardInterruptService (KINTERRUPT e000000085039620)
51:e000000085039910 i8042prt!I8042MouseInterruptService (KINTERRUPT e0000000850398b0)
61:e0000000854484f0 VIDEOPRT!pVideoPortInterrupt (KINTERRUPT e000000085448490)
71:e0000000856c9450 NDIS!ndisMIsr (КИНТЕРРУПТ e0000000856c93f0)
81:e0000000857fd000 SCSIPORT!ScsiPortInterrupt (KINTERRUPT e0000000857fcfa0)
91:e0000000857ff510 atapi!IdePortInterrupt (KINTERRUPT e0000000857ff4b0)
a1:e0000000857d84b0 atapi!IdePortInterrupt (KINTERRUPT e0000000857d8450)
a2:e0000165fff2cab0 portcls!CInterruptSyncServiceRoutine (KINTERRUPT e0000165fff2ca50)
b1:e0000000858c7460 ACPI!ACPIInterruptServiceRoutine (KINTERRUPT e0000000858c7400)
b2:e0000000850382e0 USBPORT!USBPORT_InterruptService (KINTERRUPT e000000085038280)
d0:e0000000835768d0 hal!HalpClockInterrupt
e0:e000000083576850 hal!HalpIpiInterruptHandler
f0:e0000000835769c0 hal!HalpProfileInterrupt
f1:e000000083576830 hal!HalpPCIISALine2Pin
fd:e000000083576b10 hal!HalpMcRzHandler
fe:e000000083576830 hal!HalpPCIISALine2Pin
  

Таблица векторов прерываний | Кольцеукладчик-робототехник

Автор: Антониус (@sw0rdm4n)
http:///www.Ringlayer.net

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

  • аппаратное прерывание, это внешнее прерывание, вызванное оборудованием; например при нажатии на клавиатуру.
  • Немаскируемое прерывание (NMI), прерывание, которое не может быть проигнорировано микропроцессором.
  • Программное прерывание, это маскируемое прерывание, которое исходит от программного обеспечения; это прерывание происходит, когда подпрограмма сборки выполняет инструкцию int
  • Внутреннее прерывание, это прерывание является результатом нарушения состояния процессора, например: ошибка деления на ноль
  • Сброс, это прерывание сбросит состояние процессора

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

Таблица векторов прерываний на 8086 представляет собой вектор, состоящий из 256 прерываний, размещенных в первом 1 КБ памяти от 0000h до 03ffh, где каждый вектор состоит из сегмента и смещения в виде таблицы поиска или перехода к адресу памяти процедуры обслуживания прерываний BIOS ( от f000h до ffffh) или адрес подпрограммы обслуживания прерывания dos, вызов подпрограммы обслуживания прерывания аналогичен вызову дальней процедуры.
Размер каждого вектора прерывания составляет 4 байта (2 слова из 16 бит), где 2 байта (1 слово) для сегмента и 2 байта для смещения адреса процедуры обработки прерывания.
Таким образом, для таблицы векторов прерываний требуется 1024 байта (1 КБ) памяти. На 8086 с операционной системой dos таблица векторов прерываний по адресам 00h-1fh (целые числа 0-31) состоит из таблицы поиска/перехода
по адресу аппаратного обеспечения или подпрограммы обработчика прерываний BIOS, в то время как 20h-ffh (целые числа 32-255) состоят из адрес таблицы перехода к подпрограмме обработчика прерывания DOS.
Например, int 13h, расположенный на ivt по адресу 0000:004c, содержит адрес процедуры обслуживания прерываний ПЗУ Bios, то, что он записывает, является сегментом F000h и смещением 1140h, каждый байт этого адреса будет размещен с прямым порядком байтов. Чем меньше номер прерывания в таблице векторов прерываний, тем больший приоритет требуется для прерывания.

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

Ниже приведен пример объявления прерывания биоса из исходного кода биоса на 8086tiny исходный код биоса:

 ; Таблица векторов прерываний - скопировать в 0:0
int_table dw int0
          дв 0xf000
          dw int1
          дв 0xf000
          dw int2
          дв 0xf000
          dw int3
          дв 0xf000
          дв int4
          дв 0xf000
          дв int5
          дв 0xf000
          дв int6
          дв 0xf000
          дв int7
          дв 0xf000
          dw int8
          дв 0xf000
          dw int9
          дв 0xf000
          дв инта
          дв 0xf000
          дв междунар
          дв 0xf000
          дв инк
          дв 0xf000
          дв междунар.
          дв 0xf000
          д.в.
          дв 0xf000
          dw intf
          дв 0xf000
          dw int10
          дв 0xf000
          dw int11
          дв 0xf000
          dw int12
          дв 0xf000
          dw int13
          дв 0xf000
          dw int14
          дв 0xf000
          dw int15
          дв 0xf000
          dw int16
          дв 0xf000
          dw int17
          дв 0xf000
          dw int18
          дв 0xf000
          dw int19
          дв 0xf000
          dw int1a
          дв 0xf000
          dw int1b
          дв 0xf000
          dw int1c
          дв 0xf000
          dw int1d
          дв 0xf000
          дв int1e
 

При загрузке таблица векторов прерываний инициализируется биосом в ПЗУ, затем таблица векторов прерываний загружается в ОЗУ.

: Микропроцессор получает соответствующую запись в таблице векторов прерываний, умножая номер прерывания на 4h. Например, если вызывается int 16h: 16 * 4 = 58h. Соответствующий логический адрес , который содержит адрес подпрограммы rom bios для int num 4h , будет 0000h:0058h.

Механизм прерывания

Например, сигнал прерывания процессору может быть подан при нажатии на клавиатуру. Затем сигнал прерывания будет отправлен через системную шину на приоритетный / программируемый логический контроллер
(примером часто используемого pic в архитектуре 8086 является 8259a PIC).
PIC определит, маскируется ли imr (регистр маски прерывания) или нет, если imr установлен в 1, irq не будет отправлен процессору, в противном случае, если imr установлен в 0,
PIC определит приоритет прерывания, проверив сервисный регистр прерывания ( ISR), где чем меньше номер прерывания, тем выше приоритет, после завершения последовательности процессору будет отправлено прерывание.,
Если флаг прерывания на микропроцессоре установлен в 0, процессор будет игнорировать входящий сигнал прерывания. Но если флаг прерывания на микропроцессоре установлен в 1, как только процессор получит сигнал прерывания, микропроцессор остановит текущее выполнение.
Затем микропроцессор сохраняет регистры флагов, а затем помещает адрес следующего счетчика выполнения (cs:ip) в стек для последующего возврата. Затем микропроцессор отправит подтверждение на PIC, затем PIC отправит процессору номер прерывания. Затем это число будет умножено на 4 в качестве адреса смещения таблицы векторов прерываний.
Затем микропроцессор выполнит поиск, чтобы найти соответствующий адрес сегмента (cs) и адрес смещения (ip) адреса isr из таблицы векторов прерываний, после обнаружения процессор установит флаг прерывания в 0 (отключение прерывания), а затем и адрес сегмента, и адрес смещения. подпрограммы обслуживания прерываний, взятой из таблицы векторов прерываний, будет помещено в cs:ip, где cs — адрес сегмента подпрограммы обслуживания прерываний (ISR), а ip (указатель инструкции) — адрес смещения подпрограммы обслуживания прерываний, после чего процессор начнет выполнение подпрограммы из подпрограммы обслуживания прерывания (аналогично дальнему вызову).
После выполнения процедуры обслуживания прерывания/обработчика прерываний процессор вернет обратно cs и ip, затем вернет флаговый регистр в стеке, затем микропроцессор вернется к адресу, ранее сохраненному в стеке, который теперь находится на cs:ip.

Другим примером механизма с точки зрения программного обеспечения является выполнение ассемблерной программой функции int 13h 1h (операция получения последнего состояния диска). Процессор запишет флаговый регистр и программный счетчик для адреса возврата в стек, где он будет использоваться для команды iret, чтобы вернуться к следующей процедуре программного обеспечения после завершения инструкции процедуры прерывания.
Следующее выполнение процессора будет искать соответствующую запись для прерывания номер 13h в таблице векторов прерываний.
Как уже упоминалось ранее, адрес смещения в таблице векторов прерываний представляет собой номер прерывания, умноженный на 4: 13h * 4h = 4ch = 0000:004c (0000:004c на ivt содержит логический адрес прерывания 13h ISR-адреса).
После того, как найдена запись, содержащая 1 слово сегмента (cs) и 1 слово смещения (ip) адреса подпрограммы BIOS для службы прерывания 13h диска, она будет загружена в cs и ip.
На основании вычислений cs будет и ip будет взят из rom bios адрес, который рекордер по адресу таблицы векторов прерываний 0000:004c.
Затем выполнение будет направлено (дальний вызов) на абсолютный адрес подпрограммы BIOS, которая обрабатывает функцию int 13h 1h, например, вот пример подпрограммы BIOS, которая обрабатывает функцию int 13h 0h для сброса диска (исходный код 8086tiny bios):

 int13:
cmp ах, 0x00 ; Сбросить диск
я int13_reset_disk
cmp ах, 0x01 ; Получить последний статус
я int13_last_status
------- разрезанный -----------
int13_last_status:
мов ах, [cs:disk_laststatus]
je ls_no_error
стк ; установить флаг переноса
ирет
    ls_no_error:
клк
ирет
 

После того, как ассемблерная программа вызовет int 13h , микропроцессор сохранит флаговый регистр и счетчик программы (адрес текущего выполнения), затем микропроцессор выполнит поиск, чтобы найти соответствующую запись для «int 13h» в таблице векторов прерываний.
Как только соответствующая запись будет найдена, она перейдет к соответствующей метке биоса int 13h (дальний вызов), поскольку мы используем функцию 1h, следующая инструкция перейдет к метке int13_last_status.
На метке int13_last_status мы видим инструкцию: «mov ah, [cs:disk_laststatus]», которая переместит байт по адресу, указанному cs:disk_laststatus. Абсолютный адрес cs:disk_laststatus содержит байт кода ошибки диска биоса, если 0 означает отсутствие ошибки, а не 0
означает наличие ошибки недавней операции с диском.
Если ah = 0, то перед iret будет выполнена инструкция сброса флага переноса, но если обнаружена ошибка, следующая инструкция установит флаг переноса перед iret.
После выполнения iret инструкция будет возвращена к следующей подпрограмме ассемблерной программы, которая вызывает int 13h.

Другой пример: когда вызывается функция int 21h 2a, когда микропроцессор определяет, что прерывание является приоритетным, а не текущим выполнением, микропроцессор сохраняет флаговый регистр, программный счетчик в стек.Еще раз, микропроцессор будет искать в таблице векторов прерываний. Как и ранее, логический адрес int 21h в таблице векторов прерываний можно найти по смещению 0084h в таблице векторов прерываний. Мы получили смещение IVT, умножив номер прерывания на 4. Для прерывания 21h расчет для получения адреса вектора прерывания: «21h * 4h = 84h = 0000h:0084h». Таким образом, запись для адреса ISR int 21h из таблицы векторов прерываний находится по логическому адресу 0000:00084h.
Микропроцессор выполнит дальний вызов для адреса процедуры прерывания, где этот адрес записан по логическому адресу таблицы векторов прерываний 0000h:0084h.Например вот на мс дос 2:

 процедура $GET_DATE,NEAR ;системный вызов 42
ПРЕДПОЛАГАЕМ DS:НИЧЕГО,ES:НИЧЕГО
; Входы:
; Никто
; Функция:
; Вернуть текущую дату
; Возвращает:
; Дата в CX:DX

        НАЖМИТЕ СС
        ПОП DS
ПРЕДПОЛАГАЕМ DS:DOSGROUP
        вызвать READTIME ;Проверить перенос на следующий день
        MOV AX,[ГОД]
        MOV BX,WORD PTR [ДЕНЬ]
        invoke get_user_stack ;Получить указатель на пользовательские регистры
ПРЕДПОЛАГАЕМ DS:НИЧЕГО
        МОВ [СИ.user_DX],BX ;DH=месяц, DL=день
        ADD AX,1980 ;Вернуть смещение
        MOV [SI.user_CX],AX ;CX=год
        MOV AL,BYTE PTR [ДЕНЬ НЕД]
        РЕТ
$GET_DATE КОНЕЦ
 

Один раз вернуться :

 AL = день недели (0 = воскресенье)
CX = год (1980-2099)
ДЧ = месяц (1-12)
DL = день (1-31)
 

После завершения выполнения прерывания (сразу после iret) процессор вернется к следующей инструкции, которая ранее была записана в стек, вытолкнув ее обратно в cs и ip (ранее следующая инструкция приостанавливалась, когда микропроцессор получал irq от pic).

Некоторые прерывания Bios (базовая система ввода-вывода)

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

интервал 10 ч

Процедура обработки

int 10h была предоставлена ​​BIOS, это прерывание используется для операций в видеорежиме.
Пример: функция int 10h 00h.

Это для настройки режима видео.
требование:

 ah = видеорежим
ал = 00ч
 

Пример использования функции int 10h 00h:

 ;10_0.как м
;int 10h функция 00h демонстрация
;это для установки режима видео
;сделано Антониусом (sw0rdm4n)
;http://www.ringlayer.net
;компилировать с помощью tasm 2.0 и tlink 3.0
;tasm 10_0.asm
;tссылка /t 10_0.obj
.модель крошечная
.данные
strx дб 'h5x0r$'
  
.код
орг 100ч
Начало:
движение ал, 00ч; установить режим видео с разрешением 40 x 25
позвони _uber

мов ал, 02ч; установить режим видео с разрешением 80 x 25
позвони _uber

мов ал, 06ч; установить режим видео 640 x 200 разрешение
позвони _uber

мов ал, 13ч; установить видеорежим разрешение vga 640 x 480
позвони _uber

через 20ч

_uber прок рядом
позвонить _setvideo
вызов _printf
позвонить _wait
ретн
_uber endp
_printf proc рядом
mov dx, смещение strx
мов ах, 09h
через 21 час
ретн
_printf endp
_wait процесс рядом
мов ах, 00ч
16 часов
ретн
_дождаться окончания
_setvideo процесс рядом
мов ах, 00ч
через 10 часов
ретн
_setvideo endp
конец начало
 

интервал 12ч

int 12h используется для получения размера памяти.Это прерывание вернет содержимое слова в сегменте 0040h и смещение 0013h в регистр оси.

Пример кода:

 ;память.asm
;получить объем памяти
;возвращает содержимое слова в сегменте 0040h и смещение 0013h в регистр оси
;сделано Антониусом (@sw0rdm4n)
;http://www.ringlayer.net
.модель крошечная
.данные
_память дв 00
.код
орг 100ч
Начало:
xor топор, топор
через 12 часов
нет
через 20ч
конец начало
 

Сборка: tasm memory.asm, ссылка: tlink /t memory.obj, затем отладка «memory.ком”

мы видим сразу после выполнения iret из подпрограммы биоса, регистр ax будет содержать 1 слово: 0280. Дамп содержимого памяти
по адресу 0040:0013 :

Мы видим, что он содержит байты в прямом порядке байтов: 80 02, в не прямом порядке = 0280h, в десятичном = 640. Таким образом, мы получили размер памяти 640 КБ.

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

Прерывание Dos — это подпрограммы прерывания, предоставляемые dos, в таблице векторов прерываний 20h-3fh — прерывание вектора dos.Ниже приведены некоторые прерывания dos (полные списки не приводим)

интервал 21 час

int 21h — коды функций DOS, предоставляемые операционной системой DOS. Пример
: « int 21h function 35h », эта функция прерывания используется для получения адреса процедуры обработки прерывания, где он записан в таблице векторов прерываний.

Требования
:
ах = 35ч
al = номер прерывания
 

После выполнения функции int 21h 35h регистр es (дополнительный сегмент 16 бит) будет адресом сегмента ISR, а регистр bx (базовый регистр 16 бит) будет адресом смещения ISR.

Пример кода, использующего функцию int 21h 35h:

 ;getivt.asm
; простая процедура для получения содержимого таблицы векторов прерываний
;сегмент isr будет сохранен в регистре es
;смещение isr будет сохранено в регистре bx
; скомпилировать:
;tasm getivt.asm
;tссылка /t getivt.obj
;программист: Антониус (sw0rdm4n)
;http://www.ringlayer.net
.модель крошечная
.данные
_сегмент dw 0000h
_offset dw 0000h
.код
орг 100ч
Начало:
мов бл,13ч ; получить стандартный адрес BIOS для int 13h
вызов _get_ivt
нет
нет
вызовите _cleanres
мов бл, 21ч ; получить стандартный адрес ОС для int 21h
вызов _get_ivt
нет
нет
вызовите _cleanres
мов бл, 10ч ; получить стандартный адрес биоса для int 10h
вызов _get_ivt
нет
нет
вызовите _cleanres
интервал 20ч; вернуться к работе
_cleanres proc рядом
xor bx, bx
рет
_cleanres endp
_get_ivt proc рядом
мов ах, 35ч
мов ал, бл
через 21 час
ретн
_get_ivt endp
конец начало
 

Давайте посмотрим, какие вышеперечисленные подпрограммы выполняются в фоновом режиме.Скомпилируйте с помощью tasm 2.0 и tlink 3.0:

Отладьте его с помощью debug.exe: «debug getivt.com», затем пошагово по типу: «t», затем введите до первого выполнения int 21h:

Мы видим, что bx содержит смещение адреса подпрограммы int 13h, полученной из rom bios (в ОЗУ): 1140h. Между тем, es содержит адрес сегмента подпрограммы BIOS, который служит int 13h : f000h.
Таким образом, подпрограмма BIOS, обеспечивающая ISR для прерывания 13h, начинается с адреса f000h:1140h. В таблице векторов прерываний можно найти int 13h на 0000:004c (13h * 4h = 4ch).
Чтобы выгрузить содержимое памяти в 0000:004c, введите: «d 0000:004c l 4» означает, что мы хотим выгрузить 4 байта из памяти в сегменте 0000h со смещением 004ch.

Мы можем видеть, что на 0000:004c содержится 1 слово для сегмента и 1 слово для смещения адреса процедуры обслуживания прерывания для int 13h, которая закодирована с использованием прямого порядка байтов: 1 слово (2 байта) для смещения: 40 11 и 1 слово (2 байт) для сегмента: 00 f0. Где, если закодировано не с прямым порядком байтов, смещение = 1140h, а если сегмент закодирован не с прямым порядком байтов = f000h.Мы перепроверили, что isr-адрес процедуры дескриптора 13h сопоставлен с адресом f000:1140 .

функция int 21h 2ah

Это прерывание используется для получения системной даты, после выполнения iret isr cx будет содержать год, dh — месяц, dl — день. В прошлом эта рутина в основном использовалась для вируса бомбы замедленного действия.

Пример кода:

 ;дата.asm
;как только будет выполнено iret of isr,
;cx будет содержать год
;dh содержит месяц
;dl содержит день
; закодировано 8 сентября 2014 г.
;от sw0rdm4n
.модель крошечная
.данные
_timebomb_year dw 07deh
_timebomb_month дб 09h
_timebomb_day дб 08h
_timebomb_msg db "Запуск бомбы замедленного действия AlexanderPD - извините, сэр!", 13,10, '$'
.код
орг 100ч
Начало:
мов ах, 2ах
через 21 час
_timing_bomb_check:
cmp cx, _timebomb_year
je _check_month
через 20ч
_check_month:
cmp dh,_timebomb_month
je _check_day
через 20ч
_check_day:
cmp дл, _timebomb_day
je _timebomb_joke
через 20ч
_timebomb_шутка:
позвонить _setvid
мов ах, 09h
mov dx, смещение _timebomb_msg
через 21 час
через 20ч
_setvid proc рядом
мов аль, 0h
мов ах, 00ч
через 10 часов
рет
_setvid endp
конец начало
 

При каждом выполнении этого кода 8 сентября 2014 г. будет отображаться шуточное сообщение:

разборка — Найдите точку входа в таблице векторов прерываний ARM9

Первые байты являются векторами исключений:

  КОД: 00000000 LDR ПК, = 0x1000005C
КОД:00000004 ; -------------------------------------------------- -------------------------
КОД: 00000004 LDR ПК, = 0x10000044
КОД:00000008 ; -------------------------------------------------- -------------------------
КОД: 00000008 LDR ПК, = 0x10000048
КОД: 0000000C ; -------------------------------------------------- -------------------------
КОД: 0000000C LDR ПК, =0x1000004C
КОД:00000010 ; -------------------------------------------------- -------------------------
КОД: 00000010 LDR ПК, = 0x10000050
КОД:00000010 ; -------------------------------------------------- -------------------------
КОД:00000014 ВЫРАВНИВАНИЕ 8
КОД: 00000018 LDR ПК, = 0x10000054
КОД:0000001C ; -------------------------------------------------- -------------------------
КОД: 0000001C LDR ПК, =0x10000058
КОД:0000001C ; -------------------------------------------------- -------------------------
КОД: 00000020 off_20 DCD 0x1000005C ; ССЫЛКА НА ДАННЫЕ: КОД: 00000000↑r
КОД: 00000024 off_24 DCD 0x10000044 ; ССЫЛКА НА ДАННЫЕ: КОД: 00000004↑r
КОД: 00000028 off_28 DCD 0x10000048 ; ССЫЛКА НА КОД: sub_1D8↓j
КОД:00000028 ; ССЫЛКА НА ДАННЫЕ: КОД: 00000008↑r ...
КОД: 0000002C off_2C DCD 0x1000004C ; ССЫЛКА НА ДАННЫЕ: КОД: 0000000C↑r
КОД: 00000030 off_30 DCD 0x10000050 ; ССЫЛКА НА ДАННЫЕ: КОД: 00000010↑r
КОД: 00000034 off_34 DCD 0x10000054 ; ССЫЛКА ДАННЫХ: КОД: 00000018↑r
КОД: 00000038 off_38 DCD 0x10000058 ; ССЫЛКА НА ДАННЫЕ: КОД: 0000001C↑r
  

Очевидно, код отображается по адресу 0x10000000 . После перебазирования мы видим, что найденные вами циклы являются фиктивными обработчиками:

  КОД: 10000000 LDR ПК, =Reset_Handler
КОД: 10000004 ; -------------------------------------------------- -------------------------
КОД: 10000004 LDR ПК, =Undef_Hander
КОД: 10000008 ; -------------------------------------------------- -------------------------
КОД: 10000008 LDR ПК, =SWI_Handler
КОД: 1000000C; -------------------------------------------------- -------------------------
КОД: 1000000C LDR ПК, =PrefAbort_Handler
КОД: 10000010 ; -------------------------------------------------- -------------------------
КОД: 10000010 LDR ПК, = DataAbort_Handler
КОД: 10000010 ; -------------------------------------------------- -------------------------
КОД: 10000014 ВЫРАВНИВАНИЕ 8
КОД: 10000018 LDR ПК, = IRQ_Handler
КОД: 1000001C ; -------------------------------------------------- -------------------------
КОД: 1000001C LDR ПК, =FIQ_Handler
КОД: 1000001C ; -------------------------------------------------- -------------------------
КОД: 10000020 off_10000020 DCD Reset_Handler ; ССЫЛКА НА ДАННЫЕ: КОД: 10000000↑r
КОД:10000024 off_10000024 DCD Undef_Hander ; ССЫЛКА НА ДАННЫЕ: КОД: 10000004↑r
КОД: 10000028 off_10000028 DCD SWI_Handler ; ССЫЛКА НА ДАННЫЕ: КОД: 10000008↑r
КОД: 1000002C off_1000002C DCD PrefAbort_Handler ; ССЫЛКА НА ДАННЫЕ: КОД: 1000000C↑r
КОД: 10000030 off_10000030 DCD DataAbort_Handler ; ССЫЛКА НА ДАННЫЕ: КОД: 10000010↑r
КОД: 10000034 off_10000034 DCD IRQ_Handler ; ССЫЛКА НА ДАННЫЕ: КОД: 10000018↑r
КОД: 10000038 off_10000038 DCD FIQ_Handler ; ССЫЛКА НА ДАННЫЕ: КОД: 1000001C↑r
КОД: 1000003C aV10 DCB "v1.0"
КОД: 10000040 DCD 0x1C200
КОД: 10000044
КОД: 10000044 ; =============== ПОДПРОГРАММА ================================== =====
КОД: 10000044
КОД: 10000044 ; Атрибуты: нет возврата
КОД: 10000044
КОД:10000044 Undef_Hander ; КОД ВНЕШНЯЯ ССЫЛКА: КОД: 10000004↑j
КОД: 10000044 ; Undef_Hander↓j
КОД: 10000044 ; ССЫЛКА НА ДАННЫЕ: ...
КОД:10000044 B Undef_Hander
КОД: 10000044 ; Конец функции Undef_Hander
КОД: 10000044
КОД:10000048
КОД: 10000048 ; =============== ПОДПРОГРАММА ================================== =====
КОД:10000048
КОД: 10000048 ; Атрибуты: нет возврата
КОД:10000048
КОД: 10000048 SWI_Handler ; КОД ВНЕШНЯЯ ССЫЛКА: КОД: 10000008↑j
КОД: 10000048 ; SWI_Handler↓j
КОД: 10000048 ; ССЫЛКА НА ДАННЫЕ: ...
КОД: 10000048 B SWI_Handler
КОД: 10000048 ; Конец функции SWI_Handler
КОД:10000048
КОД: 1000004C
КОД: 1000004C ; =============== ПОДПРОГРАММА ================================== =====
КОД: 1000004C
КОД: 1000004C ; Атрибуты: нет возврата
КОД: 1000004C
КОД: 1000004C PrefAbort_Handler ; КОД ВНЕШНЯЯ ССЫЛКА: КОД: 1000000C↑j
КОД: 1000004C ; PrefAbort_Handler↓j
КОД: 1000004C ; ССЫЛКА НА ДАННЫЕ: ...
КОД: 1000004C B PrefAbort_Handler
КОД: 1000004C ; Конец функции PrefAbort_Handler
КОД: 1000004C
КОД:10000050
КОД: 10000050 ; =============== ПОДПРОГРАММА ================================== =====
КОД:10000050
КОД: 10000050 ; Атрибуты: нет возврата
КОД:10000050
КОД: 10000050 DataAbort_Handler ; КОД ВНЕШНЯЯ ССЫЛКА: КОД: 10000010↑j
КОД: 10000050 ; DataAbort_Handler↓j
КОД: 10000050 ; ССЫЛКА НА ДАННЫЕ: ...
КОД: 10000050 B DataAbort_Handler
КОД: 10000050 ; Конец функции DataAbort_Handler
КОД:10000050
КОД: 10000054
КОД: 10000054 ; =============== ПОДПРОГРАММА ================================== =====
КОД: 10000054
КОД: 10000054 ; Атрибуты: нет возврата
КОД: 10000054
КОД: 10000054 IRQ_Handler ; КОД ВНЕШНЯЯ ССЫЛКА: КОД: 10000018↑j
КОД: 10000054 ; IRQ_Handler↓j
КОД: 10000054 ; ССЫЛКА НА ДАННЫЕ: ...
КОД: 10000054 B IRQ_Handler
КОД: 10000054 ; Конец функции IRQ_Handler
КОД: 10000054
КОД: 10000058
КОД: 10000058 ; =============== ПОДПРОГРАММА ================================== =====
КОД: 10000058
КОД: 10000058 ; Атрибуты: нет возврата
КОД: 10000058
КОД: 10000058 FIQ_Handler ; КОД ВНЕШНЯЯ ССЫЛКА: КОД: 1000001C↑j
КОД: 10000058 ; FIQ_Handler↓j
КОД: 10000058 ; ССЫЛКА НА ДАННЫЕ: ...
КОД: 10000058 B FIQ_Handler
КОД: 10000058 ; Конец функции FIQ_Handler
КОД: 10000058
КОД: 1000005C ; -------------------------------------------------- -------------------------
КОД: 1000005C
КОД: 1000005C Reset_Handler ; КОД ВНЕШНЯЯ ССЫЛКА: КОД: 10000000↑j
КОД: 1000005C ; ССЫЛКА НА ДАННЫЕ: КОД: 10000000↑o ...
КОД: 1000005C MOV R1, #0x12
КОД: 10000060 ОРР R0, R1, #0
КОД:10000064 MCR p15, 0, R0,c9,c1, 1
КОД: 10000068 MOV R1, #0x12
КОД: 1000006C ОРР R0, R1, #0x100000
КОД:10000070 MCR p15, 0, R0,c9,c1, 0
КОД:10000074 MRC p15, 0, R0,c1,c0, 0
КОД: 10000078 ОРР R0, R0, #0x50000
КОД: 1000007C MCR p15, 0, R0, c1, c0, 0
КОД: 10000080 LDR R0, = 0x5200F010
КОД: 10000084 LDR R1, [R0]
КОД: 10000088 ОРР R1, R1, #0xE
КОД: 1000008C СТР R1, [R0]
КОД: 10000090 LDR R12, =sub_10000140
КОД: 10000094 BX R12 ; sub_10000140
  

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

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

Автор вопроса: Сайлас Диккенс
Оценка: 4,6/5 (43 голоса)

1 Ответ. На ПК таблица векторов прерываний (IVT) всегда располагается по адресу в ОЗУ . По умолчанию он расположен по адресу 0000:0000 в начале памяти, но его можно переместить с помощью инструкции LIDT.

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

Таблица векторов прерываний обычно располагается в первых 1024 байтах памяти по адресам 000000H–0003FFH .Он содержит 256 различных векторов прерываний. Каждый вектор имеет длину 4 байта и содержит начальный адрес ISR. Этот начальный адрес состоит из сегмента и смещения ISR.

Что хранится в таблице векторов прерываний?

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

Где хранится процедура обслуживания прерывания?

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

Что такое таблица векторов прерываний, где она хранится, можете ли вы изменить ее местоположение?

Хотя таблица векторов прерываний находится в начале памяти при сбросе процессора Cortex-M, можно переместить таблицу векторов в другое место в памяти .

26 связанных вопросов найдено

Какое прерывание имеет более высокий приоритет?

Какое прерывание имеет наивысший приоритет среди прерываний, перечисленных ниже? Объяснение: Прерывание IE0(External INT0) имеет наивысший приоритет среди всех прерываний.

В чем разница между IDT и IVT?

Это структуры ЦП, которые ОС инициализирует для обработки прерываний и исключений.В режиме реальной адресации структура содержит только адреса ISR. Этот формат известен как IVT. В защищенном режиме структура более сложная и называется IDT.

Что происходит, когда возникает прерывание и до выполнения ISR?

Когда устройство вызывает прерывание, скажем, в процессе i, процессор сначала завершает выполнение инструкции i. Затем он загружает счетчик программ (ПК) с адресом первой инструкции ISR . … Это называется задержкой прерывания.

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

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

Каковы недостатки отключения прерываний?

Отключение прерываний имеет следующие недостатки:

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

Какой регистр отвечает за включение или отключение прерываний?

Регистр IE (разрешение прерывания)

Этот регистр отвечает за разрешение и запрет прерывания.

Как используются векторы прерываний?

Вектор прерывания — это расположение в памяти обработчика прерывания , который определяет приоритеты прерываний и сохраняет их в очереди, если более одного прерывания ожидают обработки…. Как только ОС сохранила состояние выполнения, она начинает выполнять обработчик прерывания в векторе прерывания.

Что такое обработка прерываний в Linux?

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

Что такое задержка прерывания и почему она существует?

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

Какие существуют типы прерываний?

Типы прерываний

  • Аппаратные прерывания.Электронный сигнал, отправленный внешним устройством или аппаратным обеспечением для связи с процессором, указывающий на необходимость немедленного вмешательства. …
  • Программные прерывания. …
  • Прерывание по уровню. …
  • Прерывание по фронту. …
  • Общие запросы на прерывание (IRQ) …
  • Гибрид. …
  • Сообщение – сигнализировано. …
  • Дверной звонок.

Какое из следующих прерываний не является векторным прерыванием?

INTR — единственное невекторное прерывание в микропроцессоре 8085.Маскируемые прерывания — это прерывания, которые могут быть отключены или проигнорированы микропроцессором. Эти прерывания запускаются либо по фронту, либо по уровню, поэтому их можно отключить. INTR, RST 7.5, RST 6.5, RST 5.5 являются маскируемыми прерываниями в микропроцессоре 8085.

Почему отключение прерываний плохо?

1 Ответ. Отключение прерываний на всех процессорах, преднамеренно или непреднамеренно, , сделает систему полностью невосприимчивой .

Как отключить все прерывания?

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

Можно ли отключить процесс прерывания?

Операционная система — Отключение прерываний — Блокировка переменных — Строгое чередование.Самое простое решение состоит в том, чтобы каждый процесс отключал все прерывания сразу после входа в свой CS и снова включал их непосредственно перед выходом из него. При отключенных прерываниях процессор не может переключиться на другой процесс .

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

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

Почему компьютеры используют прерывания?

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

Можно ли прерывать прерывания?

Прерывания не прерывают друг друга . … На самом деле прерывание с более высоким приоритетом может вытеснить («прерывать») прерывание с более низким приоритетом во время его выполнения.

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

Использование IDT запускается тремя типами событий: аппаратными прерываниями, программными прерываниями и исключениями процессора , которые вместе называются прерываниями.IDT состоит из 256 векторов прерываний, первые 32 из которых (0–31 или 0x00–0x1F) используются для исключений процессора.

Сколько дескрипторов может содержать IDT?

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

Какая польза от таблицы векторов прерываний?

Таблица векторов прерываний, часто сокращенно называемая IVT или просто IV, представляет собой массив указателей на функции, связанные с ЦП для обработки определенных исключений, таких как сбои, запросы системных служб от приложения и запросы на прерывание от периферийных устройств.

прерываний

прерываний
  • Обработка прерываний является альтернативой опросу.

  • Микропроцессоры Intel поддерживают аппаратные прерывания через:
  • Два контакта, которые разрешают запросы на прерывание, INTR и NMI
  • type=disk>
  • Один контакт, который подтверждает, INTA, прерывание, запрошенное на INTR.
  • тип=диск>

  • И программные прерывания через инструкции:
  • INT, INTO, INT 3, BOUND
  • type=disk>

  • Управление осуществляется через
  • Биты флагов IF и TF
  • type=disk>
  • IRET и IRETD
  • тип=диск>
  • Аналогичным образом ведут себя INT и INT3.
    • INT номер:
      • Вызывает ISR, расположенный в векторе n (n*4).
      • Для инструкции INT требуется два байта памяти, код операции плюс n.

  • BOUND и INTO являются условными.
      • AX сравнивается с DATA и DATA+1, если происходит меньшее количество прерываний.
      • AX сравнивается с DATA+2 и DATA+3, если происходит прерывание.

    • ИНТО:
      • Проверяет флаг переполнения (OF).Если OF=1, вызывается ISR.

  • IRET удаляет из стека 6 байтов, 2 для IP, 2 для CS и 2 для FLAGS.
  • После выполнения каждой инструкции микропроцессор определяет, активно ли прерывание, проверяя в следующем порядке:
  • Другие исполнения инструкций
  • type=disk>
  • Одношаговый
  • тип=диск>
  • Тип NMI
  • = диск>
  • Переполнение сегмента сопроцессора
  • type=disk>
  • INTR
  • тип=диск>
  • INT
  • тип=диск>

  • Если присутствует одно или несколько из этих условий, то:
  • FLAGS помещается в стек
  • type=disk>
  • Флаги прерывания (IF) и прерывания (TF) сбрасываются, что отключает вывод INTR и функцию прерывания или пошагового выполнения.
  • тип=диск>
  • CS и IP помещаются в стек.
  • тип=диск>
  • Содержимое вектора прерывания извлекается и загружается в CS и IP, а выполнение возобновляется в ISR.
  • тип=диск>
  • На IRET выскакивают CS, IP и FLAGS.
  • тип=диск>
    • IF и TF устанавливаются в состояние до прерывания.
  • Адрес возврата (CS/IP) помещается в стек во время прерывания.

  • Обратный адрес может указывать на:
  • Следующая инструкция.
  • тип=диск>
  • Нарушающая (текущая) инструкция.
  • тип=диск>
    • Последний случай имеет место для прерываний 0, 5, 6, 7, 8, 10, 11, 12 и 13.
      • Это дает возможность повторить инструкцию.

Защищенный режим:

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

  • Вместо этого в таблице дескрипторов прерываний (IDT) используется 256 дескрипторов прерываний.
  • Вывод INTR должен быть декодирован извне для выбора вектора.
    • Возможен любой вектор, но обычно используются векторы прерываний между 20H и FFH (Intel резервирует векторы между 00H и 1FH).

  • INTA — это выход микропроцессора, сигнализирующий внешнему декодеру о размещении номера прерывания на соединениях шины данных D7-D0.

  • Вывод INTR устанавливается внешним устройством (8259A) и очищается в ISR.
    • Вход автоматически отключается микропроцессором после того, как он распознан и повторно включен командой IRET или IRETD.
    • Временная диаграмма рукопожатия.
  • Самый простой способ генерации вектора прерывания:
  • Если какой-либо из IRQx становится низким, NAND становится низким, запрашивая прерывание.

  • Обратите внимание, что если более одного IRQ становится низким, генерируется уникальный вектор прерывания, и необходимо определить приоритет прерывания.
    • Для этого необходимо расширить таблицу векторов прерываний.
  • 8259A добавляет к микропроцессору 8 кодированных прерываний с векторным приоритетом.

  • Его можно расширить до 64 запросов на прерывание, используя один ведущий модуль 8259A и 8 подчиненных устройств.
  • CS и WR должны быть декодированы. Другие подключения напрямую к микро.
  • Значение остальных подключений:
  • WR
  • тип=диск>
    • Подключается к сигналу стробоскопа записи (один из 8 для Pentium).
  • РД
  • тип=диск>
    • Подключается к сигналу IORC.
  • INT
  • тип=диск>
    • Подключается к выводу INTR на микропроцессоре.
  • INTA
  • тип=диск>
    • Подключается к контакту INTA на микропроцессоре.
  • A0
  • тип=диск>
    • Выбор различных командных слов в 8259A.
  • Тип CS
  • =диск>
    • Выбор чипа — включает 8259A для программирования и управления.
  • Тип SP/EN
  • =диск>
    • Ведомая программа (1 для ведущего, 0 для ведомого)/Включить буфер (управляет приемопередатчиками шины данных в режиме буферизации).
  • CAS2-CAS0
  • тип=диск>
    • Используется в качестве выходов от ведущего к ведомым в каскадных системах.
  • Один 8259A подключен к 8086.
  • Программируется командными словами инициализации (ICW) и операции (OCW).

  • Есть 4 ИКВ.
    • При включении должны быть отправлены ICW1, ICW2 и ICW4.
    • Если ICW1 указывает на каскадный режим, то также необходимо отправить ICW3.

    • LTIM указывает, запускаются ли линии IRQ по положительному фронту или по уровню.
    • Эти биты определяют номера векторов, используемых с входами IRQ.
      • Например, если запрограммировано генерировать векторы 08H-0FH, 08H помещается в эти битовые позиции.
  • ICW3:
  • тип=диск>
    • Полностью вложенный режим позволяет ведущему распознавать запрос на прерывание с наивысшим приоритетом от ведомого устройства, пока он обрабатывает другое прерывание от ведомого устройства.

    • AEOI, если 1, указывает, что прерывание автоматически сбрасывает бит запроса на прерывание, в противном случае для обработки EOI используется OCW2.
  • Командные слова операций (OCW) используются для управления работой 8259A.
  • OCW1:
  • тип=диск>
    • OCW1 используется для чтения или установки регистра маски прерывания.
      • Если бит установлен, он отключит (маскирует) соответствующий вход прерывания.
  • OCW2:
  • тип=диск>
    • Программируется только тогда, когда режим AEOI в ICW4 равен 0.
    • Позволяет управлять приоритетами после обработки каждого прерывания.
    • Неспецифический EOI: Здесь ISR устанавливает этот бит, чтобы указать EOI.8259A автоматически определяет, какое прерывание было активным, и повторно разрешает его и прерывания с более низким приоритетом.
    • Конкретный EOI: ISR сбрасывает определенный запрос прерывания, заданный L2-L0.
    • Команды Rotate приводят к смещению приоритета по отношению к другому. текущий обрабатывается.
    • Установить приоритет: позволяет установить прерывание с самым низким приоритетом (L2-L0).
    • Если установлен опрос, следующая операция чтения будет считывать слово опроса.
      • Если в слове опроса установлен крайний левый бит, крайние правые 3 бита указывают на активный запрос на прерывание с наивысшим приоритетом.
    • Позволяет ISR обслуживать прерывания с наивысшим приоритетом.

    • Существует три регистра состояния: регистр запроса прерывания (IRR), регистр обслуживания (ISR) и регистр маски прерывания (IMR).
  • IRR: Указывает, какие линии запроса на прерывание активны.
  • тип=диск>
  • ISR: Уровень обслуживаемого прерывания.
  • тип=диск>
  • IMR: Маска, указывающая, какие прерывания включены/выключены.
  • тип=диск>
  • Процедура обновления ISR с настроенным чередующимся приоритетом.
  • В следующей конфигурации 16550 подключается к 8259A через IR0.

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

  • 16550 декодируется в 40H и 47H.
  • 8259A декодируется в 48H и 49H.

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

    • Помните регистр идентификации прерывания 16550?
  • В тексте приведены примеры программирования ISR, демонстрирующие инициализацию и работу.

Какова роль вектора прерывания? – QuickAdviser

Какова роль вектора прерывания?

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

Каковы значения таблицы векторов прерываний?

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

Как бы вы объяснили таблицу векторов прерываний?

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

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

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

Какие существуют два основных типа прерываний?

ТИПЫ ПРЕРЫВАНИЙ

  • Маскируемое прерывание: Аппаратные прерывания, которые могут быть задержаны, когда на процессор поступает прерывание с гораздо более высоким приоритетом.
  • Немаскируемое прерывание: аппаратное прерывание, которое не может быть задержано и должно обрабатываться процессором немедленно.

Какое из следующих прерываний не является векторным прерыванием?

INTR — единственное невекторное прерывание в микропроцессоре 8085. Маскируемые прерывания — это прерывания, которые могут быть отключены или проигнорированы микропроцессором. Эти прерывания запускаются либо по фронту, либо по уровню, поэтому их можно отключить. INTR, RST 7.5, RST 6.5, RST 5.5 являются маскируемыми прерываниями в микропроцессоре 8085.

Что означает NMI?

НМИ

Акроним Определение
НМИ Индикация нового сообщения
НМИ Немаскируемое прерывание
НМИ Network Merchants, Inc. (платежный шлюз)
НМИ Needle Magic, Inc. (шитье)

Какие существуют типы прерываний 8086?

8086 имеет два контакта аппаратного прерывания, т.е.е. НМИ и ИНТР. NMI — это немаскируемое прерывание, а INTR — маскируемое прерывание с более низким приоритетом. Еще один связанный контакт прерывания — INTA, называемый подтверждением прерывания.

Каковы приложения прерывания NMI 8086?

8086 имеет два контакта для приема аппаратных прерываний, NMI и INTR. Эти прерывания вызываются записью инструкции программного прерывания INT n, где «n» может быть любым значением от 0 до 255 (от 00H до FFH). Следовательно, все 256 прерываний могут быть вызваны программным обеспечением.

Каково применение прерываний?

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

Какие шаги предпринимает 8086, когда приходит прерывание?

Если запрошено прерывание, процессор 8086 реагирует на прерывание, выполняя следующую последовательность основных действий: 1) Уменьшает указатель стека на 2 и помещает флаговый регистр в стек.2) Отключает вход прерывания 8086 INTR, сбрасывая флаг прерывания в регистре флагов.

Зачем нужны прерывания?

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

Каковы действия при возникновении прерывания?

Последовательность шагов, которые происходят во время обработки прерывания:

  • Содержимое флагового регистра CS и IP помещается в стек.
  • Для отключения одиночных шагов и прерываний INTR очищаются TF и ​​IF.
  • Затем программа переходит к началу или начальному адресу ISS.

Что делается в первую очередь при возникновении прерывания?

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

Что такое отключение прерывания?

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

Что из следующего верно для отключения прерываний?

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *