Вектор прерывания — это… Что такое Вектор прерывания?
- Вектор прерывания
Прерывание (англ. interrupt) — сигнал, сообщающий процессору о наступлении какого-либо события. При этом выполнение текущей последовательности команд приостанавливается, и управление передаётся обработчику прерывания, который выполняет работу по обработке события и возвращает управление в прерванный код.
В зависимости от источника возникновения сигнала прерывания делятся на:
- Аппаратные — события от периферийных устройств (например, нажатия клавиш клавиатуры, движение мыши, сигнал от таймера, сетевой карты или дискового накопителя) — внешние прерывания, или события в микропроцессоре — (например, деление на ноль) — внутренние прерывания;
- Программные — инициируются выполняемой программой явным исполнением специальных инструкций, то есть синхронно, а не асинхронно. Программные прерывания могут служить для вызова сервисов операционной системы.
Термин «ловушка» (trap) иногда используется как синоним термина «прерывание», или же синоним термина «внутреннее прерывание» (см. выше). Единого словоупотребления этих терминов не существует ни в русском, ни в английском языке. Как правило, словоупотребление устанавливается в документации производителя конкретной архитектуры процессора.
Маскирование
В зависимости от возможности запрета аппаратные прерывания делятся на:
- Маскируемые — прерывания, которые можно запрещать установкой соответствующих битов в соответствующем регистре маски прерываний;
- Немаскируемые — обрабатываются всегда, независимо от значения флага IF (в процессорах
Обработчики прерываний обычно пишутся таким образом, чтобы время их обработки было как можно меньшим.
Приоритезация
До окончания обработки прерывания обычно устанавливается запрет на обработку этого типа прерывания, чтобы процессор не входил в цикл обработки одного прерывания. Приоритезация означает, что все источники прерываний делятся на классы и каждому классу назначается свой уровень приоритета запроса на прерывание. Приоритеты могут обслуживаться как относительные и абсолютные. Относительное обслуживание прерываний означает, что если во время обработки прерывания поступает более приоритетное прерывание, то это прерывание (более приоритетное) будет обработано только после завершения текущей процедуры обработки прерывания. Абсолютное обслуживание прерываний означает, что если во время обработки прерывания поступает более приоритетное прерывание, то текущая процедура обработки прерывания вытесняется, и процессор начинает выполнять обработку вновь поступившего более приоритетного прерывания. После завершения этой процедуры процессор возвращается к выполнению вытесненной процедуры обработки прерывания.
Перехват прерывания — изменение обработчика прерывания на свой собственный.
Таблица прерываний
Вектор прерывания
См. также
Wikimedia Foundation. 2010.
- Вектор перемещения
- Вектор скорости
Полезное
Смотреть что такое «Вектор прерывания» в других словарях:
вектор прерывания — Одна или несколько ячеек памяти, содержащих адрес программы реакции на прерывание и/или параметры вызова этой программы. [ГОСТ Р 50304 92 ] Тематики системы для сопряж. радиоэлектр. средств интерфейсные Обобщающие термины структурная организация… … Справочник технического переводчика
вектор прерывания — pertraukties vektorius statusas T sritis automatika atitikmenys: angl. interrupt vector vok. Unterbrechungsvektor, m rus. вектор прерывания, m pranc. vecteur d interruption, m … Automatikos terminų žodynas
вектор прерывания — 44 вектор прерывания: Одна или несколько ячеек памяти, содержащих адрес программы реакции на прерывание и/или параметры вызова этой программы Источник: ГОСТ Р 50304 92: Системы для сопряжения радиоэлектронных средств интерфейсные. Термины и… … Словарь-справочник терминов нормативно-технической документации
Вектор прерывания — 1. Одна или несколько ячеек памяти, содержащих адрес программы реакции на прерывание и/или параметры вызова этой программы Употребляется в документе: ГОСТ Р 50304 92 Системы для сопряжения радиоэлектронных средств интерфейсные. Термины и… … Телекоммуникационный словарь
Вектор — Вектор многозначный термин; величина, характеризующаяся размером и направлением. В Викисловаре есть статья «вектор» … Википедия
Вектор (значения)
вектор — 01.03.02 вектор [ vector] (1)1): Величина, представляемая значением, направлением, смысловым содержанием и началом. 1)Терминологические статьи 01.03.02 и 01.03.03 относятся к одному понятию. Источник … Словарь-справочник терминов нормативно-технической документации
Прерывания — Прерывание (англ. interrupt) сигнал, сообщающий процессору о наступлении какого либо события. При этом выполнение текущей последовательности команд приостанавливается, и управление передаётся обработчику прерывания, который выполняет работу по… … Википедия
Компонента вектора — Вектор: Содержание 1 В биологии 2 В информатике 3 В математике 4 В физике … Википедия
ГОСТ Р 50304-92: Системы для сопряжения радиоэлектронных средств интерфейсные. Термины и определения — Терминология ГОСТ Р 50304 92: Системы для сопряжения радиоэлектронных средств интерфейсные. Термины и определения оригинал документа: 75 абонент интерфейса: Радиоэлектронное средство, подключенное к интерфейсу для выдачи или приема информации… … Словарь-справочник терминов нормативно-технической документации
Прерывания
Прерывание (interrupt) – событие, требующие немедленной реакции со стороны процессора. Реакция состоит в том, что процессор прерывает обработку текущей программы (прерываемой программы) и переходит к выполнению некоторой другой программы (прерывающей программы), специально предназначенной для данного события. По завершении этой программы процессор возвращается к выполнению прерванной программы.
Каждое событие, требующее прерывания, сопровождается сигналом прерывания, оповещающим об этом вычислительную машину, и называемым запросом прерывания.
Состояние программы представляет собой совокупность состояний всех запоминающих элементов в соответствующий момент времени (например, после выполнения последней команды). При возникновении прерывания микроконтроллер сохраняет в стеке содержимое счетчика команд и загружает в него адрес соответствующего вектора прерывания. Последней командой подпрограммы обработки прерывания должна быть команда, которая осуществляет возврат в основную программу и восстановление предварительно сохраненного счетчика команд. Во время выполнения обработчика прерывания некоторая информация может подвергнуться изменению. Поэтому при переходе к обработчику прерывания необходимо сохранить элементы, подвергающиеся изменению. Набор таких элементов представляет собой вектор состояния программы. При этом другая информация о состоянии ячеек памяти не существенна или может быть восстановлена программным путем.
Вектор начального состояния содержит всю необходимую информацию для начального запуска программы. Во многих случаях вектор начального состояния содержит только один элемент – начальный адрес запускаемой программы.
Вектор прерывания является вектором начального состояния прерывающей программы (обработчика) и содержит всю необходимую информацию для перехода к обработчику, в том числе его начальный адрес. Каждому типу прерываний соответствует свой вектор прерывания, который инициализирует выполнение соответствующего обработчика. Обычно векторы прерывания хранятся в специально выделенных фиксированных ячейках памяти с короткими адресами, представляющих собой таблицу векторов прерываний. Для перехода к соответствующей прерывающей программе процессор должен располагать вектором прерывания и адресом этого вектора. По этому адресу, как правило, находится команда безусловного перехода к подпрограмме обработки прерывания.
Как правило, управление запоминанием и возвратом возложено на обработчик прерывания. В этом случае обработчик состоит из трех частей – подготовительной (пролог) и заключительной (эпилог), обеспечивающих переключение программ, и собственно прерывающей программы, выполняющей затребованные запросом операции. Время реакции определяется как временной интервал от момента поступления запроса прерывания до начала выполнения прерывающей программы.
tp – время реакции системы на прерывание;
tз – время запоминания состояния прерываемой программы;
tппр – время собственно прерывающей программы;
tв – время восстановления состояния прерванной программы
При наличии нескольких источников запросов должен быть установлен определенный порядок обслуживания поступающих запросов, называемый приоритетными соотношениями или дисциплиной обслуживания. Совокупность всех возможных типов прерывания процессора представляет собой систему прерывания микроконтроллера. Дисциплина обслуживания определяет, какой из нескольких запросов, поступивших одновременно, подлежит обработке в первую очередь, и имеет ли право данный запрос прерывать тот или иной обработчик прерывания.
Если запрос прерывания окажется не обслуженным к моменту прихода нового запроса от того же источника (того же приоритета), то возникает насыщение системы прерываний. При этом часть запросов прерывания будет утрачена, что для нормальной работы микроконтроллера недопустимо.
Характеристиками системы прерывания являются:
- общее количество запросов прерывания – количество источников запросов прерывания;
- тип представления прерывания – как правило, запрос прерывания представлен логическим уровнем сигнала;
- приоритет прерывания – определяет очередность обработки каждого запроса прерывания, чем выше приоритет, тем меньше задержка в исполнении прерывающей программы для него;
- время реакции – временной интервал между появлением запроса прерывания и началом выполнения прерывающей программы;
- задержка прерывания – определяется суммарным временем на запоминание и восстановление программы;
- глубина, обычно совпадает с числом уровней приоритетов в системе прерывания;
- насыщение системы прерывания;
- допустимые моменты прерывания программ (как правило, окончание выполнения следующей команды).
Маскирование прерываний используется для сообщения микроконтроллеру о необходимости реагировать на каждый тип прерывания или игнорировать его. Маска прерывания представляет двоичный код, разряды которого поставлены в соответствие источникам запроса прерываний. Единичный бит в двоичном коде сообщает микроконтроллеру о необходимости обработки прерываний такого типа. Нулевой бит напротив не позволяет микроконтроллеру переходить к обработке прерываний указанного типа.
Как правило, кроме маскирования прерываний, существует также бит глобального разрешения прерываний, нулевое значение которого отключает все обработчики прерываний (кроме аппаратного сброса и перехода к началу исполняемой программы).
Кроме двоичного кода маски прерываний существует также двоичный код флагов прерываний, который позволяет обработчику прерываний установить источник возникновения прерывания в случае если источников с указанным запросом в микроконтроллере несколько.
Назад
Назад: Программирование микроконтроллеров
Прерывания для самых маленьких / Хабр
Сегодня мы поговорим о прерываниях процессоров семейства x86 (-64). Подробнее под катом.
Прерывания — это как бы сигнал процессору, что надо прервать выполнение (их поэтому и назвали прерываниями) текущего кода и срочно сделать то, что указано в обработчике.
Все адреса обработчиков прерываний хранятся в
IDT. Это таблица, в которой хранятся 256 (можно больше или меньше, но б
ольшие значения просто игнорируются) ячеек (векторы прерываний) с типом и атрибутами прерывания, одним просто нулевым значением, собственно адресом обработчика прерываний и селектором кода в GDT или LDT, который будет использовать данный вектор прерываний. Теперь немного о типе и атрибутах.
Тип прерывания и атрибуты занимают 8 бит. Первые 4 бита занимают тип:
- 0b0101: 32-битный гейт задачи, при появлении такого прерывания происходит хардверное переключение задачи (да-да, есть и такое, но его уже давно не используют)
- 0b0110: 16-битный гейт прерывания
- 0b0111: 16-битный гейт trap’a (я не знаю, как это перевести на русский язык, извините)
- 0b1110: 32-битный гейт прерывания
- 0b1111: 32-битный гейт trap’a
Далее идут атрибуты. Первым атрибутом является 1 бит, который задан в 0 для гейтов прерывания и в 1 для остальных. Далее идет уровень привилегий дескриптора — 2 бита, задающие минимальный уровень привилегий для вызова прерываний, и 1 бит, заданный в 0 для неиспользуемых прерываний.
Теперь о том, как процессор вызывает обработчики.
Допустим, что вы вызвали инструкцию
int 0
в ассемблере. Это даст сигнал процессору, что надо вызвать прерывание 0, если это возможно. Вот последовательность действий, которые происходят при этом.
- Поиск вектора №0 в IDT.
- Сравнение уровня привилегий дескриптора и текущего уровня привилегий процессора.
- Если текущий уровень привилегий процессора меньше уровня привилегий дескриптора, то просто вызвать генеральную ошибку защиты и не вызывать прерывание.
- Происходит сохранение адреса возвращения, регистра (E)FLAGS и другой информации.
- Происходит переход на адрес, указанный в векторе №0 IDT.
- После выполнения обработчика инструкция
iret
возвращает управление прерванному коду.
Еще есть прерывания, которые генерируются самим процессором при определенных обстоятельствах —
исключения. Вот их список с краткими описаниями:
- Деление на ноль. Генерируется при, собственно, делении на ноль.
- Отладочное исключение. Генерироваться само не может, используется для, собственно, отладки.
- Немаскируемое прерывание. Генерируется при ошибках ОЗУ и невосстановимых ошибках «железа». Их невозможно замаскировать с помощью PIC (Programmable Interrupt Controller — программируемый контроллер прерываний), так как оно идет сразу в процессор, минуя PIC, но можно просто отключить.
- Точка останова. Тоже используется для отладки, потому что его опкод занимает всего 1 байт, в отличии от остальных INT N. Переназначалось DOS-отладчиками для своих целей.
- Переполнение. Генерируется инструкцией
INTO
, если в (E)FLAGS включен бит переполнения. - Выход за пределы. Генерируется при ошибке инструкции BOUND.
- Недопустимый опкод. Генерируется при попытке выполнения недопустимого кода операции.
- Устройство недоступно. Сейчас не используется, генерировался при попытке использования операций с плавающей точкой на процессорах без FPU.
- Double fault. Сложно перевести название. Ошибка невосстановима, происходит при невозможности вызвать обработчик исключения.
- Переполнение сегмента сопроцессора. Больше не используется.
- Недопустимый TSS. Сегмент состояния задачи задан неправильно.
- Сегмент отсутствует. Возникает при попытке загрузки сегмента с битом Present == 0.
- Ошибка сегмента стека. Возникает при попытке загрузки сегмента с битом Present == 0 или переполнении стека.
- Общая ошибка защиты. Генерируется в очень большом числе случаев, среди них есть ошибка сегмента, попытка выполнения инструкции без необходимых прав, запись туда, куда не надо, попытка доступа к нулевому дескриптору GDT и многое другое.
- Ошибка страницы. Происходит при чтении или записи в несуществующую страницу памяти, попытке доступа к данным без необходимых прав или другом.
- Ошибка с плавающей точкой. Происходит при выполнении инструкции FWAIT или WAIT с битом №5 в CR0 == 0.
- Ошибка при проверке на выравнивание. Происходит только в третьем кольце привилегий процессора, если эта ошибка, конечно, включена.
- Ошибка при проверке машины. Генерируется процессором при обнаружении «железных» ошибок.
- Исключение с плавающей точкой SIMD. Генерируется при ошибках с 128-битными числами с плавающей точкой.
- Ошибка виртуализации.
- Ошибка безопасности.
- Тройная ошибка. По сути исключением не является, это даже не прерывание. Происходит при невозможности вызвать Double Fault. Вызывает немедленную перезагрузку компьютера.
Существует особый тип прерываний —
IRQ (Interrupt ReQuest), или же аппаратные прерывания, но я буду их для краткости называть просто IRQ. Технически они почти не отличаются от любых других прерываний, но генерируются не процессором или самим кодом, а устройствами, подключенными к компьютеру. К примеру, IRQ №0 генерируется PIT (таймер с программируемым интервалом), IRQ 1 генерируется при нажатии клавиши на клавиатуре, а IRQ 12 — при действии с PS/2-мышью.
Еще есть так называемые
программные прерывания. Их, как понятно из названия, программа должна вызывать сама — никто их за нее не вызывает. Таковыми являются, например, системные вызовы в некоторых системах. В Linux, например, они висят на векторе 0x80. Во многих хобби-ОС они тоже висят на векторе 0x80. Теперь немного отсебятины — я думаю, что сисвызовы сделаны в виде прерываний из-за того, что 1) их так очень легко вызывать, 2) их можно вызвать из любого кода, работающего в ОС — IDT-то одна на всю систему.
Информация взята с OSDev Wiki.
Assembler
AssemblerВ конец страницы
Программы обработки прерываний (или попросту обработчики прерываний) относятся к важнейшим программным средствам персональных компьютеров. Запросы на обработку прерываний могут иметь различную природу. Прежде всего, различают аппаратные прерывания от периферийных устройств или других компонентов системы и программные прерывания, вызываемые командой int, которая используется, в частности, для программного обращения к функциям DOS и BIOS. Сигналы, возбуждающие аппаратные прерывания, могут инициироваться цепями самого процессора, например, при попытке выполнения операции деления на ноль (такие прерывания называются внутренними, или отказами), а могут приходить из периферийного оборудования (внешние прерывания). Внешние аппаратные прерывания вызываются, например, сигналами микросхемы таймера, сигналами от принтера или контроллера диска, нажатием или отпусканием клавиши. Таким образом, можно говорить о прерываниях трех типов: внутренних, внешних и программных. Независимо от источника, действия процессора по обслуживанию поступившего прерывания всегда выполняются одинаково, как для аппаратных, так и для программных прерываний. Эти действия обычно называют процедурой прерывания. Подчеркнем, что здесь идет речь лишь о реакции самого процессора на сигнал прерывания, а не об алгоритмах обработки прерывания, предусматриваемых пользователем в обработчике прерываний.
Объекты вычислительной системы, принимающие участие в процедуре прерывания, и их взаимодействие показаны на рис. 25.1.
Самое начало оперативной памяти от адреса 0000h до 03FFh отводится под векторы прерываний — четырехбайтовые области, в которых хранятся адреса программ обработки прерываний (ПОП). В два старших байта каждого вектора записывается сегментный адрес ПОП, в два младших — относительный адрес точки входа в ПОП в сегменте. Векторы, как и соответствующие им прерывания, имеют номера, причем вектор с номером 0 располагается, начиная с адреса 0, вектор 1 — с адреса 4, вектор 2 — с адреса 8 и т.д. Вектор с номером N занимает, таким образом, байты памяти от N*4 до N*4+3. Всего в выделенной под векторы области памяти помещается 256 векторов.
Адреса памяти
рис. 4.1. Процедура прерывания
Получив сигнал на выполнение процедуры прерывания с определенным номером, процессор сохраняет в стеке выполняемой программы текущее содержимое трех регистров процессора: регистра флагов, CS и IP. Два последних числа образуют полный адрес возврата в прерванную программу. Далее процессор загружает CS и IP из соответствующего вектора прерываний, осуществляя тем самым переход на ПОП.
Программа обработки прерывания обычно заканчивается командой возврата из прерывания iret (interrupt return, возврат из прерывания), выполняющей обратные действия — загрузку IP, CS и регистра флагов из стека, что приводит к возврату в основную программу в ту самую точку, где она была прервана.
Большая часть векторов прерываний предназначена для выполнения определенных действий и автоматически заполняется адресами системных программ при загрузке системы;
часть векторов зарезервирована для будущих применений, а часть (конкретно с номерами 60h…66h) свободна и может использоваться в прикладных программах.
Для того чтобы прикладной обработчик получал управление в результате прерывания, его адрес следует поместить в соответствующий вектор прерывания. Хотя содержимое вектора прерываний можно изменить простой командой mov, однако предпочтительнее использовать специально предусмотренную функцию DOS 25h. При вызове функции 25h в регистр AL помещается номер модифицируемого вектора, а в регистры DS:DX — полный двухсловный адрес нового обработчика.
Рассмотрим методику использования в прикладной программе прерывания пользователя.
Пример 4.1. Обработка прерываний пользователя
new_65h proc ;Процедура наложения на экран цветного окна для динамической ;очистки экрана по ходу выполнения программы mov АН, 06h ;Функция задания окна mov AL,0 ;Режим создания окна mov BH,1Bh ;Атрибут всех символов в окне: светло-бирюзовые символы, синий фон mov СХ,0 ;Координаты верхнего левого угла 0,0 mov DH,24 ;Нижняя Х-координата mov DL,79 ;Правая Х-координата int 10h ;Прерывание BIOS iret new_65h endp main proc mov AX,data mov DS,AX ;Заполним вектор прерывания пользователя адресом нашего обработчика mov АН,25h ;Функция заполнения вектора прерывания mov AL,65h ;Номер вектора mov DX,offset new_65h ;Смещение прикладного обработчика push DS ;Сохранны DS push CS ;Настроим DS на сегмент команд (в pop DS ;котором находится наш обработчик) int 21h ;Вызовем DOS pop DS ;Восстановим DS ;Будем в цикле выводить ил экран строки с предварительной очисткой экрана gogo: int 65h ;Вызов прикладного обработчика (очистка ;экрана перед выводом текста) ;Позиционируем курсор mov АН,02h ;Функция позиционирования mov BH,0 ;Видеостраница mov DH,line ;Строка mov DL,coloumn ;Столбец int 10h ;Прерывание BIOS ;Выведем на экран строку символов mov АН,0Ah ;функция вывода символа без атрибута mov AL,sym ;Символ mov BH,0 ;Видеостраница mov СХ,60 ;Коэффициент повторения int 10h ;Прерывание BIOS ;Изменим символ и позицию и зациклим программу с возможностью ;завершения по нажатию клавиш /C inc sym ;Следующий символ по таблице ASCII inc line ;Следующая строка экрана mov АН,08h ;Функция ввода баз эха, чувствует /C int 21h jmp gogo ;Бесконечный цикл main endp ;Поля данных line db 2 ;Строка coloumn db 10 ;Столбец sym db 0lh ;Выводимый символ
Процедура new_65h, вызываемая с помощью программного прерывания (для которого выбран вектор 65h), выполняет простую операцию — очищает экран, накладывая на него окно с заданным атрибутом.
В основной программе, прежде всего заполняется вектор прерывания 65h. Поскольку функция заполнения вектора 25h требует, чтобы адрес прикладного обработчика содержался в парс регистров DS:DX, a DS у нас указывает на сегмент данных, перед вызовом DOS в DS следует занести сегментный адрес того сегмента, в котором находится обработчик, т.е., в нашем случае, общего сегмента команд. Этот адрес извлекается из CS.
Далее в бесконечном цикле выполняется вызов нашего обработчика, позиционирование курсора с помощью функции 02h BIOS и вывод на чистый экран строки символов (функцией 0Ah BIOS). Эта функция не позволяет задавать атрибуты выводимых символов. Символы приобретают атрибут тех позиций, куда они выводятся, т.е., в нашем случае, атрибут окна. После вывода на экран строки выполняется изменение кода символов и номера строки экрана, куда эти символы выводятся.
Функция DOS 08h (ввод символа без эха), включенная в цикл, выполняет две задачи. Bo-первых, она останавливает выполнение программы и позволяет изучить содержимое экрана в каждом шаге цикла. Для того, чтобы продолжить выполнение программы, достаточно нажать на любую клавишу. Во-вторых, эта функция, будучи чувствительна к вводу с клавиатуры сочетания /C, позволяет завершить программу, которая в противном случае выполнялась бы вечно.
Обработчик прерываний от таймера.
Структура обработчика прерываний и его взаимодействие с остальными компонентами программного комплекса определяются рядом факторов, из которых важнейшими являются следующие:
• прерывания, инициализирующие обработчик, могут быть аппаратными (от периферийных устройств) или программными (команда int).
• обработчик может входить в состав прикладной программы или представлять собой самостоятельную единицу. В последнем случае он относится к специальному классу резидентных программ;
• вектор обрабатываемого прерывания может быть свободным и использоваться системой или какой-либо резидентной прикладной программой;
• если вектор уже используется системой, т.е. в составе DOS имеется системный или прикладной разработчик прерываний с данным номером, то новый обработчик может полностью заменять уже загруженный (превращая его тем самым фактически в бесполезную программу) или “сцепляться” с ним;
• в случае сцепления с загруженным ранее обработчиком новый обработчик может выполнять свои функции до уже имеющегося в системе или после него.
В настоящем разделе будут рассмотрены общие вопросы обработки прерываний на примере простого обработчика прерывания 1Ch.
Для того чтобы прикладные программы могли использовать сигналы таймера, не нарушая при этом работу системных часов, в программу BIOS, обслуживающую аппаратные прерывания от таймера, поступающие через вектор 08, включен вызов int 1Ch, передающий управление на программу-заглушку BIOS, которая содержит единственную команду iret (рис. 46.1.). пользователь может записать в вектор 1Ch адрес прикладного обработчика сигналов таймера и использовать в своей программе средства реального времени. Естественно, перед завершением программы следует восстановить старое значение вектора 1Ch.
Векторы прерываний Программа BIOS отсчета времени
Рис. 4.2 Прикладная обработка прерываний от таймера
При рассмотрении методики включения в программу процедур-подпрограмм мы отмечали, что порядок расположения процедур в программе не влияет на ход ее выполнения. Важно лишь так скомпоновать текст программы, чтобы подпрограммы никогда не активизировались “сами по себе”, иначе, чем в результате выполнения команды call в вызывающей программе. Это правило относится и к обработчикам прерываний, включаемым в состав программы. Текст обработчика можно расположить в любом месте программы, обеспечив лишь невозможность случайного перехода на его строки не в результате прерывания, а по ходу выполнения основной программы. Обычно обработчики располагаются либо в начале, либо в конце текста программы. В примере 46.1 текст обработчика идет вслед за текстом основной программы.
Другое замечание относится к оформлению программы обработчика. Так же, как и в случае подпрограмм, обработчик прерывания может образовывать процедуру (что наглядно), но может начинаться просто с метки. Важно лишь, чтобы последней выполняемой командой обработчика была команда iret.
Пример 4.2. Обработчик прерываний от таймера.
text segment 'code' ;(1) include mac.mac ;(2) assume CS:text;DS:data ;(3) main proc ;(4)Главная процедура mov AX,data ;(5)Сделаем наши данные mov DS,AX ;(6)адресуемыми ;Сохраним вектор 1Ch mov AX,351ch ;(7)Функция 35h, вектор 1Ch int 21h ;(8)Вызов DOS mov word ptr old_lch,BX ;(9)Сохраним смещение сегментного обработчика mov word ptr old_lch+2,ES ;(10)Сохраним сегмент системного обработчика ;Заполним вектор 1Ch mov AX,251Ch ;(11)Функция 25h, вектор 1Ch mov DX,offset new_lch ;(12)Смещение нашего обработчика push DS ;(13)Сохраним наш DS push CS ;(14)Настроим DS на сегмент обработчика pop DS ;(15)(т.е. на сегмент команд) int 21h ;(16)Вызов DOS pop DS ;(17)Восстановим адресуемость данных ;Организуем контрольный вывод на экран строк текста в цикле с задержкой mov СХ,20 ;(18)Число повторений вывода строк wri: write string ;(19)Макрокоманда вывода на экран delay 50 ;(20)Макрокоманда задержки loop wri ;(21) ;Перед завершением программы восстановим содержимое вектора 1Ch Ids DX,old_1ch ;(22)Отправим в DS:DX сохраненный вектор 1Ch mov AX,251Ch ;(23)Функция 25h, вектор 1Ch int 21h ;(24)Вызов DOS ;Завершим программу обычным образом outprog ;(25)Завершение программы main endp ;(26)Конец главной процедуры new_1ch proc ;(27)Процедура нашего обработчика ;Наш обработчик от таймера. Его функция - вывод на экран мигающего символа, ;свидетельствующего об активности программы! push AX ;(28)Сохраним используемые в push ES ;(29)нем регистры mov AX,OB800h ;(30)Настроим ES mov ES,AX ;(31)на видеобуфер mov AX,CS:syml ;(32)Получим символ с атрибутом из ячейки syml mov ES:3998,AX ;(33)Выведем в последнюю позицию экрана xchg AX,CS:sym2 ;(34)Обменяем содержимое mov CS:syml,AX ;(35)ячеек syml и sym2 pop ES ;(36)Восстановим pop AX ;(37)сохраненные регистры iret ;(38)Вывод из прерывания ;Поля данных обработчика в сегменте команд syml dw 421 Eh ;(39)Символы с атрибутами sym2 dw 241Eh ;(40)для вывода на экран new_lch endp ;(41)Конец процедуры обработчика text ends ;(42) data segment ;(43) old_lch dd 0 ;(44)Двухсловная ячейка для хранения ; исходного вектора string db '************0123456789**********',10,13,’$’ ;(45) data ends ;(46) end main ;(47)
В рассмотренном примере используются макрокоманды из файла mac.mac. Для того, чтобы сделать доступными эти макрокомнда в нашей программе, используем директиву include. Файл mac.mac имеет следующее содержание:
outprog macro ;(1)Завершение программы mov AX,4C00h ;(2) int 21h ;(3) endm ;(4) delay_50 macro ;(5)Задержка push CX ;(6) mov CX,100 ;(7)Счетчик внешнего цикла outer: push CX ;(8)Сохраним его в стеке mov CX,65535 ;(9)Счетчик внутреннего цикла inner: loop inner ;(10)Повторим команду loop 65535 раз pop CX ;(11)Восстановим внешний счетчик loop outer ;(12)Повторим все это 100 раз pop CX ;(13)Восстановим счетчик демо-цикла endm ;(14) write_string macro ;(15) mov AH,09h ;(16) AH=09h номер функции вывода на экран mov DX,offset string ; (17) В DX заносится адрес выводимого сообщения int 21h ; (18) Вызов прерывания MS-DOS endm ;(19)
Главная процедура начинается, как обычно, с инициализации сегментного регистра DS. Перед тем, устанавливать собственный обработчик какого-либо прерывания, следует сохранить его исходный (системный) вектор, чтобы перед завершением программы вернуть систему в исходное состояние. Для получения содержимого вектора 1Ch используется функция DOS 35h, которая возвращает содержимое указанного вектора в регистрах ES:BX. Для сокращения объема исходного текста программы и номер функции, и номер требуемого вектора заносятся в регистры АН и AL одной командой (предложение 7). Исходный вектор сохраняется в двухсловной ячейке old_1ch, объявленной директивой dd (define double, определить двойное слово) в сегменте данных программы. Однако команды пересылки не могут работать с двойными словами, поэтому сохраняемый вектор засылается из регистров ES:BX в память пословно, сначала в младшую половину ячейки old_1ch (предложение 9), затем в старшую, естественно, равен old_lch+2 (предложение 10). Поскольку ячейка old_1ch объявлена с помощью директивы dd, для обращения к ее составляющим (словам) необходимо включать в команду описатели word ptr (word pointer, указатель на слово), которые как бы отменяют на время трансляции команды первоначальное описание ячейки.
Сохранив вектор, мы можем приступить к заполнению его адресом нашего обработчика. Для этого используется функция DOS 25h, которая, как уже отмечалось, требует указания в регистре AL номера заполняемого вектора, а в регистрах DS:DX полного адреса обработчика, который и будет записан в указанный нами вектор. Однако регистр DS настроен на сегмент данных программы. Кстати, если бы это было не так, мы не могли бы выполнить предложения 9 и 10, так как поля данных программы адресуются через регистр DS. Поэтому на время выполнения функции 25h нам придется изменить содержимое DS, настроив его на тот сегмент, в котором находится процедура обработчика, т.е. на сегмент команд. Это и выполняется в предложениях 13… 15. Содержимое DS сохраняется в стеке, а затем в него через стек заносится содержимое регистра CS, который, очевидно, указывает на сегмент команд. После возврата из DOS в программу исходное содержимое DS восстанавливается (предложение 17).
Начиная с этого момента, прерывания от таймера, приводящие к выполнению в системной программе BIOS команды int 1Ch, будут активизировать 18,2 раз в секунду программу нашего обработчика. При этом вся наша программа должна находиться в памяти и что-то делать, так как если она завершена, то она и обработчик уйдут из памяти. Для задержки программы в ней предусмотрен многократный, в цикле вывод на экран строки текста (предложения 18…21).
Перед завершением программы необходимо с помощью той же функции 25h восстановить исходное содержимое вектора 1Ch. Для загрузки регистров DS:DX требуемым адресом в примере 46.1 используется удобная команда Ids (load pointer using DS, загрузка указателя с использованием DS). В качестве операндов для этой команды указывается один из регистров общего назначения и двухсловное поле памяти с искомым адресом. Следует иметь в виду, что после выполнения этой команды старое содержимое регистра DS теряется. В нашем примере оно больше не нужно, так как, выполнив восстановление вектора, программа завершается (предложение 25). Вообще же перед выполнением команды Ids исходное содержимое регистра DS следует сохранить в стеке.
Рассмотрим теперь программу обработчика прерывания от таймера. Программа начинается с сохранения в стеке регистров, которые будут использоваться в обработчике. Это чрезвычайно важное действие, так как переход на программу обработчика осуществляется по команде int1ch из системной программы обработки прерываний от таймера. При выполнении процедуры прерывания процессор настраивает должным образом только регистры CS и IP. Содержимое всех остальных регистров (в том числе сегментных) отражает состояние системной программы, и если оно будет изменено, то после возврата из нашего обработчика в вызвавшую его системную программу она перестанет функционировать. В нашем обработчике используются лишь регистры АХ и ES, которые и сохраняются в стеке (предложения 28-29).
Далее регистр ES настраивается на адрес видеобуфера (предложения 30-31), а в регистр АХ помещается код ASCII выводимого на экран символа вместе с его атрибутом (предложение 32). В последнем предложении используется важная возможность замены сегмента. Как уже отмечалось, при обращении к памяти по умолчанию используется сегментный регистр DS, т.е. предполагается, что адресуемая ячейка находится в том сегменте, на который в настоящий момент указывает DS, в нашем же случае в момент выполнения этой команды DS почти, наверное указывает на какой-то сегмент программы BIOS. Для адресации к нашим данным можно сохранить содержимое DS и настроить его на наши данные. Однако можно поступить проще, именно, ввести в команду префикс замены сегмента CS: и тем самым указать транслятору, чтобы он в данной команде использовал адресацию через регистр CS. Но и данные в этом случае следует разместить не в сегменте данных, к которому нет доступа, а в сегменте команд. У нас так и сделано. Ячейки sym1 и sym2, к которым обращается обработчик, расположены в конце процедуры new_1ch в пределах сегмента команд (предложения 39-40).
Вывод одного и того же символа в одно и то же место экрана приведет к тому, что мы не будем знать, работает ли наш обработчик. В нашем примере предусмотрена периодическая смена атрибута символа, что делает символ мерцающим. Для этого при каждом проходе программы обработчика ячейки sym1 и sym2 взаимно обмениваются своим содержимым. В результате на экран выводится то один, то другой код. Для обмена содержимого регистров или ячеек предусмотрена специальная команда xchg (exchange, обмен). Поскольку в микропроцессорах 80х86 запрещены команды с адресацией к памяти в обоих операндах, обмен приходится осуществлять через регистр АХ.
После восстановления сохраненных в стеке регистров работа обработчика завершается командой iret, которая передает управление назад в вызвавшую наш обработчик программу BIOS. Когда эта программа дойдет до своего завершения, она выполнит команду iret и управление вернется в нашу программу в ту (неопределенную) точку, в которой она была прервана сигналом таймера.
Кроме того при необходимости работать с реальным временем можно использовать различные функции – одна из них AH=00h. Формат её использования имеет следующий вид:
INT 1Ah АН = 00h — Считать значение счетчика времени.
Ввод: АН = 00h
Вывод: CX:DX=значение счетчика, AL=байт переполнения счетчика.
Приведём пример программы, использующей эту функцию. Программа выводит на экран прямоугольник, который меняет цвет с периодичностью 3 секунды, выход по F10. Задержка реализована в макрокоманде. Пример 4.3
Макроопределение задержки; dely macro time ;(1) local zd,c1,cikl,ii,ii1 ;(2) описываем все метки, используемые вмакроопределении push cx ;(3) помещаем в стек используемые в макроопределении push bx ;(4) регистры push bp ;(5) push ax ;(6) push dx ;(7) mov cx,time ;(8) задаём количество повторений цикла задержки zd – zd: push cx ;(9) задержка в цикле 18.2 секунды mov bp,0 ;(10) mov bx,1 ;(11) cikl: inc BP ;(12) mov ah,00h ;(13) int 1Ah ;(14) cmp BP,1 ;(15) je ii ;(16) переходим на метку ii на первой итерации цикла jmp ii1 ;(17) на следующих итерациях переходим на метку ii1 ii: add bx,dx ;(18) формируем значение на единицу больше, чем в ii1: ;(19) регистре dx cmp bx,dx ;(20) если значение в регистре dx изменилось(сравниваем jne cikl ;(21) значение в dx с сформированным в строке 18 pop cx ;(22) значением в регистре bx, которое на единицу больше, loop zd ;(23)на единицу больше значение в dx станет через 18.2 сек) pop cx ;(24) если нет, то новая итерация циклаесли да, конец pop bx ;(25) макрокоманды задержки pop bp ;(26) pop ax ;(27) pop dx ;(28) endm ;(29) Text segment 'code' ;(30) assume CS:text,DS:data;(31) ;процедура рисования прямоугольника Prymoug proc ;(32) mov AL,cvet ;(33) определяем цвет mov BH,0 ;(34) видеостраница mov SI,250 ;(35) задаём начальные mov DI,150 ;(36) координаты mov CX,y ;(37) высота прямоугольника Prym1: push CX ;(38) mov CX,x ;(39) ширина прямоугольника Prym: push CX mov AH,0ch ;(40) функция ввода пиксела mov CX,SI ;(41) задаем начальные mov DX,DI ;(42) координаты int 10h ;(43) перрывание BIOS inc SI ;(44) смещение по оси ox pop CX ;(45) loop Prym inc DI ;(46) смещение по oy mov SI,250 ;(47) возвращаем прежнюю x-координату pop CX ;(48) loop Prym1 ;(49) ret ;(50) Prymoug endp ;(51) ;процедура задержки Zadergka proc ;(52) mov bp,1 ;(53) mov cvet1,1 ;(54) mig: ;(55) mov bl,cvet1 ;(56)задаём значение mov cvet,bl ;(57)цвета call prymoug ;(58) dely 18 ;(59) задержка в одну секунду inc bp ;(60) cmp bp,3 ;(61)на третьей итерации цикла(когда задержка будет 3 сек.) je changCvet ;(62) переходим на метку changCvet mov ah,06h ;(63) функция ввода с клавиатуры без эха mov dl,0ffh ;(64) задаём режим функции int 21h ;(65) cmp al,44h ;(66) если нажата F10( 44h –ASCI код F10), то переходим на jne mig ;(67) ex – выход из программы jmp ex ;(68) changCvet: inc cvet1 ;(69) меняем константу цвета mov bp,1 ;(70) приводим счётчик в исходное положение jmp mig ;(71) ex: ;(72) ret ;(73) Zadergka endp ;(74) ;главная процедура Main proc ;(75) mov AX,data ;(76) mov DS,AX ;(77) int 21h ;(78) mov x,30 ;(79) задаём ширину прямоугольника mov y,30 ;(80) mov AH,00h ;(81) функция задания режима mov AL,10h ;(82) графический режим EGA int 10h ;(83) прерывание BIOS call Zadergka ;(84) вызываем процедуру задержки mov AH,00h ;(85) возвращаемся в mov AL,03h ;(86) текстовый режим int 10h ;(87) mov ax,4c00h ;(88) int 21h ;(89) main endp ;(90) text ends ;(91) data segment ;(92) x dw 0 ;(93) y dw 0 ;(94) cvet db 0 ;(95) cvet1 db 0 ;(96) data ends ;(97) stk segment stack 'stack';(98) dw 128 dup (0) ;(99) stk ends ;(100) end main ;(101)
Общий алгоритм работы макроопределения задержки следующий: результат работы функции 00h возвращается в регистрах СX:DX. В данной программе работаем по регистру DX – младшие значения времени. Значение в регистре DX изменяется 18.2 раза в секунду, поскольку именно с такой периодичностью таймер вызывает аппаратное переывание. Сохраняем в регистре bx значение на единицу больше, чем в dx, затем сравниваем эти значения(строка 20). Всё это происходит в цикле. Как только значение dx измениться(прошло 18.2 сек) происходит выход из цикла. Данный цикл заключён во внешний цикл zd(строка 9). И поскольку внешний цикл cikl(строка 11) выполняется 18.2 раза в сек., то если внешний выполнить 18 раз, то общая задержка примерно равна 1 сек. Параметром, задающим количество повторений внешнего цикла, является параметр макрокоманды time. Т.е. команда Dely 18 – задержка примерно в 1 сек. для данного макроопределения.
В начало страницы
Существует несколько видов экстраординарных ситуаций, в которых поведение процессора регламентируется особыми правилами. Такие ситуации возникают, когда требуется срочная реакция на внешние воздействия, когда при выполнении программы происходит какая-либо ошибка или существует вероятность получения неточного результата вычислений. В общем случае все эти ситуации разделяются по принципу их обнаружения, источника возникновения и реакции на них на следующие три категории:
Прерывания и особые ситуацииПрерывания и особые ситуации (Interrupts and Exceptions) — это специальные средства, обеспечивающие быструю реакцию процессора на внешние воздействия и прочие неожиданные ситуации. При поступлении прерывания или генерации особой ситуации выполнение программы прерывается, а управление передается специальной процедуре — обработчику прерывания или особой ситуации. В большинстве случаев, когда обработка прерывания или особой ситуации заканчивается, управление может быть возвращено в прерванную программу, которая продолжит свое выполнение с той самой точки, в которой она была остановлена. Процессор производит автоматическое сохранение/восстановление контекста и состояния для обеспечения этой возможности. Все прерывания и особые ситуации имеют уникальные идентификационные номера. Эти номера называются векторами прерываний и лежат в пределах от 0 до 255. Векторы от 0 до 31 отведены для особых ситуаций и немаскируемого прерывания, причем некоторые из них зарезервированы и не должны использоваться программами. Векторы от 32 до 255 свободны для любого использования пользовательскими программами и внешними устройствами. Существует два источника поступления прерываний и три типа особых ситуаций. Кроме того, различают внутренние (программные) и внешние (аппаратные) источники генерации прерываний и особых ситуаций.
Внешние или аппаратные прерывания (External or Hardware interrupts):
Программные прерывания и особые ситуации (Software interrupts and Exceptions):
Таблица 3.1. Типы прерываний и особых ситуаций
Типы особых ситуаций и особенности их обработкиОсобые ситуации, генерируемые процессором подразделяются на три типа — ошибки, ловушки и сбои. В зависимости от типа особой ситуации различается реакция процессора на ее возникновение.
Правила функционирования механизма обработки прерываний и особых ситуаций существенно зависят от режима работы процессора и текущих установок некоторых флагов в регистре CR4. Сам этот механизм включает следующие элементы:
Таблица 6.55. Способы обработки процессором прерываний и особых ситуаций в различных режимах работы
|
Вектор — прерывание — Большая Энциклопедия Нефти и Газа, статья, страница 2
Вектор — прерывание
Cтраница 2
Загрузка вектора прерывания входит в обязанности системного программиста. Если вектор не загружен, возможна неопределенная последовательность действий процессора. [16]
Адрес вектора прерывания, выдаваемый при этом тестером на ОШ, предварительно заносится в нулевой регистр запоминающего устройства тестера. [17]
Адрес вектора прерывания коммутируется с помощью перемычек. [18]
Адрес вектора прерывания формируется схемой, на вход которой поступает номер i группы, которой предоставлено прерывание. [20]
Таблица векторов прерываний EFCOP показана ниже. [22]
Каждый такой вектор прерываний вызывает выполнение соответствующей процедуры прерываний. Следует отметить, что по-казанные на рис. 6.24 операции ЗАПОМНИТЬ СОСТОЯНИЕ СИСТЕМЫ, ВЫЗОВ: РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ (), ВОССТАНОВИТЬ СОСТОЯНИЕ СИСТЕМЫ и ВОЗВРАТ должны повторяться в каждой процедуре ОБРАБОТКИ. Это необходимо потому, что операции проверки и вызова являются теперь аппаратными операциями и могут выполняться в различной последовательности, как показано на примере модифицированной процедуры ИСПОЛНЕНИЯ ПРЕРЫВАНИИ на рис. 6.26. На рис. 6.27 показана процедура ОБРАБОТКИ ПРЕРЫВАНИИ ТАЙМЕРА, иллюстрирующая формат такой процедуры. Этот рисунок следует сравнить с рис. 4.30. На рис. 6.28 показаны команды ассемблера, необходимые для реализации части этой процедуры вместе с соответствующими командами перехода в ячейках памяти 0 — 63 для некоторых векторов прерываний. Техника прерываний, автоматически вызывающая выполнение процедур прерываний с использованием заранее определенных адресов памяти и векторов прерываний, известна под названием векторных прерываний. [23]
За таблицей векторов прерываний следует область, используемая для хранения ряда программ и данных MS DOS. Далее располагаются программы-обработчики прерываний. Самая большая область оперативной памяти, как правило, отведена для выполнения программы пользователя. Эта область, обычно, распадается на сегменты кода, данных стека и дополнительный, адресуемые соответствующими сегментными регистрами. [24]
Если вычисление вектора прерывания не делается в контроллере прерываний, то выяснение причины прерывания осуществляется программно путем анализа разрядов кода запроса или готовности устройств, подключенных к интерфейсу. Программный анализ значительно замедляет реакцию процессора на прерывание, но экономится оборудование и память. При программном анализе нет необходимости в новом ССП и при прерываниях управление может передаваться на одну и ту же ( фиксированную) ячейку памяти. [25]
В простейшем случае вектор прерывания состоит лишь из начального адреса прерывающей программы. [26]
Центральный процессор удаляет вектор прерывания с шины и временно его сохраняет. [27]
Процедура SwapVectors восстанавливает векторы прерываний, которые сохранены в переменных SavelntNN, записывая одновременно в эти же переменные предыдущие векторы. [28]
Система BIOS делает вектор прерывания типа 1C указателем на команду IRET, поэтому Вам придется изменить этот вектор, если Вы хотите, чтобы прерывание вызывало какую-либо полезную деятельность. [29]
Шифратор приоритета формирует двоично-кодированный вектор прерывания, указывающий незамаскированный запрос прерывания с высшим приоритетом. Одновременно вектор прерывания записывается в регистр вектора и используется затем для очистки РП. [30]
Страницы: 1 2 3 4
|
Что такое таблица векторов прерываний в микроконтроллерах ARM Cortex M?
В этом уроке мы поговорим о таблице векторов прерываний. Во-первых, мы определим таблицу векторов прерываний (IVT). Во-вторых, мы увидим роль IVT для обработки прерываний и исключений в микроконтроллерах или микропроцессорах. После этого мы увидим таблицу векторов прерываний микроконтроллера TM4C123G ARM Cortex M4.
Почти все современные процессоры и микроконтроллеры поддерживают функции прерываний и исключений, чтобы обеспечить возможность выполнения задач или потоков, управляемых событиями.В отличие от метода опроса, задачи, управляемые событиями, более эффективно используют ресурсы ЦП. В наши дни микроконтроллеры или микропроцессоры поддерживают сотни прерываний и исключений. Каждое прерывание / исключение имеет подпрограмму обслуживания прерывания (ISR), определенную где-то в памяти кода. Но вопрос в том, как процессор определяет, где находится ISR в памяти кода для конкретного прерывания? Ответ прост: микроконтроллеры используют таблицы векторов прерываний, чтобы найти начальный адрес подпрограмм ISR.
Теперь давайте начнем с определения IVT. В литературе это также обозначается аббревиатурой VT.
Что такое таблица векторов прерываний (IVT)?
Как следует из названия, это таблица, содержащая векторы. Но что такое векторы? В мире физики термин вектор означает измерение или направление. Но во встроенном программировании вектор означает адрес памяти. Следовательно, векторная таблица — это таблица, содержащая адреса памяти. Но вопрос в том, адреса какого фрагмента кода или инструкций? Ответ — прерывания или исключения.Короче говоря, таблица векторов прерываний содержит адреса (указатели функций) служб / подпрограмм прерываний и функций обработчиков исключений.
Таблица векторов прерываний — это таблица адресов памяти подпрограмм обработки прерываний / исключений. Другими словами, он определяет, где в памяти микроконтроллера находится код конкретной процедуры прерывания / исключения.
Прерывания и исключения в ARM MCU
Как мы обсуждали в последнем разделе, таблица векторов содержит адреса процедур ISR для всех прерываний и исключений, которые поддерживает микроконтроллер.
Если вы проверите таблицу микроконтроллера TM4C123G ARM Cortex M4, он имеет 15 системных исключений и 138 периферийных прерываний. Периферийные прерывания также определяются в литературе как простые исключения. Основное различие между системными исключениями и прерываниями заключается в том, что системные исключения генерируются ЦП, а периферийные прерывания генерируются различными периферийными модулями, доступными в микроконтроллерах на базе ARM Cortex.
Короче говоря, IVT микроконтроллера TM4C123GH6PM имеет 154 записи для всех прерываний и исключений.
Но не все прерывания доступны в микроконтроллере TM4C123G. Доступно только 78, и в таблице векторов зарезервировано место для тех периферийных прерываний, которые недоступны. Эти резервные прерывания могут быть доступны в других микроконтроллерах TI.
Где хранится IVT в памяти микроконтроллера?
В микроконтроллерах есть типы памяти, такие как память кода или память данных. Таблица векторов прерываний хранится во флэш-памяти / кодовой памяти микроконтроллеров ARM Cortex M4.
Если вы не знаете о типах памяти или организации памяти микроконтроллеров, прочтите этот пост:
Организация и типы памяти микроконтроллера — объяснение с помощью сегментов памяти
Если вы изучите таблицу микроконтроллера TM4C123GH6PM (стр. 107), таблица векторов прерываний хранится по начальным адресам памяти кода (начиная с 0x0000_0000). Поскольку микроконтроллер TM4C123GH6PM имеет 154 исключения (включая системные и простые исключения), таблица векторов содержит 154 записи.Первые две записи векторной таблицы — это начальное значение указателя стека и адрес функции обработчика сброса. Потому что всякий раз, когда микроконтроллер перезагружается, он выполняет шаги инициализации оборудования. Вы можете прочитать это подробное руководство по процессу загрузки микроконтроллера:
Процесс загрузки микроконтроллера — последовательность сброса
На рисунке ниже показана таблица векторов прерываний, а также их адреса и содержимое памяти. Каждый адрес памяти содержит адрес обработчиков исключений.Например. адрес 0x0000_003C содержит расположение адреса обработчика прерывания таймера systick.
Еще один момент, на который следует обратить внимание, — это номер исключения. Номер исключения используется ЦП ARM Cortex M для индексации местоположения таблицы векторов прерываний.
Таблица векторов и процедуры обслуживания прерываний / обработчики исключений определены в файле запуска микроконтроллера. Файл запуска и файл сценария компоновщика определяют способ хранения таблицы векторов прерываний в начальных 256 ячейках памяти кода микроконтроллера.Если вы не знаете о файле запуска, вам следует прочитать эту статью:
Что такое файл запуска микроконтроллеров — описание его различных функций
Потому что TM4C123G MCU поддерживает 154 исключения и прерывания. Следовательно, IVT сохраняет сначала 154 слова ПЗУ или кодовой памяти. Одно дополнительное место используется для хранения начального адреса указателя основного стека.
Роль таблицы векторов прерываний в обработке прерываний
ARM Cortex-M CPU имеет два режима работы, такие как режим потока и исключение.При нормальном исполнении ЦП работает в потоковом режиме. Но когда происходит прерывание, ЦП переходит из режима потока в режим исключения. В режиме исключений контроллер вложенных векторов прерываний управляет всеми запросами прерываний и исключений.
Когда происходит прерывание x, запрос прерывания будет отправлен в NVIC. Если NVIC принимает запрос исключения / прерывания x, следующим шагом NVIC является поиск начального адреса подпрограммы обслуживания прерывания или обработчика исключений. Начальный адрес соответствующей ISR или обработчика исключений хранится в таблице векторов прерываний.Затем NVIC использует номер исключения x для вычисления адреса исключения, просматривая таблицу векторов прерываний и используя содержимое этого адреса памяти (который является адресом соответствующего обработчика исключения) для выполнения обработчика исключения.
Счетчик программы будет загружен с адресом обработчика исключений, и ЦП начнет выполнять процедуру исключения.
Процедура обработки прерывания ARM cortex-M довольно длительна. Поэтому мы разместим об этом отдельную статью.
Таким образом, таблица векторов прерываний представляет собой массив указателей функций, указывающих на начальный адрес исключений или обработчиков прерываний микроконтроллера или микропроцессора. IVT обычно хранится по начальным адресам флэш-памяти или кодовой памяти.
Дополнительная литература:
freescale — Расчет вектора прерывания в контроллерах на базе PowerPC
Никогда не работал с PowerPC, но с e200z3 Power Architecture ™ Базовое справочное руководство, вы сможете лучше понять.
Capter 10 в Справочном руководстве микроконтроллера MPC5534 упоминает это руководство: Прерывания , реализуемые MCU, определены в Справочном руководстве e200z3 PowerPC tm Core.
ИВПР
В разделе 2.8.1.6 основного справочного руководства говорится об IVPR:
IVPR, показанный на рисунке 2-16, используется во время обработки прерывания для определения начального адреса для программного обработчика прерывания. Значение, содержащееся в поле векторного смещения IVOR, выбранного для определенного типа прерывания, объединяется со значением в IVPR для формирования адреса инструкции, с которой должно начинаться выполнение.
В нем перечислены битовые поля этого регистра, из которых только одно: Vector Base :
Определяет базовое расположение векторной таблицы, выровненное по границе 64 Кбайт. Предоставляет старшие 16 бит расположения всех обработчиков прерываний. IVPR || Значения IVORn объединяются для формирования адреса обработчика в памяти.
IVORn
IVOR, показанные на рисунке 2-17, содержат индекс четвертого слова от базового адреса, предоставленного IVPR для каждого типа прерывания.
Кроме того, в разделе 4.5 говорится:
Значение в поле векторного смещения IVOR, присвоенное типу прерывания, объединяется со значением в IVPR для формирования адреса инструкции, с которой должно начинаться выполнение.
Заключение
После того, как логика приоритета прерывания решит, какой вектор прерывания активировать, счетчик программ перейдет на адрес IVPR || ИВОРН
.
Обратите внимание, что в каждом прерывании есть место только для четырех инструкций, поэтому, если вы хотите выполнить тяжелую работу, вам нужно выполнить ветвление.Установка быстрого флага или переключение вывода ввода / вывода должна быть возможна без каких-либо ответвлений.
В микроконтроллере (AVR) вектор прерывания принимает адреса от $ 0000 до $ 003A, поэтому программа запускается после этого адреса?
Первый вектор в таблице векторов прерываний (расположенный по адресу 0x0000) — это «вектор сброса». Это первый адрес памяти программ, который считывается ЦП при включении питания 1 . Это место в памяти обычно заполняется инструкцией JMP
или RJMP
, где адрес перехода — это начало вашей программы.
Если вектор сброса запрограммирован неправильно (например, с помощью инструкции RJMP,
или чего-то еще), ЦП просто будет продолжать подсчет выполняемых инструкций по мере их появления — например, выполнение других векторов прерывания, если они есть. Если в векторной таблице запрограммированы какие-либо другие процедуры обработки прерываний, все они будут выполняться по очереди, независимо от того, был ли источник прерывания включен или отключен.
При использовании чего-то вроде avr-gcc
он знает о таблице векторов прерываний и ее структуре и будет следить за тем, чтобы вектор сброса указывал на начало вашей программы.В этом случае запуск программы — это на самом деле не ваша функция main ()
, а набор вещей, которые компилятор добавляет для инициализации переменных и тому подобного. Но после всего процесса инициализации будет вызвана ваша функция main ()
.
В качестве примера это дизассемблированная векторная таблица для одной из моих программ:
0: 0c 94 72 00 jmp 0xe4; 0xe4 <__ctors_end>
4: 0c 94 8f 00 jmp 0x11e; 0x11e <__bad_interrupt>
8: 0c 94 8f 00 jmp 0x11e; 0x11e <__bad_interrupt>
c: 0c 94 8f 00 jmp 0x11e; 0x11e <__bad_interrupt>
10: 0c 94 4f 03 jmp 0x69e; 0x69e <__vector_4>
14: 0c 94 8f 00 jmp 0x11e; 0x11e <__bad_interrupt>
18: 0c 94 ef 03 jmp 0x7de; 0x7de <__vector_6>
1c: 0c 94 8f 00 jmp 0x11e; 0x11e <__bad_interrupt>
...
6c: 0c 94 8f 00 jmp 0x11e; 0x11e <__bad_interrupt>
Обратите внимание, как avr-gcc
добавляет скачок по адресу 0x0000 к тому, что он вызывает __ctors_end
, который в основном является адресом памяти после конца векторной таблицы, где начинается процесс инициализации. Все неиспользуемые векторы переходят к чему-то, называемому __bad_interrupt
— расположенный в месте назначения этого перехода, по сути, является другой инструкцией перехода обратно к 0x0000, так что любое возникновение необработанного прерывания сбрасывает процессор.
1. Некоторые AVR имеют пространство загрузчика и могут быть запрограммированы так, чтобы таблица векторов прерываний имела адрес, отличный от адреса 0x0000, но то же самое по-прежнему применяется.
Таблица векторов прерываний— OSDev Wiki
В архитектуре x86 таблица векторов прерываний (IVT) представляет собой таблицу, которая определяет адреса всех 256 обработчиков прерываний, используемых в реальном режиме.
IVT обычно располагается по адресу 0000: 0000H, и имеет размер 400H байтов (4 байта на каждое прерывание).Хотя адрес по умолчанию можно изменить с помощью инструкции LIDT на новых процессорах, обычно это не делается, потому что это неудобно и несовместимо с другими реализациями и / или более старым программным обеспечением (например, программами MS-DOS). Однако обратите внимание, что код должен оставаться в первом МиБ ОЗУ.
Структура
Записи являются последовательными, то есть первая запись, на которую указывает IDTR, является обработчиком прерывания 0, а остальные следуют последовательно. Формат записи:
+ ----------- + ----------- + | Сегмент | Смещение | + ----------- + ----------- + 4 2 0
Таким образом, мы видим, что действительно легко получить адрес искомого обработчика прерывания: IDTR * 4.Чтобы изменить обработчик прерывания, все, что нужно сделать, это изменить его адрес в таблице.
Схема прерывания ЦП
IVT Смещение | INT # | Описание ----------- + ----------- + -------------------------- --------- 0x0000 | 0x00 | Разделить на 0 0x0004 | 0x01 | Зарезервированный 0x0008 | 0x02 | NMI прерывание 0x000C | 0x03 | Точка останова (INT3) 0x0010 | 0x04 | Переполнение (INTO) 0x0014 | 0x05 | Превышен диапазон границ (BOUND) 0x0018 | 0x06 | Неверный код операции (UD2) 0x001C | 0x07 | Устройство недоступно (WAIT / FWAIT) 0x0020 | 0x08 | Двойная ошибка 0x0024 | 0x09 | Перерасход сегмента сопроцессора 0x0028 | 0x0A | Недействительный УТП 0x002C | 0x0B | Сегмент отсутствует 0x0030 | 0x0C | Ошибка сегмента стека 0x0034 | 0x0D | Общая неисправность защиты 0x0038 | 0x0E | Ошибка страницы 0x003C | 0x0F | Зарезервированный 0x0040 | 0x10 | x87 ошибка FPU 0x0044 | 0x11 | Проверка соосности 0x0048 | 0x12 | Проверка машины 0x004C | 0x13 | Исключение SIMD с плавающей запятой 0x00xx | 0x14-0x1F | Зарезервированный 0x0xxx | 0x20-0xFF | Определяется пользователем
Схема аппаратного прерывания по умолчанию
Мастер 8259:
Некоторые прерывания, отображаемые 8259 по умолчанию, перекрываются с некоторыми обработчиками исключений процессора.Их можно переназначить через порты ввода-вывода 8259.
IVT Смещение | INT # | IRQ # | Описание ----------- + ------- + ------- + ---------------------- -------- 0x0020 | 0x08 | 0 | ЯМА 0x0024 | 0x09 | 1 | Клавиатура 0x0028 | 0x0A | 2 | 8259A подчиненный контроллер 0x002C | 0x0B | 3 | COM2 / COM4 0x0030 | 0x0C | 4 | COM1 / COM3 0x0034 | 0x0D | 5 | LPT2 0x0038 | 0x0E | 6 | Контроллер гибких дисков 0x003C | 0x0F | 7 | LPT1
Подчиненный 8259:
IVT Смещение | INT # | IRQ # | Описание ----------- + ------- + ------- + ---------------------- -------- 0x01C0 | 0x70 | 8 | RTC 0x01C4 | 0x71 | 9 | Не назначен 0x01C8 | 0x72 | 10 | Не назначен 0x01CC | 0x73 | 11 | Не назначен 0x01D0 | 0x74 | 12 | Контроллер мыши 0x01D4 | 0x75 | 13 | Математический сопроцессор 0x01D8 | 0x76 | 14 | Контроллер жесткого диска 1 0x01DC | 0x77 | 15 | Контроллер жесткого диска 2
См. Также
x86 16 — Как отобразить таблицу векторов прерываний в сборке 8086?
вопрос: просмотреть таблицу векторов прерываний и определить первую таблицу бесплатно вектор
Это двоякий вопрос.
Чтобы отобразить задействованные числа, вы можете прочитать «Отображение чисел с помощью DOS».
Чтобы найти первый слот в таблице векторов прерываний (IVT), который содержит 0: 0, вы можете использовать следующий код:
xor si, si; Установите DS: SI на начало IVT
mov ds, si
cld; Увеличить LODSW (на 2) регистр SI
Опять таки:
lodsw; Смещенная часть вектора
mov dx, топор
lodsw; Сегментная часть вектора
или топор, dx
jz Найдено; Если обе части равны нулю, то их ИЛИ установит ZF = 1 (нулевой флаг).
cmp si, 1024
jb Снова; Повторяйте до конца IVT, который находится по адресу 1024.
Не обнаружена:
...
jmp ..
Нашел:
sub si, 4; -> DS: SI - это адрес первого слота, содержащий 0: 0
IVT-слот, который содержит 0: 0, безусловно, свободен, но то, является ли это первый слот свободным, не обязательно верно. Подробнее об этом читайте в ответе @Margaret Bloom в статье Найдите свободный слот прерывания.
[РЕДАКТИРОВАТЬ]
Несколько более элегантное решение, которое также короче, но немного медленнее, и которое затирает на один регистр меньше (регистр DX
не используется):
xor si, si; Установите DS: SI на начало IVT
mov ds, si
Опять таки:
mov ax, [si]; Смещенная часть вектора
или топор, [si + 2]; Сегментная часть вектора
jz Найдено; Если обе части равны нулю, то их ИЛИ установит ZF = 1 (нулевой флаг).
добавить си, 4
cmp si, 1024
jb Снова; Повторяйте до конца IVT, который находится по адресу 1024.
Не обнаружена:
...
jmp ..
Нашел:
; -> DS: SI - это адрес первого слота, содержащий 0: 0
И это идея, которую @Peter Cordes представил в комментарии. Это на 1 такт медленнее в цикле, но мы можем сократить 2 байта, если заменим инструкции add si, 2
и sub si, 2
на inc si
inc si
и dec si
dec si
:
xor si, si; Установите DS: SI на начало IVT
mov ds, si
cld
Опять таки:
lodsw; Смещенная часть вектора
или топор, [си]; Сегментная часть вектора
jz Найдено; Если обе части равны нулю, то их ИЛИ установит ZF = 1 (нулевой флаг).
добавить си, 2
cmp si, 1024
jb Снова; Повторяйте до конца IVT, который находится по адресу 1024.
Не обнаружена:
...
jmp ..
Нашел:
sub si, 2; -> DS: SI - это адрес первого слота, содержащий 0: 0
Векторы прерывания AVR
Ниже приведены таблицы прерываний, доступных на микроконтроллерах AVR, используемых в классе. Имя вектора — это идентификатор, который следует использовать в начале процедура обслуживания прерывания (ISR). Например, ISR для вывода ATmega328P Запрос на изменение прерывания 0 будет выглядеть так.
ISR (PCINT0_vect) { // код ISR }
Примечание: имена векторов не всегда одинаковы для одного и того же прерывания. в разных процессорах.Перед написание ISR.
ATmega328P
Номер вектора | Определение прерывания | Имя вектора | ||||||||||||||||
2 | Внешний запрос прерывания 0 | INT0_vect | ||||||||||||||||
3 | ||||||||||||||||||
Запрос прерывания по смене контакта 0 | PCINT0_vect | |||||||||||||||||
5 | Запрос прерывания по смене контакта 1 | PCINT1_vect | ||||||||||||||||
6 | ||||||||||||||||||
Запрос прерывания 7 | Прерывание по таймауту сторожевого таймера | WDT_vect | ||||||||||||||||
8 | Таймер / счетчик2 Сравнение совпадений A | TIMER2_COMPA_vect | ||||||||||||||||
Счетчик | MER2_COMPB_vect | |||||||||||||||||
10 | Переполнение таймера / счетчика2 | TIMER2_OVF_vect | ||||||||||||||||
11 | Сравнить Таймер / счетчик1 Время захвата | 9024 TIMER7 9024 / счетчик 1 | 9024 9024 | 9024 9024 | 9024 TIMER1_COMPA_vect | |||||||||||||
13 | Таймер / Счетчик1 Сравнить соответствие B | TIMER1_COMPB_vect | ||||||||||||||||
14 | Таймер / счетчик | Таймер / счетчик переполнения | Счетчик | Таймер / счетчик переполнения 9024 | TIMER0_COMPA_vect | |||||||||||||
16 | Таймер / счетчик0 Сравнить соответствие B | TIMER0_COMPB_vect | ||||||||||||||||
Последовательная передача SPI завершена | SPI_STC_vect | |||||||||||||||||
19 | USART Rx Complete | USART_RX_vect | ||||||||||||||||
20 | Tx Complete | USART_TX_vect | ||||||||||||||||
22 | АЦП преобразования Полное | ADC_vect | ||||||||||||||||
23 | EEPROM Готовые | EE_READY_vect | ||||||||||||||||
24 | аналоговый компаратор | ANALOG_COMP_vect | ||||||||||||||||
25 | Двухпроводной последовательный интерфейс | TWI_vect | ||||||||||||||||
26 | Сохранение памяти программ, чтение | SPM_READY_vect |
Номер вектора | Определение прерывания | Имя вектора | ||||||||||||||||||||||
2 | Внешний запрос прерывания 0 | INT0_vect | ||||||||||||||||||||||
3 | ||||||||||||||||||||||||
Таймер / Счетчик1 Событие захвата | TIMER1_CAPT_vect | |||||||||||||||||||||||
5 | Таймер / счетчик1 Сравнить совпадение A | TIMER1_COMPA_vect | ||||||||||||||||||||||
7 | Таймер / счетчик0 Переполнение | TIMER0_OVF_vect | ||||||||||||||||||||||
8 | USART Rx Complete | USART0_RX_vect | ||||||||||||||||||||||
ct | ||||||||||||||||||||||||
10 | USART Tx Complete | USART0_TX_vect | ||||||||||||||||||||||
11 | Аналоговый компаратор | ANA_COMP_vect |
ATtiny85
Номер вектора | Определение прерывания | Имя вектора | ||||
1 | Внешний запрос прерывания 0 | INT0_vect | ||||
2 | прерывание прерывания 3 | Таймер / Счетчик1 Сравнить Соответствие A | TIMER1_COMPA_vect | |||
4 | Таймер / Счетчик1 Переполнение | TIMER1_OVF_vect | 9024_OVF_vect | 9024_OVF_vect | 9024_VF_vect | |
9024_VT 6 | EEPROM Ready | EE_RDY_vect | ||||
7 | Аналоговый компаратор | ANA_COMP_vect | ||||
8 | ADA_COMP_vect 45 | 9 | Таймер / Счетчик1 Сравнить Соответствие B | TIMER1_COMPB_vect | ||
10 | Таймер / Счетчик0 Сравнить Соответствие A | TIMER0_COMPA_vect | 9024 9024 9024 9024 9024 Счетчик 9024 907 9024 TIMER0_COMPB_vect | |||
12 | Watchdog Тайм-аут | WDT_vect | ||||
13 | USI Start Состояние | USI_START_vect | ||||
14 | USI Переполнение | USI_OVF_vect |
Структура прерывания 8086 | Таблица векторов прерываний 8086
Структура прерывания 8086:Структура прерывания 8086 может поступать из любого из трех источников:
- Внешний сигнал
- Специальная инструкция в программе
- Состояние по инструкции
8086 может получать прерывание от внешнего сигнала, подаваемого на входной вывод немаскируемого прерывания (NMI); или входной контакт прерывания (INTR).
Специальная инструкция:Структура прерывания 8086 поддерживает специальную инструкцию INT для выполнения специальной программы. В конце подпрограммы обслуживания прерывания выполнение обычно возвращается прерванной программе.
Состояние Изготовлено по инструкции:8086 прерывается некоторым условием, созданным в 8086 при выполнении инструкции. Например, деление на ноль: выполнение программы будет автоматически прервано, если вы попытаетесь разделить операнд на ноль.
В конце каждого командного цикла 8086 Interrupts проверяет, есть ли запрос на прерывание. Если это так, 8086 реагирует на прерывание, выполняя серию действий (см. Рис. 9.1).
- Уменьшает указатель стека на 2 и помещает регистр флага в стек.
- Он отключает вход прерывания INTR, очищая флаг прерывания в флаге
- Сбрасывает флаг прерывания в регистре флагов.
- Уменьшает указатель стека на 2 и помещает в стек текущее содержимое регистра сегмента кода.
- Уменьшает указатель стека на 2 и помещает содержимое указателя текущей инструкции в стек.
- Он выполняет косвенный дальний переход в начале процедуры, загружая значения CS и IP для запуска подпрограммы обслуживания прерывания (ISR).
Инструкция IRET в конце процедуры обслуживания прерывания возвращает выполнение основной программе.
Таблица векторов прерываний 8086:Теперь вопрос: «Как получить значения регистров CS и IP?» 8086 получает новые значения регистров CS и IP из четырех адресов памяти. Когда он реагирует на прерывание, 8686 обращается к ячейкам памяти, чтобы получить значения CS и IP для запуска процедуры обслуживания прерывания. В структуре прерывания системы 8086 первый 1 Кбайт памяти от 00000H до 003FFH зарезервирован для хранения начальных адресов подпрограмм обслуживания прерываний.Этот блок памяти часто называют таблицей векторов прерываний в 8086 или таблицей указателей прерываний . Поскольку для хранения значений CS и IP для каждой процедуры обслуживания прерывания требуется 4 байта, таблица может содержать начальные адреса для 256 подпрограмм обслуживания прерывания. На рис. 9.2 показано, как 256 указателей прерывания расположены в таблице памяти.
Каждому типу прерывания присваивается номер от 0 до 255 и адрес каждого прерывания js, найденный умножением типа на 4 e.грамм. для типа 11 адрес прерывания: 11 x 4 = 44 10 = 0002CH
Только первые пять типов имеют явные определения, такие как деление на ноль и немаскируемое прерывание. Следующие 27 типов прерываний, от 5 до 31, зарезервированы Intel для использования в будущих микропроцессорах. Верхние 224 типа прерывания, от 32 до 255, доступны пользователю для аппаратных или программных прерываний.
Когда 8086 отвечает на прерывание, он автоматически переходит в указанное место в таблице векторов прерываний в 8086, чтобы получить начальный адрес подпрограммы обслуживания прерывания.