2.1.4 Таблица векторов прерываний
Понятием «прерывание» обозначают механизм, обеспечивающий быструю реакцию компьютера на определенное внутреннее или внешнее событие, требующее прерывания выполнения исполняемой программы и перехода к выполнению другой специальной программы, называемой программой обработки прерывания. После завершения обработки прерывания происходит возврат к выполнению прерванной программы.
Процессор способен обработать до 256 различных прерываний. Все возможные события, требующие описанной выше реакции, пронумерованы от 0 до 100h (номер прерывания), и с каждым из них связана определенная программа обработки прерывания. Часть номеров прерываний зарезервированы системой, остальные предоставлены разработчику.
Для запуска программ — обработчиков прерываний используется специальная система указателей на их начальные адреса, называемая таблицей векторов прерываний. Таблица векторов прерываний формируется в ОЗУ и занимает первый килобайт адресного пространства (с
Вектора
в таблице расположены в порядке
возрастания номеров прерываний: нулевому
прерыванию соответствует вектор,
записанный по адресу 0000:0000, первому —
0000:0004 и т.д. Таким образом, номер прерывания n, умноженный на 4,
однозначно указывает на точку входа в
таблицу векторов прерывания (0000:4*n – адрес расположения вектора), в которой,
в свою очередь, располагается указатель
(адрес) на программу обработки этого
прерывания
Таблица векторов прерываний частично инициализируется BIOS перед началом загрузки DOS, частично — при загрузке DOS. Пользовательские программы также могут модифицировать эту таблицу, переназначая некоторые из векторов прерываний (например, программы русификации клавиатуры переключают «на себя» 9-е прерывание).
По типу запроса различают аппаратные и программные прерывания. Аппаратные прерывания, в свою очередь, могут быть внешними или внутренними.
Внешнее аппаратное прерывание
Запросы центральному процессору на обработку внешних аппаратных прерываний генерируются контроллером прерываний, который принимает от внешнего источника сигнал прерывания, формирует на шине управления запрос на прерывание и на шине данных – номер прерывания (число в диапазоне от 0 до 256), соответствующий номеру линии контроллера, на которую поступил сигнал от внешнего источника прерывания.
Система приоритетов прерываний регулирует ситуации, когда от внешнего оборудования очередной сигнал прерывания поступает в процессе обработки предыдущего прерывания. С некоторыми упрощениями эта система работает следующим образом:
Из двух одновременно поступивших прерываний первым будет обрабатываться прерывание с высшим приоритетом, и только по завершению его обработки – второе прерывание.
Если очередное прерывание поступает в процессе обработки прерывания с высшим приоритетом, оно ставится в очередь и будет обработано только после завершения обработки всех поступивших прерываний, имеющих высший приоритет.
Если в процессе обработки прерывания поступает очередное прерывание с высшим приоритетом, то будет приостановлен процесс обработки первого прерывания (с сохранением в стеке всех необходимых параметров), будет запущен процесс обработки поступившего прерывания, и после его завершения продолжится процесс обработки приостановленного прерывания.
Приоритет прерывания связан с номером линии (уровня) прерывания контроллера, к которой подключен внешний источник прерывания (не путать с номером прерывания !).
Внутреннее аппаратное прерывание является следствием каких-либо проблем, возникших при выполнении программы (например, произошло переполнение или деление на ноль при выполнении процессором арифметической операции). Запросы на обработку таких прерываний генерируются внутренними блоками процессора.
Программное прерывание является «искусственным», оно инициируется специальной командой процессора INT n, где n — номер прерывания. По сути дела, программное прерывание реализует специфический способ запуска программ с использованием механизма, созданного для обработки аппаратных прерываний.
Программные прерывания используются для организации доступа из прикладной программы к программным модулям общего пользования – например, к функциям DOS (INT21h), или к функциям BIOS для работы с клавиатурой (INT16h) или видеосистемой (INT10h). Для запуска такого модуля нет необходимости знать адрес его расположения в памяти ПК, достаточно знать номер прерывания, связанного с этим модулем, и номер соответствующей функции.
Процедура обработки прерывания. Если запрос прерывания принят процессором на обслуживание, выполняется следующая процедура:
текущий адрес исполняемой программы и содержимое флаговых регистров процессора сохраняются в стеке, что обеспечивает возможность возврата к прерванной программе;
в процессор вводится номер прерывания, указывающий на точку входа в таблицу векторов прерываний;
вектор прерывания из таблицы вводится в соответствующие адресные регистры процессора, и выполняется программа обработки прерывания;
по завершению обработки прерывания восстанавливается (из стека) старое состояние процессора, и прерванная программа продолжает выполняться с соответствующей команды.
3.3. Таблица векторов прерываний.
3. Структура и функционирование памяти и устройств ввода-вывода вычислительных систем. Вычислительные системы, сети и телекоммуникации- Главная
- Телекоммуникации
- Вычислительные системы, сети и телекоммуникации
- 3. Структура и функционирование памяти и устройств ввода-вывода вычислительных систем
- Категория: 3. Структура и функционирование памяти и устройств ввода-вывода вычислительных систем
В случае аппаратных прерываний номер прерывания или задается устройством, запросившим прерывание (при векторных прерываниях), или же задается номером линии запроса прерываний (при радиальных прерываниях).
Процессор, получив прерывание, заканчивает выполнение текущей команды и обращается к памяти в область таблицы векторов прерываний, в ту ее строку, которая определяется номером запрошенного прерывания. Затем процессор читает содержимое этой строки (код вектора прерывания) и переходит в адрес памяти, задаваемый этим вектором. Начиная с этого адреса в памяти должна располагаться программа обработки прерывания с данным номером. В конце программы обработки прерываний обязательно должна располагаться команда выхода из прерывания, выполнив которую, процессор возвращается к выполнению прерванной основной программы. Параметры процессора на время выполнения программы обработки прерывания сохраняются в
Рисунок 3.3 – Упрощенный алгоритм обработки прерывания
Пусть, например, процессор (рис. 3.3) выполнял основную программу и команду, находящуюся в адресе памяти 5000 (условно). В этот момент он получил запрос прерывания с номером (адресом вектора) 4. Процессор заканчивает выполнение команды из адреса 5000. Затем он сохраняет в стеке текущее значение счетчика команд (5001) и текущее значение PSW. После этого процессор читает из адреса 4 памяти код вектора прерывания. Пусть этот код равен 6000. Процессор переходит в адрес памяти 6000 и приступает к выполнению программы обработки прерывания, начинающейся с этого адреса. Пусть эта программа заканчивается в адресе 6100. Дойдя до этого адреса, процессор возвращается к выполнению прерванной программы. Для этого он извлекает из стека значение адреса (5001), на котором его прервали, и бывшее в тот момент PSW. Затем процессор читает команду из адреса 5001 и дальше последовательно выполняет команды основной программы.
Прерывание в случае аварийной ситуации обрабатывается точно так же, только адрес вектора прерывания (номер строки в таблице векторов) жестко привязан к данному типу аварийной ситуации.
Программное прерывание тоже обслуживается через таблицу векторов прерываний, но номер прерывания указывается в составе команды, вызывающей прерывание.
- Главная
- Телекоммуникации
- Вычислительные системы, сети и телекоммуникации org/ListItem»> 3. Структура и функционирование памяти и устройств ввода-вывода вычислительных систем
Что такое таблица векторов прерываний в микроконтроллерах ARM cortex M?
В этом уроке мы поговорим о таблице векторов прерываний. Во-первых, мы определим таблицу векторов прерываний (IVT). Во-вторых, мы увидим роль IVT для обработки прерываний и исключений в микроконтроллерах или микропроцессорах. После этого мы увидим таблицу векторов прерываний микроконтроллера TM4C123G ARM Cortex M4.
Почти все современные процессоры и микроконтроллеры поддерживают функции прерываний и исключений, чтобы обеспечить возможность выполнения управляемых событиями задач или потоков. В отличие от метода опроса, задачи, управляемые событиями, более эффективно используют ресурсы ЦП. В наши дни микроконтроллеры или микропроцессоры поддерживают сотни прерываний и исключений. Каждое прерывание/исключение имеет процедуру обслуживания прерывания (ISR), определенную где-то в памяти кода. Но вопрос в том, как процессор определяет, где находится ISR в памяти кода для конкретного прерывания? Ответ прост: микроконтроллеры используют таблицы векторов прерываний, чтобы найти начальный адрес процедур ISR.
Теперь давайте начнем с определения IVT. В литературе это также обозначается аббревиатурой VT.
Как следует из названия, это таблица, содержащая векторы. Но что такое векторы? В мире физики термин «вектор» означает измерение или направление. Но во встроенном программировании вектор означает адрес памяти. Следовательно, векторная таблица — это таблица, содержащая адреса памяти. Но вопрос, адреса какого куска кода или инструкции? Ответ — прерывания или исключения. Короче говоря, таблица векторов прерываний содержит адреса (указатели функций) службы прерываний/подпрограмм и функций обработки исключений.
Таблица векторов прерываний — это таблица адресов памяти процедур обработки прерываний/исключительных ситуаций. Другими словами, он определяет, где в памяти микроконтроллера находится код конкретной процедуры прерывания/исключения.
Прерывания и исключения в 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 содержит адрес обработчика прерывания системного таймера.
Еще один момент, на который следует обратить внимание, это номер исключения. Номер исключения используется ЦП ARM Cortex M для индексации местоположения таблицы векторов прерываний.
Таблица векторов и подпрограммы обработки прерываний/обработчики исключений определяются внутри файла запуска микроконтроллера. Файл запуска и файл сценария компоновщика определяют способ хранения таблицы векторов прерываний в начальных 256 местах памяти кода микроконтроллера. Если вы не знаете о файле запуска, вам следует прочитать эту статью:
Что такое файл запуска микроконтроллеров. Понимание его различных функций
Поскольку микроконтроллер TM4C123G поддерживает 154 исключения и прерывания. Следовательно, IVT хранит первые 154 слова ПЗУ или кодовой памяти. Одно дополнительное место используется для хранения начального адреса указателя основного стека.
Роль таблицы векторов прерываний в обработке прерываний
ЦП ARM Cortex-M имеет два режима работы, такие как режим потока и режим исключения. В обычном исполнении ЦП работает в потоковом режиме. Но когда происходит прерывание, ЦП переходит из режима потока в режим исключения. В режиме исключений вложенный контроллер векторов прерываний управляет всеми запросами прерываний и исключений.
При возникновении прерывания x запрос на прерывание будет отправлен в NVIC. Если NVIC принимает запрос исключения/прерывания x, следующим шагом NVIC является поиск начального адреса процедуры обслуживания прерывания или обработчика исключений. Начальный адрес соответствующего ISR или обработчика исключений хранится в таблице векторов прерываний. Затем NVIC использует номер исключения x для вычисления адреса исключения путем поиска в таблице векторов прерываний и использования содержимого этого адреса памяти (который является адресом соответствующего обработчика исключений) для выполнения обработчика исключений.
Счетчик программ будет загружен с адресом обработчика исключительной ситуации, и ЦП начнет выполнение процедуры обработки исключительной ситуации.
Процедура обработки прерываний ARM cortex-M довольно длительна. Поэтому мы разместим о нем отдельную статью.
Таким образом, таблица векторов прерываний представляет собой массив указателей функций, указывающих на начальный адрес обработчиков исключений или прерываний микроконтроллера или микропроцессора. IVT обычно сохраняет по начальным адресам флэш-памяти или памяти кода.
Дополнительная литература:
- Доступ к регистрам микроконтроллеров периферийных устройств с отображением памяти
- Процесс сборки встроенных систем на «голом металле» с использованием GNU Toolchain
- Файл скрипта компоновщика встроенных систем на «голом металле» Кнопка для управления светодиодом с помощью TM4C123G Tiva LaunchPad
Таблица векторов прерываний — OSDev Wiki
В архитектуре x86 таблица векторов прерываний (IVT) — это таблица, в которой указаны адреса всех 256 обработчиков прерываний, используемых в реальном режиме.
IVT обычно располагается по адресу 0000:0000H и имеет размер 400H байт (4 байта для каждого прерывания). Хотя адрес по умолчанию можно изменить с помощью инструкции LIDT на более новых процессорах, обычно этого не делают, поскольку это неудобно и несовместимо с другими реализациями и/или старым программным обеспечением (например, программами MS-DOS). Однако обратите внимание, что код должен оставаться в первом мегабайте ОЗУ.
Содержимое
|
Структура
Записи являются последовательными, то есть первая запись, указанная IDTR, является обработчиком прерывания 0, а остальные следуют последовательно. Формат записи:
+-----------+-----------+ | Сегмент | Смещение | +-----------+------------+ 4 2 0
Таким образом, мы видим, что получить адрес искомого обработчика прерывания очень просто: IDTR * 4. Чтобы изменить обработчик прерывания, все, что нужно сделать, это изменить его адрес в таблице. .
Схема прерывания ЦП
Смещение IVT | ИНТ # | Описание -----------+------------+------------ --------- 0x0000 | 0x00 | Разделить на 0 0x0004 | 0x01 | Сдержанный 0x0008 | 0x02 | Прерывание NMI 0x000С | 0x03 | Точка останова (INT3) 0x0010 | 0x04 | Переполнение (ВНУТРИ) 0x0014 | 0x05 | Превышен диапазон границ (BOUND) 0x0018 | 0x06 | Неверный код операции (UD2) 0x001C | 0x07 | Устройство недоступно (WAIT/FWAIT) 0x0020 | 0x08 | Двойная ошибка 0x0024 | 0x09| Переполнение сегмента сопроцессора 0x0028 | 0x0А | Недействительный TSS 0x002C | 0x0B | Сегмент отсутствует 0x0030 | 0x0С | Ошибка сегмента стека 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 по умолчанию, перекрываются с некоторыми обработчиками исключений процессора.