Матрица прерываний ESP32
У ядра ESP32 и ESP32-S3 32 входа прерываний (у ESP32-C3 — 31, с номерами 1–31), а источников в периферии — от шести десятков до сотни. Между ними стоит матрица прерываний: она решает, какой источник на какой вход какого ядра попадёт. В ESP-IDF это скрыто в esp_intr_alloc, но на страницах регистров видно, как это устроено.
Обновлено Редакция GAW
Матрица прерываний (interrupt matrix) — блок микроконтроллеров ESP32, который соединяет источники прерываний периферии — UART, таймеры, GPIO, RMT, TWAI и десятки других — с входами прерываний процессорных ядер. Для каждого источника есть регистр отображения INTERRUPT_COREx_<источник>_MAP_REG: в него записывают номер входа ядра, на который этот источник должен попасть (TRM ESP32-S3, гл. 9.3.1).
Сколько источников и входов
| Чип | Источников периферии | Входов ядра для периферии | Источник |
|---|---|---|---|
| ESP32 (два ядра Xtensa LX6) | 71 | 26 на каждое ядро, всего 52 | TRM v5.8, гл. 8.2 |
| ESP32-S3 (два ядра Xtensa LX7) | 99 | 26 на каждое ядро; ещё 6 из 32 — внутренние | TRM v1.8, гл. 9.2 |
| ESP32-C3 (одно ядро RISC-V) | 62 | 31, номера 1–31 | TRM v1.4, гл. 8.2–8.3 |
Источник можно направить на несколько входов, а у двухъядерных чипов — сразу на оба ядра. Матрица умеет запрещать немаскируемые прерывания (NMI) и показывает текущее состояние всех источников в регистрах INTERRUPT_COREx_INTR_STATUS_n_REG. У ESP32-C3 в том же блоке задают приоритет, тип и порог прерываний ядра (TRM ESP32-C3, гл. 8.2).
Чем отличается от ARM
В Cortex-M каждому прерыванию периферии жёстко назначен свой номер в NVIC, и переназначить его нельзя. В ESP32 номер входа ядра выбирают программно через матрицу — так же, как сигналы периферии выводят на любой вывод через матрицу GPIO. В прикладном коде ESP-IDF этим занимается функция выделения прерываний, а механизм самого прерывания — сохранение контекста и переход к обработчику — остаётся за ядром.
Регистры блока INTERRUPT опубликованы на страницах регистров ESP32-S3 и ESP32-C3. Для ESP32-S3 там показан набор ядра 0 (INTERRUPT_CORE0); регистры ядра 1 устроены так же и лежат со смещением +0x800 — например, INTERRUPT_CORE1_MAC_INTR_MAP_REG по адресу 0x0800 (TRM ESP32-S3, гл. 9); обзор семейства — в разделе ESP32.
Не путать
С матрицей GPIO: та коммутирует сигналы периферии на выводы микросхемы, а матрица прерываний — запросы прерываний на входы ядер.
Частые вопросы
Зачем ESP32 матрица прерываний, если есть контроллер прерываний ядра?
Потому что источников больше, чем входов ядра: у ESP32-S3 99 источников периферии, а у каждого ядра 32 прерывания, из которых периферии достаётся 26 (TRM ESP32-S3, гл. 9). Матрица позволяет выбрать, какие источники и на какой вход какого ядра попадут, и даже направить один источник на несколько входов.
Можно ли обработать одно прерывание на обоих ядрах ESP32-S3?
Аппаратно — да: TRM разрешает направить источник одновременно на CPU0 и CPU1, и тогда его примут оба ядра (гл. 9.2). Обработчик, который могут одновременно выполнить оба ядра, должен быть рассчитан на это — общие данные придётся защищать (наш комментарий).
Где посмотреть регистры матрицы прерываний?
На страницах регистров сайта: для ESP32-S3 и ESP32-C3 опубликован блок INTERRUPT с регистрами *_MAP_REG и регистрами состояния. Номер источника и бит состояния берут из таблицы источников TRM (для S3 — табл. 9.3-1).
Источники
- Espressif. ESP32-S3 Technical Reference Manual, Version 1.8, chapter 9 «Interrupt Matrix (INTERRUPT)» — 9.1–9.2: 99 источников прерываний периферии, 26 периферийных прерываний на CPU0 и 26 на CPU1 (оставшиеся шесть из 32 у каждого ядра — внутренние); источник можно направить на несколько прерываний и на оба ядра; можно запретить NMI и читать состояние источников; 9.3.1, табл. 9.3-1: регистр INTERRUPT_COREx_<источник>_MAP_REG и бит в INTERRUPT_COREx_INTR_STATUS_n_REG, например MAC_INTR — бит 0 STATUS_0
- Espressif. ESP32 Technical Reference Manual, Version 5.8, chapter 8 «Interrupt Matrix (INTERRUPT)» — 8.2: 71 источник на входе, по 26 периферийных прерываний на каждое из двух ядер (всего 52), маска NMI, чтение состояния источников
- Espressif. ESP32-C3 Technical Reference Manual, Version 1.4, chapter 8 «Interrupt Matrix (INTERRUPT)» — 8.1–8.2: 62 источника периферии на 31 прерывание ядра RISC-V, номера 1–31 (разд. 8.3); настройка приоритета, типа, порога и разрешения прерываний CPU
Нашли ошибку?
Смотрите также
- ESP32ESP32, S2, S3, C2, C3, C5, C6, H2, P4: ядра, радио, USB, GPIO — сравнение и выбор
- Матрица GPIOПрограммное соединение сигналов периферии ESP32 с любыми выводами
- ПрерываниеЗапрос периферии, вектор и обработчик прерывания
- NVIC — контроллер прерыванийКонтроллер прерываний Cortex-M: приоритеты и вытеснение
- ESP32-S3: выводы и GPIO45 GPIO: функции, свободные и занятые выводы, флеш и PSRAM, strapping, USB, JTAG, токи