Задержка прерывания
Задержка прерывания показывает, как быстро микроконтроллер начинает обрабатывать событие: сколько тактов проходит от запроса периферии до первой команды обработчика. От неё зависит, успеет ли программа отреагировать на быстрый сигнал.
Обновлено Редакция GAW
Задержка прерывания (interrupt latency) — время от появления запроса прерывания до выполнения первой команды обработчика. Его складывают аппаратное сохранение состояния, чтение вектора и переход, а также ожидание окончания текущей команды и такты ожидания памяти. Для быстрых событий — коротких импульсов, точных отсчётов времени — эта задержка определяет, успеет ли программа отреагировать.
Cortex-M3
| Событие | Тактов (память без ожидания) |
|---|---|
| Вход в обработчик | не больше 12 |
| Возврат из обработчика | 12 |
| Переход к следующему ожидающему обработчику (tail-chaining) | 6 |
За 12 тактов входа ядро само сохраняет в стек восемь регистров и параллельно читает адрес обработчика, поэтому обработчик — обычная функция на C. Длинные команды задержку не увеличивают: деление ядро бросает и начинает заново после возврата. Если во время сохранения регистров приходит прерывание с более высоким приоритетом, ядро начинает с его обработчика — это опоздавшее прерывание (late arrival). При 72 МГц 12 тактов — 167 нс, но у STM32F103 флеш-память на этой частоте работает с тактами ожидания, и реальная задержка больше (TRM Cortex-M3, раздел 3.9). Подробнее — в статье об архитектуре Cortex-M3.
AVR
У ATmega328P реакция — не меньше четырёх тактов на сохранение счётчика команд плюс переход из таблицы векторов; текущая многотактная команда сначала завершается, а из сна добавляется ещё четыре такта и время запуска генератора. Регистр SREG аппаратно не сохраняется — это делает компилятор в функции ISR(). Подробнее — в статье об архитектуре AVR, об устройстве прерываний в целом — на странице «Прерывание».
Частые вопросы
Какая задержка прерывания у STM32F103?
Ядро Cortex-M3 тратит не больше 12 тактов от запроса до первой команды обработчика при памяти без тактов ожидания — при 72 МГц это 167 нс. За эти такты ядро само сохраняет в стек восемь регистров и читает адрес обработчика. У STM32F103 флеш-память на 72 МГц работает с двумя тактами ожидания, поэтому реальная задержка больше.
Что такое хвостовая цепочка (tail-chaining)?
Если к концу обработчика ждёт другое прерывание с достаточным приоритетом, ядро Cortex-M3 не восстанавливает регистры, чтобы тут же сохранить их снова, а сразу переходит к следующему обработчику — за 6 тактов вместо 12 + 12. Кадр в стеке остаётся тем же.
Сколько тактов реакция на прерывание у AVR?
Не меньше четырёх тактов на сохранение счётчика команд в стек, затем переход по таблице векторов — ещё три такта. Если выполнялась многотактная команда, она сначала завершается, а из режима сна реакция удлиняется ещё на четыре такта плюс время запуска генератора. Возврат командой RETI занимает четыре такта.
Источники
- Arm. Cortex-M3 Processor Technical Reference Manual, revision r2p1 (ARM 100165), 2016 — разд. 3.9 — задержка прерывания 12 тактов, возврат 12 тактов, хвостовая цепочка 6 тактов, опоздавшее прерывание
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet, DS40002061B — гл. 7 — время реакции на прерывание: не меньше 4 тактов, RETI — 4 такта, плюс 4 такта при выходе из сна
Нашли ошибку?
Смотрите также
- Cortex-M3Регистры, карта памяти, bit-banding, NVIC, SysTick, MPU, старт, пример
- Архитектура AVRЯдро, конвейер, память, порты, прерывания, сброс, такты и сон
- ПрерываниеЗапрос периферии, вектор и обработчик прерывания
- Такты ожидания флеш-памяти STM32LATENCY в FLASH_ACR по частоте и питанию, таблица и код