
При срабатывании прерывания микроконтроллер сохраняет контекст выполнения: содержимое регистров, счётчик команд и флаги состояния. После этого управление передаётся в ISR (Interrupt Service Routine) – функцию, в которой выполняется обработка события. Важно, чтобы ISR была максимально короткой, так как во время её выполнения другие прерывания могут быть заблокированы или отложены, что увеличивает латентность системы.
Использование прерываний требует тщательной настройки приоритетов. В микроконтроллерах с поддержкой вложенных прерываний (например, в архитектуре ARM Cortex-M) возможно прерывание одной ISR другой, более приоритетной. Это позволяет оптимизировать реакцию на разные типы событий, но при неправильной конфигурации может привести к взаимоблокировкам или потере данных. Для предотвращения ошибок рекомендуется явно указывать приоритеты, контролировать время выполнения обработчиков и минимизировать использование глобальных переменных внутри ISR.
Аппаратная схема обработки прерываний

Микроконтроллер содержит специализированный контроллер прерываний, который отслеживает сигналы от периферийных модулей и внешних входов. Каждое прерывание имеет аппаратный источник, линию запроса и регистр состояния. При поступлении сигнала контроллер фиксирует событие в регистре флагов, блокирует повторную активацию до сброса и передаёт управление ядру.
Приоритет определяется внутренней логикой или конфигурацией в регистрах приоритета. Высший приоритет немедленно прерывает выполнение низкоприоритетного обработчика, что требует продуманной расстановки значений для предотвращения задержек критичных задач.
Механизм вектора прерываний обеспечивает переход к конкретному адресу обработчика без программного опроса устройств. Векторная таблица размещается в области памяти, определённой архитектурой, и должна быть корректно инициализирована при старте системы.
Для минимизации латентности рекомендуется отключать неиспользуемые источники, использовать режимы edge-triggered для кратковременных событий и контролировать флаги в периферии до выхода из обработчика. Неверная конфигурация может привести к ложным срабатываниям или потере событий.
Различия между маскируемыми и немаскируемыми прерываниями
Маскируемые прерывания (IRQ) обрабатываются только при разрешении их контроллером и состоянием флага прерываний в процессоре. Их можно временно блокировать установкой бита запрета, что используется при выполнении критических участков кода, где недопустимо вмешательство менее приоритетных задач. Такой механизм позволяет управлять порядком обслуживания запросов и предотвращать коллизии в доступе к общим ресурсам.
Немаскируемые прерывания (NMI) не зависят от состояния флагов и всегда обрабатываются, если они активированы аппаратно. Они применяются для сигнализации о критических событиях, например, сбоя питания, аппаратных отказов, ошибок шины. Игнорировать их нельзя, так как промедление может привести к потере данных или повреждению системы.
При разработке прошивки рекомендуется минимизировать длительность обработчиков NMI, выполняя только действия, необходимые для фиксации состояния и предотвращения дальнейших повреждений, а основную обработку переносить в основной цикл или задачу. Для маскируемых прерываний целесообразно назначать приоритеты, исходя из частоты возникновения событий и их влияния на стабильность системы.
Настройка приоритетов прерываний в микроконтроллере

В микроконтроллерах ARM Cortex-M приоритеты прерываний управляются контроллером NVIC через регистры IPR. Каждому источнику прерывания соответствует поле в этих регистрах, позволяющее задать уровень приоритета в диапазоне от 0 (максимальный) до значения, зависящего от разрядности аппаратной реализации.
Аппаратно приоритет делится на preempt priority и subpriority. Первый определяет возможность вытеснения текущего обработчика, второй – порядок обслуживания при совпадении preempt priority. Конфигурация количества бит, отводимых под каждую часть, выполняется через регистр PRIGROUP в SCB.
Для критических сигналов, таких как аппаратный watchdog или аварийное отключение питания, следует назначать наименьший preempt priority. Источники, не требующие немедленного реагирования, например обновление таймера интерфейса, должны иметь более высокий числовой приоритет.
Перед включением прерывания необходимо установить его приоритет и только затем разрешить в NVIC, чтобы избежать выполнения с некорректным уровнем. При динамическом изменении приоритетов в ходе работы системы следует использовать секции с запретом прерываний, исключающие изменение регистра в момент активного обслуживания.
Если микроконтроллер поддерживает меньше бит приоритета, чем доступно в программной модели, младшие биты будут проигнорированы аппаратно, что нужно учитывать при проектировании схемы приоритетов, чтобы избежать ложных предположений о точности разделения.
Использование вектора прерываний и таблицы векторов

Вектор прерываний представляет собой адрес входной точки обработчика, по которому процессор начинает выполнение кода при возникновении события. В микроконтроллерах этот адрес хранится в таблице векторов – области памяти, где каждая позиция соответствует конкретному источнику прерывания.
Таблица векторов обычно располагается в начале или в специально выделенной области памяти. Например, у микроконтроллеров ARM Cortex-M начальный адрес таблицы задаётся регистром VTOR, что позволяет при необходимости перемещать её в оперативную память для динамической перенастройки.
Каждая запись таблицы – это либо прямой адрес обработчика, либо команда перехода на него. Для минимизации времени реакции рекомендуется размещать обработчики в быстрой памяти (например, внутренней Flash или SRAM), избегать ненужных вызовов инициализации внутри прерывания.
При разработке прошивки важно контролировать заполнение всех векторов, включая резервные, чтобы предотвратить выполнение неопределённого кода. Неиспользуемые векторы следует перенаправлять на безопасную заглушку с бесконечным циклом или программным сбросом.
Изменение адресов в таблице векторов во время работы допускается только при отключённых соответствующих прерываниях, иначе возможно выполнение некорректного кода. Такой подход используется для реализации загрузчиков и переключения между приложениями без перезапуска микроконтроллера.
Обработка вложенных прерываний и защита от конфликтов

Вложенные прерывания позволяют микроконтроллеру приостанавливать выполнение одного обработчика прерывания для обработки более приоритетного. Для реализации необходима аппаратная или программная приоритетная система, которая управляет уровнем маскирования прерываний. В ARM Cortex-M, например, используется NVIC с 8-битным приоритетом, где более низкое значение приоритета означает более высокий приоритет прерывания.
Чтобы корректно работать с вложенными прерываниями, обработчик должен временно увеличивать уровень маскирования, блокируя прерывания с одинаковым или более низким приоритетом, и разрешать более приоритетные. При этом нельзя полностью отключать глобальные прерывания, чтобы не нарушить вложенность.
Конфликты возникают, когда несколько прерываний обращаются к общим ресурсам (переменным, периферии). Для предотвращения гонок применяется запрет прерываний на критических участках или использование атомарных операций. Встроенные механизмы, например, блокировка с помощью флагов состояния и проверка их в начале обработчика, обеспечивают защиту от повторного входа и взаимоблокировок.
Важно минимизировать время обработки вложенных прерываний, избегая длительных блокировок и сложных вычислений в ISR. Рекомендуется выносить основную логику в основную программу или отдельные задачи, а в прерываниях только ставить флаги или копировать данные.
Реализация вложенных прерываний требует тщательной настройки приоритетов и маскирования. Следует избегать одинаковых приоритетов для прерываний, которые могут конкурировать за ресурсы, либо обеспечивать синхронизацию на уровне кода. Использование аппаратных таймеров и FIFO-буферов в периферии снижает нагрузку и снижает вероятность конфликтов.
Применение внешних прерываний для работы с датчиками

Внешние прерывания микроконтроллеров позволяют эффективно реагировать на события, генерируемые датчиками, без необходимости постоянного опроса. Это значительно снижает нагрузку на процессор и улучшает энергопотребление.
Для корректной работы с датчиками через внешние прерывания необходимо учитывать следующие параметры:
- Тип сигнала датчика: уровневый или импульсный.
- Полярность срабатывания прерывания: по переднему фронту, заднему фронту или изменению уровня.
- Длительность импульса и возможные шумы на линии.
Рекомендуется использовать аппаратное подавление дребезга контактов (debounce) или реализовывать программную фильтрацию сигналов в обработчике прерывания, чтобы избежать ложных срабатываний.
Основные шаги для интеграции внешних прерываний с датчиками:
- Настройка соответствующего входного пина микроконтроллера как источника прерывания.
- Определение условия срабатывания прерывания (например, переход с 0 на 1 или наоборот).
- Регистрация обработчика прерывания, минимизируя его время выполнения для быстрого возврата к основной программе.
- В обработчике прерывания выполнять минимально необходимую работу: сохранять флаг или данные и запускать последующую обработку в основном цикле.
Пример применения – подключение датчика движения с выходом в виде импульсов. Настройка прерывания по фронту позволяет фиксировать каждое срабатывание с точной временной меткой без постоянного опроса состояния входа.
Для высокочастотных сигналов, например, от тахометров или энкодеров, внешние прерывания позволяют получать точные измерения скорости и положения, при этом нагрузка на процессор остается минимальной.
Следует учитывать, что одновременная работа нескольких внешних прерываний требует приоритетного распределения и защиты от взаимных конфликтов, чтобы избежать потери данных.
Реализация таймерных прерываний для периодических задач

Для организации периодических задач в микроконтроллерах применяются аппаратные таймеры с прерываниями. Основная задача – настроить таймер так, чтобы он генерировал прерывание через заданный интервал времени, минимизируя загрузку ЦП.
Первый шаг – выбор таймера и предделителя. Предделитель снижает частоту тактового сигнала таймера, позволяя добиться нужного периода без переполнения счетчика. Формула расчета периода прерывания: T = (PSC + 1) × (ARR + 1) / F_clk, где PSC – значение предделителя, ARR – автозагрузка счетчика, F_clk – частота тактового сигнала.
Например, при тактовой частоте 16 МГц и требуемом периоде 1 мс можно установить PSC=159 и ARR=99, что даст прерывание каждые 1 мс.
После настройки таймера необходимо включить прерывание по переполнению и настроить вектор прерывания в контроллере прерываний (NVIC в ARM Cortex-M). В обработчике прерывания важно ограничиться минимальным количеством операций: инкремент счетчиков, установка флагов или вызов простых функций. Сложные вычисления лучше выполнять в основном цикле.
Приоритет прерывания задают с учетом важности задачи. Для периодических задач с жесткими временными требованиями приоритет должен быть высоким, чтобы исключить задержки вызванные другими прерываниями.
Необходимо учитывать время выполнения обработчика: если обработка занимает слишком много времени, период может нарушаться. В таких случаях рекомендуют уменьшать нагрузку или использовать аппаратные DMA, если доступно.
В системах с несколькими таймерами следует синхронизировать их работу, чтобы избежать конфликтов и джиттера во временных интервалах. В некоторых микроконтроллерах предусмотрена возможность прямой синхронизации таймеров.
Отладка и тестирование обработчиков прерываний

Для эффективной отладки обработчиков прерываний важно применять методы, позволяющие выявить ошибки, связанные с асинхронностью и прерываниями критичных секций кода.
- Использование аппаратных отладчиков и трассировки. Современные микроконтроллеры поддерживают периферийные модули трассировки (например, ETM, ITM), позволяющие регистрировать момент вызова прерываний и последовательность исполнения без влияния на тайминги.
- Временные метки и профилирование. Добавление в обработчик прерываний счётчиков или аппаратных таймеров помогает измерить время обработки и выявить потенциальные задержки.
- Минимизация кода в обработчике. Для предотвращения взаимных блокировок и сбоев важно ограничить объем кода в прерывании, вынося тяжёлые операции в основной цикл.
- Контроль состояния глобальных и локальных флагов. Для отслеживания корректности работы применяют отладочные переменные, инкрементируемые в обработчике, что позволяет определить частоту и количество срабатываний.
- Использование программных триггеров прерываний. Искусственное вызвание прерываний позволяет проверить корректность обработки и реакцию системы без внешних событий.
- Изоляция критичных секций с отключением прерываний. Тестирование включает проверку, что отключение прерываний в критичных участках не приводит к пропускам важных событий.
Автоматизация тестов с помощью эмуляторов микроконтроллеров и интеграция с CI/CD системами позволяют гарантировать стабильность обработчиков при изменениях кода.
Вопрос-ответ:
Что такое прерывание в микроконтроллере и для чего оно нужно?
Прерывание — это механизм, позволяющий микроконтроллеру временно остановить выполнение основной программы и перейти к обработке более приоритетного события. Оно необходимо для быстрого реагирования на внешние или внутренние сигналы, такие как нажатие кнопки, окончание передачи данных или сбой в работе устройства. Благодаря прерываниям система может работать более гибко и не тратить ресурсы на постоянный опрос состояния периферии.
Как микроконтроллер определяет, какое прерывание нужно обработать, если их несколько одновременно?
Когда одновременно происходит несколько прерываний, микроконтроллер использует систему приоритетов, чтобы определить, какое из них обработать первым. Каждый источник прерывания имеет свой уровень приоритета, заданный аппаратно или программно. Процессор сначала переключается на обработчик прерывания с наивысшим приоритетом. После завершения его обработки он может перейти к другим, если они не были отключены. Такой подход помогает управлять ситуациями с множественными сигналами и предотвращать потерю важных событий.
Какие основные этапы происходят внутри микроконтроллера при обработке прерывания?
Когда возникает прерывание, процессор завершает текущую инструкцию, затем сохраняет адрес следующей команды (чтобы можно было вернуться к основной программе) и переключается на специальную функцию — обработчик прерывания. В обработчике выполняется код, связанный с конкретным событием. По окончании обработки происходит возврат к месту, где была прервана основная программа. Таким образом, происходит временная смена контекста работы микроконтроллера без потери данных и логики выполнения.
Какие ошибки могут возникать при работе с прерываниями и как их избежать?
Одна из распространённых ошибок — слишком длительная обработка в обработчике прерывания, что может привести к задержкам в работе всей системы. Также возможны конфликты при одновременном доступе к общим ресурсам без защиты, что вызывает нестабильность. Для предотвращения подобных проблем рекомендуют писать короткие и быстрые обработчики, использовать флаги и буферы для передачи данных в основную программу, а также отключать прерывания на время критических участков кода. Это помогает сохранять стабильность и предсказуемость работы устройства.
