Главная / Без рубрики / Организация прерываний (Interrupts) в микроконтроллерах

Организация прерываний (Interrupts) в микроконтроллерах

1. Введение: зачем нужны прерывания

Прерывание (interrupt) — механизм, позволяющий микроконтроллеру (МК) временно приостановить выполнение основной программы для обработки срочного события, а затем вернуться к ней.

Ключевые задачи:

  • реакция на внешние события в реальном времени;
  • эффективное управление ресурсами (не нужно «опрашивать» устройства в цикле);
  • разделение задач по приоритетам;
  • энергосбережение (CPU может находиться в режиме сна до прерывания).

Примеры событий, вызывающих прерывания:

  • нажатие кнопки;
  • приём байта по UART;
  • переполнение таймера;
  • срабатывание АЦП;
  • ошибка питания.

2. Классификация прерываний

2.1. По источнику

  • Аппаратные — генерируются внешними устройствами или периферией МК (GPIO, UART, таймеры).
  • Программные — инициируются командами в коде (например, SWI в ARM).
  • Исключения (exceptions) — ошибки выполнения (деление на ноль, нарушение доступа к памяти).

2.2. По приоритету

  • Высокоприоритетные — обрабатываются немедленно (например, аварийные сигналы).
  • Низкоприоритетные — могут быть отложены при обслуживании более важных прерываний.

2.3. По типу обслуживания

  • Векторные — каждый источник имеет свой вектор (адрес обработчика).
  • Опрашиваемые — CPU сам определяет источник после входа в общий обработчик.

3. Архитектура системы прерываний

3.1. Основные компоненты

  1. Контроллер прерываний (Interrupt Controller, IC):
    • принимает запросы от источников;
    • определяет приоритет;
    • формирует сигнал прерывания для CPU.
  2. Векторная таблица (Interrupt Vector Table, IVT):
    • массив адресов обработчиков (по одному на каждый источник).
  3. Регистры состояния и управления:
    • флаги запросов (IRQ Flags);
    • маски прерываний (Interrupt Mask);
    • регистры приоритета.
  4. Линия запроса прерывания (IRQ Pin) — физический сигнал от периферии к CPU.

3.2. Типовая последовательность обработки

  1. Устройство устанавливает сигнал IRQ.
  2. Контроллер прерываний:
    • проверяет маски и приоритеты;
    • если разрешено — сигнализирует CPU.
  3. CPU:
    • сохраняет контекст (регистры, PC, флаги);
    • отключает прерывания (или понижает приоритет);
    • переходит к обработчику по вектору.
  4. Обработчик выполняет действия (чтение данных, сброс флага и т.п.).
  5. 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)

  • Единый вектор прерывания (требуется опрос источников).
  • Ограниченные возможности приоритезации.
  • Явное сохранение/восстановление

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *