Что произошло, когда я сбросил флаг прерывания перед тем, как войти в обработчик прерывания? - PullRequest
0 голосов
/ 10 июля 2020

Допустим, прерывание (прерывание 1) происходит, когда я нахожусь в ISR для другого прерывания (прерывание 2) с таким же или более высоким приоритетом. Затем перед выходом из текущего ISR я сбрасываю флаг прерывания прерывания 1. Будет ли обработчик прерывания 1 по-прежнему выполняться или прерывание 1 будет проигнорировано?

Для контекста я использую микроконтроллер STM32.

Спасибо

1 Ответ

0 голосов
/ 10 июля 2020

AFAIK из прошлого опыта других процессоров, вы теряете прерывание.

В таком случае перед очисткой флага прерывания 1:

  • просто прочитайте бит флага прерывания 1 и временно сохранить его
  • очистить флаг прерывания (в некоторых процессорах, читающих его, сбрасывает его автоматически)
  • в конце прерывания 2 проверьте сохраненный бит
    • , если он не установлен, просто оставьте процедуру прерывания 2
    • , если она установлена ​​и оба прерывания имеют одинаковый приоритет (или это не имеет значения!):
      • просто перейдите / вызовите другую процедуру прерывания 1 ( "остаться" при выполнении подпрограммы прерывания 2)
    • если оно установлено и прерывание 1 имеет другой приоритет, и вам действительно нужно назначить ему правильный:
      • тогда становится сложно, вот несколько вариантов:
        • как только я заставил процессор запустить другое неиспользуемое прерывание 3 с таким же приоритетом, как прерывание 1, поэтому использование прерывания 3 для выполнения подпрограммы «прерывание 1»
        • построить обработка приоритета прерывания в коде, насколько это необходимо и возможно, используя описанный выше трюк и многое другое ...

PS : Это должно быть описано в руководстве процессора, приведет ли сброс бита прерывания к потере его выполнения - в основном да, бит прерывания - это просто бит "ожидания прерывания". Иногда найти описание непросто, но повседневные дела.

...