Спустя примерно 3 года работы с микроконтроллерами я все еще не знаю, как используются программные прерывания? Я сделал несколько работ с STM32, и я никогда не использовал программные прерывания. На самом деле это большой вопрос для меня:
Почему, когда мы можем использовать простую функцию для выполнения задачи, мы должны использовать программное прерывание? Каковы различия между программным прерыванием и функцией?
Каждый раз, когда вам нравится, вы можете вызывать функцию (которую вы написали для своей работы). Должны быть некоторые преимущества использования программного прерывания вместо простой функции. Я не уверен, но я думаю, что есть преимущество для программных прерываний: вы можете назначить приоритет программному прерыванию, а затем дать программному прерыванию более высокий приоритет, чтобы аппаратное прерывание не нарушало вашу задачу.
источник
Ответы:
Основное различие между функцией и программным прерыванием заключается в том, что называется контекстом .
В простой системе это может не иметь большого значения, и программные прерывания могут просто использоваться как удобный способ предоставления библиотечных подпрограмм, жестко запрограммированных в ПЗУ - вам не нужно знать адрес каждой подпрограммы, только идентификационный код и главная точка входа. Это делает ваш код более переносимым.
Однако в более сложных системах программное прерывание может выполняться в совершенно другой среде, известной как контекст ядра . Обычно ваше приложение будет работать в защищенном пользовательском контексте, который имеет ограниченный доступ к ресурсам. Только при работе в контексте ядра вы можете выполнять более сложные задачи - даже некоторые системы даже ограничивают, какие инструкции могут быть выполнены, поэтому вам необходим механизм для запуска кода в контексте ядра - и для этого используется прерывание.
источник
Программные прерывания могут использоваться для завершения задачи прерывания с более низким приоритетом. Временному критическому коду часто присваивается высокий приоритет прерывания, чтобы избежать слишком большой задержки. Как только критическая часть синхронизации закончена, могут возникнуть дополнительные задачи, которые могут быть слишком критичными по времени для основного цикла, но не настолько важными, чтобы задерживать другие высокоприоритетные прерывания. Это может быть выполнено с помощью программного прерывания с более низким приоритетом.
Например, предположим, что у вас есть несколько шаговых двигателей, каждый со своим таймером. Прерываниям таймера дают высокий приоритет, чтобы минимизировать пошаговое дрожание. Наиболее важной задачей, связанной с синхронизацией, может быть простая установка или очистка шагового импульса или продвижение фазных выходов. Могут потребоваться дополнительные функциональные возможности, такие как вычисление линейных ускорений, обработка датчиков и т. Д. Поскольку это необходимо обрабатывать на каждом этапе, может быть нецелесообразно обрабатывать это из main (), поскольку синхронизация основного цикла может быть слишком продолжительной. Эти дополнительные задачи могут быть обработаны программным прерыванием с более низким приоритетом, чтобы не увеличивать задержку других высокоприоритетных шаговых каналов.
Функция вызывается немедленно, откуда бы она ни вызывалась, и не изменяет текущий уровень приоритета прерывания, если вызывается из прерывания. Программное прерывание - это триггер прерывания, который будет вызывать это прерывание при достижении его приоритета. Если вызов функции был вставлен в конце высокоприоритетного прерывания, функция будет находиться внутри этого высокоприоритетного объекта. Путем запуска программного прерывания с более низким приоритетом и последующего возврата из высокоприоритетного прерывания функциональность вызывается с новым (более низким) приоритетом.
источник
if ((timer_count--) & 0x80000000) SET_TICK_INTERRUPT_FLAG(); else timer_count = temp-1;
другое прерывание может тогда сделать свое дело и с кратковременно отключенными прерываниями добавить 100 к timer_count; даже если для выполнения процедуры 1 кГц требуется более 10 мкс, она не помешает 100 кГц.Чтобы немного расширить ответ Majenko, программные прерывания используются для реализации операционных систем, в частности интерфейса системных вызовов. Это означает, что приложения не должны быть связаны с операционной системой для выполнения вызовов функций, а переключение контекста позволяет ОС ограничивать доступ к оборудованию и использовать преимущества таких вещей, как защищенная память.
Если вы не используете ОС и управляете всем кодом на MCU, вам, вероятно, не нужно использовать программные прерывания. (Хотя, как упомянул Тут, они могут иметь другое применение.)
Интерфейсы системных вызовов Linux и MS-DOS на платформе x86 используют программные прерывания, поэтому я приведу ссылку на них в качестве примера.
источник