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

Задержка прерывания

Задержка прерывания показывает, как быстро микроконтроллер начинает обрабатывать событие: сколько тактов проходит от запроса периферии до первой команды обработчика. От неё зависит, успеет ли программа отреагировать на быстрый сигнал.

Обновлено Редакция 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 занимает четыре такта.

Источники

  1. Arm. Cortex-M3 Processor Technical Reference Manual, revision r2p1 (ARM 100165), 2016 — разд. 3.9 — задержка прерывания 12 тактов, возврат 12 тактов, хвостовая цепочка 6 тактов, опоздавшее прерывание
  2. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet, DS40002061B — гл. 7 — время реакции на прерывание: не меньше 4 тактов, RETI — 4 такта, плюс 4 такта при выходе из сна

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