Разница между программными и аппаратными прерываниями
Недавно я начал работать над микроконтроллерами ARM Cortex. Читая различные статьи через Интернет, я обычно находил 2 общих термина как программное прерывание и аппаратное прерывание. Какова реальная разница в обоих? Можете ли вы объяснить на примере?
3 ответа
Я думаю, вы пытаетесь понять, для чего нужны программные прерывания и как их использовать, а не разницу.
Давайте начнем с того, что характерно для программных и аппаратных прерываний: они оба используются для переключения из основного контекста выполнения в низкоуровневый обработчик прерываний для выполнения некоторых низкоуровневых операций - в основном на периферийном регистре.
Назначение этого переключателя для аппаратных прерываний состоит в том, что аппаратное обеспечение хочет передать некоторые данные программе (переключение GPIO, поступление новых символов в UART и т. Д.). Это легко понять, поскольку, когда вы пишете свою программу, все, что вам нужно сделать, это реализовать обработчики - всякий раз, когда HW требуется ваше действие, вызывается обработчик.
Назначение этого переключателя для программных прерываний состоит в том, что программа хочет передать некоторые данные аппаратному обеспечению. Более конкретно, он хочет получить доступ к некоторым ресурсам, к которым нельзя получить доступ из текущего контекста. Это относится к общему дизайну, где мы не хотим, чтобы приложения высокого уровня связывались с аппаратным обеспечением, например, записывали напрямую во флэш-память или изменяли управляющие регистры USB, поэтому мы блокируем его из верхних уровней и делегируем эту задачу ядру ОС (например, ядро Linux). Ядро получает запросы через программное прерывание от верхних уровней, выполняет некоторые операции, связанные с HW, и возвращает ответы. Программные прерывания также используются для запуска задач по обслуживанию ОС - например, переключение контекста при выполнении в настоящий момент блоков задач на мьютексе.
Это сложнее понять, так как в отличие от прерываний HW программист должен реализовывать как обработчики, так и вызывающие.
Конечно, мое объяснение - это большое упрощение, но я надеюсь, что оно поможет вам понять общую идею. Если вы не внедряете свою ОС или очень сложное голое железо, вам это вообще не нужно. И вам следует избегать модификации программных прерываний связанного кода при использовании ОС, так как система может полагаться на них.
Удачи!
Все они являются прерываниями, это просто связано с источником. Есть некоторые прерывания (это тоже сигналы), которые генерируются инструкциями или ошибками и т. д. (неопределенные, не выровненные и т. д.). И некоторые из них доступны поставщику чипов. ARM делает IP не чипами, поставщику чипов предоставляется ряд прерываний, которые они могут использовать по своему усмотрению. Часто они связаны с периферийными устройствами, такими как USB, GPIO, UART, SPI и т. Д.
У ARM есть одно, называемое программным прерыванием SWI или SVC. И, как и количество программных прерываний в x86, это, например, так, чтобы приложение могло сделать сервисный вызов. На полноразмерном плече это может быть выполнено на более низких / последних уровнях выполнения, но обслуживается более высоким более привилегированным режимом или уровнем выполнения. в основном позволяет вам иметь операционную систему. Может использовать эту функцию на cortex-m, но не имеет уровней защиты, которые предоставляет общий интерфейс, например, когда вы загрузили rtos и хотите написать приложения для него, rtos является generic-ish, а ваши приложения делают то, что вы хотите или должны быть выполнены и могут делать вызовы в rtos (определенный rtos), используя этот интерфейс. будь то рука или x86 вызовы действительно произвольны, логика не диктует, программное обеспечение диктует, традиционно x86 имеет обработчики BIOS для определенных прерываний, но это произвольно, вы можете написать свой собственный BIOS / обработчик, который несовместим с традицией, и он будет работать просто отлично, если обе стороны согласны с интерфейсом, аналогично, вызовы swi/svc для arm не обязательно являются стандартом, у linux может быть один, но freertos не должен соответствовать этому, если они этого не хотят.
Еще одно отличие в случае с Cortex-M, но оно не обязательно является универсальным отличием и не является обязательным, заключается в том, что так называемые внешние прерывания, которые являются внешними по отношению к ядру, но обычно привязаны к элементам, предоставленным поставщиком микросхем, имеют или могут иметь дополнительные слой маскирования, так что вы можете отключить их, используя контроллер прерываний, где тип события прерывается, например, undefined, systick и т. д., хотя это просто сигналы, которые не проходят через маскированный слой. не всегда верно для всех архитектур всех производителей (arm, intel, mips и т. д.), но если я правильно помню, в случае с cortex-m именно так они и реализовали. при условии, что по-прежнему будут появляться новые ядра, и у них нет никаких оснований проектировать их все одинаково.
Аппаратные прерывания генерируются физическими сигналами, либо изнутри самого микроконтроллера (например, как часть контроллера шины), либо из внешнего GPIO, настроенного как прерывание. Эти прерывания обычно связаны с взаимодействием с оборудованием, внешним по отношению к микроконтроллеру, например, прерывания шины SPI или I2C, генерируемые при возникновении события на шине. Эти аппаратные прерывания обычно настраиваются с помощью комбинации управляющих регистров, которые определяют поведение оборудования, и маскировки прерываний, которая позволяет включать или отключать определенные прерывания в любой момент времени. Внутренние аппаратные события, такие как события питания, таймеры и т. Д., Также вызывают прерывания.
Программные прерывания генерируются инструкциями, выполняемыми микроконтроллером. Например, на платформах x86 вы можете использовать INT3
Инструкция по созданию прерывания TRAP для целей отладки. Программные прерывания обычно используются как способ переключения уровней привилегий, например, с помощью системных вызовов, поскольку код, выполняемый в режиме с низким уровнем привилегий, может инициировать прерывание, которое выполняется в режиме с высоким уровнем привилегий, которое затем может соответствующим образом отправлять запрос на системный вызов.
В обоих случаях обработчики прерываний обычно настраиваются с использованием таблицы векторов прерываний. Векторы прерываний - это просто указатели на функции, которые обрабатывают каждое прерывание. Таблица обычно существует в фиксированной ячейке памяти во флэш-памяти или в ПЗУ микроконтроллера, но во многих ситуациях местоположение таблицы прерываний можно настроить как часть процесса программирования. Как правило, каждому типу прерывания присваивается номер, соответствующий его индексу в таблице прерываний, поэтому вы знаете, куда поместить вектор каждого отдельного обработчика.
Аппаратное прерывание запускается аппаратным обеспечением, таким как звуковая микросхема, в то время как программное прерывание запускается программным обеспечением, поскольку это программная инструкция.