1. Введение: зачем нужны прерывания
Прерывание (interrupt) — механизм, позволяющий микроконтроллеру (МК) временно приостановить выполнение основной программы для обработки срочного события, а затем вернуться к ней.
Ключевые задачи:
- реакция на внешние события в реальном времени;
- эффективное управление ресурсами (не нужно «опрашивать» устройства в цикле);
- разделение задач по приоритетам;
- энергосбережение (CPU может находиться в режиме сна до прерывания).
Примеры событий, вызывающих прерывания:
- нажатие кнопки;
- приём байта по UART;
- переполнение таймера;
- срабатывание АЦП;
- ошибка питания.
2. Классификация прерываний
2.1. По источнику
- Аппаратные — генерируются внешними устройствами или периферией МК (GPIO, UART, таймеры).
- Программные — инициируются командами в коде (например,
SWIв ARM). - Исключения (exceptions) — ошибки выполнения (деление на ноль, нарушение доступа к памяти).
2.2. По приоритету
- Высокоприоритетные — обрабатываются немедленно (например, аварийные сигналы).
- Низкоприоритетные — могут быть отложены при обслуживании более важных прерываний.
2.3. По типу обслуживания
- Векторные — каждый источник имеет свой вектор (адрес обработчика).
- Опрашиваемые — CPU сам определяет источник после входа в общий обработчик.
3. Архитектура системы прерываний
3.1. Основные компоненты
- Контроллер прерываний (Interrupt Controller, IC):
- принимает запросы от источников;
- определяет приоритет;
- формирует сигнал прерывания для CPU.
- Векторная таблица (Interrupt Vector Table, IVT):
- массив адресов обработчиков (по одному на каждый источник).
- Регистры состояния и управления:
- флаги запросов (IRQ Flags);
- маски прерываний (Interrupt Mask);
- регистры приоритета.
- Линия запроса прерывания (IRQ Pin) — физический сигнал от периферии к CPU.
3.2. Типовая последовательность обработки
- Устройство устанавливает сигнал IRQ.
- Контроллер прерываний:
- проверяет маски и приоритеты;
- если разрешено — сигнализирует CPU.
- CPU:
- сохраняет контекст (регистры, PC, флаги);
- отключает прерывания (или понижает приоритет);
- переходит к обработчику по вектору.
- Обработчик выполняет действия (чтение данных, сброс флага и т.п.).
- CPU восстанавливает контекст и возвращается к основной программе.
4. Управление прерываниями: регистры и флаги
4.1. Ключевые регистры
- Interrupt Request Register (IRR) — отражает текущие запросы.
- Interrupt Mask Register (IMR) — битовая маска разрешённых прерываний.
- Interrupt Priority Register (IPR) — уровни приоритета для каждого источника.
- Status Register (SREG) — глобальный флаг разрешения прерываний (например, бит
Iв AVR).
4.2. Операции с прерываниями
- Разрешение/запрет:
- глобально (через бит
I); - индивидуально (установка битов в IMR).
- глобально (через бит
- Сброс флага запроса — часто требуется явно в обработчике.
- Изменение приоритета — динамическая настройка.
5. Обработчики прерываний (ISR)
5.1. Особенности реализации
- Компактность — минимизация времени выполнения.
- Атомарность — избегание блокировок и долгих операций.
- Безопасность — сохранение/восстановление регистров.
- Минимальный стек — ограничение на глубину вызовов.
5.2. Пример кода (AVR GCC)
ISR(USART_RX_vect) {
char data = UDR0; // Чтение принятого байта
buffer[buf_index++] = data;
if (buf_index >= BUFFER_SIZE) {
buf_index = 0;
}
}
5.3. Ограничения
- Нельзя использовать
delay()и другие функции, зависящие от таймера. - Опасно работать с динамической памятью (
malloc/free). - Избегать вложенных прерываний без явного разрешения.
6. Приоритеты и вложенные прерывания
6.1. Система приоритетов
- Каждый источник имеет уровень приоритета (например, 0–7).
- CPU обслуживает прерывание с наивысшим приоритетом.
- Низкоприоритетные могут быть отложены.
6.2. Вложенные прерывания (Nested Interrupts)
- Разрешено, если:
- текущий ISR не отключил прерывания глобально;
- новое прерывание имеет более высокий приоритет.
- Требует аккуратного управления стеком и флагами.
6.3. Механизмы вытеснения
- Preemption — высокоприоритетное прерывание прерывает низкоприоритетное.
- Polling — если приоритеты равны, обработка по порядку поступления.
7. Специфические типы прерываний
7.1. Прерывания от таймеров
- Переполнение (Timer Overflow) — счётчик достиг максимума.
- Сравнение (Compare Match) — значение счётчика равно регистру сравнения.
- Захват (Input Capture) — фиксация времени внешнего события.
Применение:
- генерация ШИМ;
- измерение длительности импульсов;
- периодические задачи (например, опрос датчиков).
7.2. Прерывания от UART/SPI/I²C
- Приём данных (RX Complete) — байт в буфере.
- Передача завершена (TX Complete) — буфер пуст.
- Ошибка (Overrun, Parity Error).
Особенности:
- буферизация данных;
- контроль переполнения.
7.3. Прерывания от GPIO
- Фронт (Rise/Fall) — изменение уровня.
- Уровень (High/Low) — длительное состояние.
- Смена состояния (Any Logic Change).
Применение:
- кнопки и переключатели;
- энкодеры;
- датчики с цифровым выходом.
8. Энергосбережение и прерывания
8.1. Режимы сна
- Idle — CPU остановлен, периферия работает (прерывания активны).
- Power-down — почти всё отключено, только внешние прерывания и сторожевой таймер.
8.2. Пробуждение от прерывания
- Прерывание выводит МК из режима сна.
- После обработки ISR программа продолжает выполнение.
Пример:
- МК спит в
Power-down. - Нажатие кнопки генерирует IRQ.
- МК просыпается, выполняет ISR, снова засыпает.
9. Отладка и диагностика
9.1. Типичные ошибки
- Потерянные прерывания — не сброшен флаг запроса.
- Конфликты приоритетов — низкоприоритетные не обслуживаются.
- Переполнение стека — слишком глубокие вложенные ISR.
- Гонка данных — несогласованный доступ к переменным.
9.2. Инструменты отладки
- Логический анализатор — захват сигналов IRQ.
- Отладчик (JTAG/SWD) — пошаговое выполнение ISR.
- Осциллограф — измерение времени реакции.
- Счётчики событий — статистика по прерываниям.
9.3. Методы тестирования
- Искусственная генерация прерываний (через регистры).
- Замер времени выполнения ISR.
- Проверка восстановления контекста.
10. Особенности в разных архитектурах
10.1. AVR (Atmel/Microchip)
- Векторная таблица в начале Flash.
- Бит
Iв SREG для глобального разрешения. - Отдельные регистры масок для каждой периферии.
10.2. ARM Cortex-M
- NVIC (Nested Vectored Interrupt Controller) — продвинутый контроллер.
- Поддержка до 240 источников с приоритетами.
- Автоматическое сохранение контекста.
- Регистры
ICSR,AIRCRдля управления.
10.3. PIC (Microchip)
- Единый вектор прерывания (требуется опрос источников).
- Ограниченные возможности приоритезации.
- Явное сохранение/восстановление



