Перейти к содержанию

NVIC — контроллер прерываний Cortex-M

В микроконтроллерах на ядре Cortex-M прерываниями от периферии управляет NVIC — часть самого ядра. Он решает, какое прерывание обслужить первым, может ли оно прервать уже работающий обработчик и какие прерывания сейчас разрешены.

Обновлено Редакция GAW

NVIC (Nested Vectored Interrupt Controller, контроллер вложенных векторных прерываний) — контроллер прерываний, встроенный в ядра Arm Cortex-M. «Векторный» — потому что адрес обработчика каждого прерывания процессор сам берёт из таблицы векторов, «вложенный» — потому что более важное прерывание может прервать менее важный обработчик.

Что умеет

По руководству Arm для Cortex-M3 (разд. 4.2) NVIC поддерживает от 1 до 240 прерываний — точное число выбирает производитель микроконтроллера, — программируемый приоритет 0–255 для каждого, импульсные и уровневые сигналы, изменение приоритетов на ходу, группировку приоритетов и немаскируемое прерывание NMI. Регистры приоритета 8-битные, но производитель может реализовать только старшие биты: у STM32F1 и STM32F4 их 4 (16 уровней), подробнее в статье «Прерывания STM32».

У Cortex-M0 и M0+ (STM32F0, G0, L0, C0) NVIC проще: по руководству Arm DUI 0497A — от 1 до 32 прерываний, реализованы только 2 старших бита приоритета (уровни 0, 64, 128, 192, то есть 4 уровня), а группировки на группу и подприоритет нет.

Приоритеты

ИсключениеПриоритет
Reset−3, наивысший
NMI−2
HardFault−1
Остальные, включая прерывания периферии0–255 у M3/M4, 0–192 с шагом 64 у M0/M0+

Меньшее число — более высокий приоритет. У Cortex-M3/M4 поле приоритета делится на две части:

  • группа — только она решает, может ли прерывание вытеснить работающий обработчик;
  • подприоритет — порядок обслуживания ожидающих прерываний одной группы.

При полном равенстве первым обслуживается прерывание с меньшим номером, а прерывание того же приоритета никогда не вытесняет текущий обработчик — оно ждёт. Запретить прерывания целиком или ниже порога можно регистрами PRIMASK и BASEPRI — так делают критическую секцию.

Не путать NVIC с EXTI у STM32: EXTI — периферийный блок, который превращает фронты на выводах в запросы прерываний, а NVIC уже решает, когда их обслужить. Разбор приоритетов, групп и значения регистров считает калькулятор приоритетов NVIC, общие правила работы с прерываниями — в статье «Прерывания и общие данные», основы — в термине «Прерывание».

Частые вопросы

Какой приоритет в NVIC самый высокий?

С наименьшим числом: 0 — наивысший из настраиваемых, самый низкий — 255 у Cortex-M3/M4 и 192 у Cortex-M0/M0+. Выше любых настраиваемых стоят Reset (−3), NMI (−2) и HardFault (−1) — их приоритет фиксирован. Если приоритет не настраивать, у всех настраиваемых исключений он равен 0.

Чем группа приоритета отличается от подприоритета?

Группы есть только у Cortex-M3, M4 и старше; у Cortex-M0/M0+ поле приоритета не делится. Вытеснение решает только группа: обработчик может прервать другой, лишь если его группа выше. Подприоритет определяет, какое из ожидающих прерываний с одинаковой группой обслужить первым. При равенстве и группы, и подприоритета первым идёт прерывание с меньшим номером.

Прерывает ли прерывание с тем же приоритетом работающий обработчик?

Нет. По руководству Arm равный приоритет не вытесняет обработчик независимо от номера прерывания: новое прерывание становится ожидающим и будет обслужено после выхода из текущего обработчика.

Источники

  1. Arm. Cortex-M3 Devices Generic User Guide, DUI 0552A, 2010 — разд. 4.2: NVIC поддерживает от 1 до 240 прерываний, приоритет 0–255 (больший номер — более низкий приоритет), импульсные и уровневые сигналы, группировку на группу и подприоритет, хвостовую цепочку, NMI; разд. 2.3.5: приоритет по умолчанию 0, при равном приоритете — меньший номер, равный приоритет не вытесняет; разд. 2.3.6: вытеснение определяет только группа; табл. 2-16: Reset −3, NMI −2, HardFault −1
  2. Arm. Cortex-M0 Devices Generic User Guide, DUI 0497A — разд. 4.2: NVIC Cortex-M0 — от 1 до 32 прерываний, приоритет 0–192 с шагом 64, реализованы только биты [7:6] байта приоритета; группировки приоритетов нет
  3. Arm. CMSIS 6.4.0: CMSIS/Core/Include/cmsis_gcc.h, m-profile/cmsis_gcc_m.h, core_cm3.h — функции __disable_irq, __get/__set_PRIMASK, __set_BASEPRI
  4. STMicroelectronics. RM0008 Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx (Rev 21, February 2021) — контроллер внешних прерываний EXTI формирует запросы по фронтам на линиях, в том числе от выводов и PVD (линия 16), и передаёт их в NVIC

Нашли ошибку?