Программное прерывание против функции


10

Спустя примерно 3 года работы с микроконтроллерами я все еще не знаю, как используются программные прерывания? Я сделал несколько работ с STM32, и я никогда не использовал программные прерывания. На самом деле это большой вопрос для меня:

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

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


1
Я думаю, что основная цель использования прерываний состоит в том, что вы можете продолжать выполнять другие важные задачи, ожидая, пока что-то произойдет, и когда время не всегда будет постоянным. Также я думаю, что в большинстве случаев это немного быстрее, чем опрос.
MrPhooky

1
@MrPhooky Это аппаратные прерывания, о которых вы говорите. ОП говорит о программных прерываниях.
Brhans

Ответы:


19

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

  • Функция выполняется в контексте вашей основной программы.
  • Прерывание выполняется в контексте обработчика прерывания.

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

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


1
Кроме того, прерывания могут произвольно останавливать выполнение программы, поэтому система может делать что-то еще (например, аппаратные прерывания). Ваши программы не должны принимать это во внимание, потому что, с точки зрения вашей программы, состояние функции не меняется с момента возникновения прерывания. В старых системах программы TSR (Terminate / Stay Resident) имитировали многозадачность, подключая прерывание таймера / тактового генератора. Даже без уровней IOPL было полезно, скажем, поддерживать системные часы в актуальном состоянии.
phyrfox

4
Может также заметить, что эти «программные прерывания» также называются «синхронными прерываниями», потому что код приложения точно знает, когда и почему происходит такое прерывание, в отличие от «асинхронных прерываний», которые могут, с точки зрения приложения, в основном, происходят в любое время по незапрошенной манере.
JimmyB

@HannoBinder: Я думаю, что OP говорит о публикации запросов на прерывание в векторный контроллер прерываний Cortex-M3; если код для высокоприоритетного прерывания отправляет более низкоприоритетный, запрос будет отложен до некоторого более позднего времени, когда все высокоприоритетные прерывания завершатся.
суперкат

12

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

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

В чем разница между программным прерыванием и функцией?

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


2
Другим распространенным шаблоном может быть наличие прерывания 100 кГц для обработки данных, критичных по времени, а также необходим тик таймера 1 кГц, но не должно быть двух доступных таймеров. Для подпрограммы прерывания 100 кГц не требуется много времени, чтобы сказать, что if ((timer_count--) & 0x80000000) SET_TICK_INTERRUPT_FLAG(); else timer_count = temp-1; другое прерывание может тогда сделать свое дело и с кратковременно отключенными прерываниями добавить 100 к timer_count; даже если для выполнения процедуры 1 кГц требуется более 10 мкс, она не помешает 100 кГц.
суперкат

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

Вы в основном описали вариант «нижней половины». Есть ли у вас какие-либо ссылки на то, что это также называют «программным прерыванием»? Это совсем не то же самое, что ответ Майенко, а вопрос помечен как ARM - в архитектуре фактически есть инструкция SWI (программное прерывание).
Домен

3
@ Домен Я не уверен, какая ссылка вам нужна. Это называется «программным прерыванием», потому что это то, что используется для его достижения. В контексте ARM OP специально ссылался на STM32 и предоставил ссылку на справочное руководство RM0008. Это не базовое руководство по ARM. Единственным «программным прерыванием», охватываемым в RM0008, является EXTI_SWIER (регистр событий программного прерывания), который можно использовать для генерации программных прерываний независимо от того, используются ли фактические аппаратные выводы для прерываний. Я лично не использовал инструкцию SWI (SWC).
Тута

Спасибо! Возможно, было бы полезно включить часть этой информации в ответ, чтобы было ясно, какое «программное прерывание» это.
Домен

7

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

Если вы не используете ОС и управляете всем кодом на MCU, вам, вероятно, не нужно использовать программные прерывания. (Хотя, как упомянул Тут, они могут иметь другое применение.)

Интерфейсы системных вызовов Linux и MS-DOS на платформе x86 используют программные прерывания, поэтому я приведу ссылку на них в качестве примера.


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

1
Я до сих пор программирую вещи (тоже новенькие) для DOS и хорошо знаком с обработчиками int 21. Практически все, что мне нужно для ввода / вывода, обрабатывается DOS ISR.
R Drast

Обратите внимание, что цитируемая страница для Linux относится к 1993-1996 гг.
CVn

Я заменил ссылку на более современную.
Адам Хаун
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.