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 равный приоритет не вытесняет обработчик независимо от номера прерывания: новое прерывание становится ожидающим и будет обслужено после выхода из текущего обработчика.
Источники
- 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
- Arm. Cortex-M0 Devices Generic User Guide, DUI 0497A — разд. 4.2: NVIC Cortex-M0 — от 1 до 32 прерываний, приоритет 0–192 с шагом 64, реализованы только биты [7:6] байта приоритета; группировки приоритетов нет
- 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
- STMicroelectronics. RM0008 Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx (Rev 21, February 2021) — контроллер внешних прерываний EXTI формирует запросы по фронтам на линиях, в том числе от выводов и PVD (линия 16), и передаёт их в NVIC
Нашли ошибку?
Смотрите также
- Приоритеты прерываний NVICPRIGROUP, вытеснение и подприоритет, NVIC_IPR, AIRCR, bit-band
- Прерывания STM32Векторы и IRQn, приоритеты и HAL, EXTI и общие векторы, флаги, события, примеры
- Прерывания и общие данныеISR на AVR и Cortex-M, атомарность, критические секции, кольцевой буфер
- ПрерываниеЗапрос периферии, вектор и обработчик прерывания