2014-02-20 5 views
0

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

+0

Маловероятно, что все они «жестко связаны», если только они не указывают на область, предоставляющую достаточно места для кодирования прыгать в другом месте. Дизайн, который указывал на набор или регионы, каждый из которых обеспечивал достаточное пространство для написания собственно сервисных подпрограмм, был бы очень ограниченным или очень расточительным, так как различным приложениям понадобятся разные процедуры продолжительности. Наложение на теги «arm» и «avr» на это затрудняет ответ, так как это совершенно разные архитектуры. –

ответ

5

таблица прерываний вектор больше, чем просто прерываний. Он также называется исключением . Есть две основные формы,

  1. указатели на функции
  2. Фиксированный код точки входа.

Например, на 68К значение по адресу 0x8 может быть использован как неисправность указателя функции в данных. На традиционном процессоре ARM ошибка ошибки устанавливает счетчик программ по адресу 0x8. Обработчик прерываний может иметь смещение 0x10 и т. Д. Таблица обрабатывает больше, чем прерывания. На ARM, сброс

  1. неопределенная инструкция
  2. руководитель обработчика (SWI)
  3. упреждающей обработчик
  4. данные прерывания обработчик
  5. обработчик прерываний
  6. быстрый обработчик прерываний

Как видите, существует более одной записи. Используя таблицу, аппаратное обеспечение ЦП может быть минимальным и должно знать только один адрес или семь или более. В старых ARM-системах векторная таблица может быть высокой или низкой (0xffff0000 или 0x0) в зависимости от способа ее настройки поставщиком. В новее (как минимум, Cortex-A) вы можете указать адрес таблицы с помощью VBAR.

Тогда почему нам нужно создать IVT в загрузчике?

Смещение может быть исправлено в чипе. Загрузочный загрузчик должен поставить там код, чтобы что-то его обработало.

Допустим, у нас есть почтовый ящик в нашем доме. Почтовый человек помещает почту в поле. Мы идем в коробку и удаляем почту. Почтовый ящик - это расположение векторной таблицы. Почтовый человек - это процессор. Мы являемся кодом в таблице векторов. Расположение почтовых ящиков и векторных таблиц находится в фиксированных местах.

+0

Константы 0x8 и 0x10 составлены и предназначены только для иллюстрации. Смещения * векторного ввода * будут разными для каждого типа ЦП. –

6

Проблема в том, что вы хотите иметь различные обнаруженные аппаратные события или исключения или прерывания, что бы вы им ни называли. И вы хотите иметь возможность запускать отдельный код на основе этого события. Аппаратное обеспечение должно каким-то образом отменить управление этими отдельными процедурами. Поэтому для каждой архитектуры процессора есть решение. Часто мы называем это таблицей векторов прерываний, основанной на истории, но некоторые могут называть ее таблицей исключений, а в случае руки (большинство не всех) - это действительно таблица, поскольку она не является списком адресов, а действительными инструкциями?

Адрес, в котором выполняется код, обычно не является жестко запрограммированным, в случае ARM да, но в целом таблица векторов прерываний представляет собой список адресов, расположение этой таблицы и каждой записи в таблице является фиксированным адресом но каким-то образом пользователи программного обеспечения заполняют эту таблицу адресами с кодом. Аппаратное обеспечение для этих ситуаций обнаруживает событие, основанное на том, что это событие читается из памяти в известном всем местоположении, это местоположение содержит адрес, и оно начинает получать/запускать по этому адресу. адреса жесткого кодирования для выполнения в конечном итоге будут иметь ситуацию с оружием или что-то в этом роде, было бы разумно, например, сбросить с 0x0000 и префикс прервать в 0x1000, а прервать данные в 0x2000 и т. д. вы хотите, чтобы таблица инструкций или адресов будь красивой и тугой. Если бы не запатентовал, вы могли бы создать стол, подобный руке, для почти любой архитектуры, возможно, более четырех байтов на исключение, но вы все равно можете это сделать. Или просто делайте адрес.

ARM переключился на традиционную вещь адреса в Cortex-M, но в отличие от традиционной вещи адреса существуют десятки потенциально сотен отдельных векторов (в микроконтроллере!) Каждая мелочь имеет точку входа. Причина в том, что если вы читаете внутри или между строками своих документов, cortex-m спроектирован так, что вам не нужна сборка, обернутая вокруг вашего обработчика C, с традиционным процессором возврат прерывания является особым и требует специальной инструкции, например, запись прерывания часто включала сохранение всех регистров, в которых соглашение о вызове C для этого процессора, возможно, не спасло все. Поэтому требуется какая-то сборка и/или специфические для компилятора директивы, чтобы заставить компилятор сделать это за вас. с корой m вы можете иметь нормальную, а не специальную функцию C и просто поместить адрес этой функции C в огромную таблицу векторов прерываний в нужном месте.

Почему в загрузчике.

  • загрузчик, как правило, энергонезависимый код, flash/rom.
  • загрузчик обрабатывает событие сброса
  • Для загрузки процессора вам потребуется как минимум достаточно IVT В флэш-памяти, чтобы найти обработчик сброса.

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

Поскольку у вас уже есть один элемент таблицы векторов в flash/rom, вы оставите там остальное. и назовите все это загрузчиком. После загрузки вы можете захотеть, чтобы векторная таблица была изменчивой, чтобы вы могли иметь прерывания, указывая на обработчик на основе операционной системы, который загрузочный загрузчик загружался, а не он был энергонезависимым, указывал на обработчик загрузчика или какой-то жесткий адрес в пространстве. И есть много разных способов решения этой проблемы, общие категории переключения контроллера памяти на точку в ram (после запуска и запуска), чтобы обработчики загрузчика использовали какое-то косвенное обращение к некоторым местам помех, кроме сброса. Как вы на самом деле реализуете это, и т. Д. Меняется. с MMU в вашей системе, например, вы можете легко перерисовать векторную таблицу в ram ...

Смежные вопросы