Как избежать вложенности прерываний CortexM

Я хочу избежать вложенных прерываний в записи прерываний в микроконтроллере на основе CortexM.

Для этого у меня есть файл сборки, содержащий векторы прерываний, и первая инструкция каждого вектора - это инструкция (CPSID I) для глобального отключения прерываний. После каждого отдельного обработчика прерывания (написанного на C) выполнение возвращается к общей процедуре сборки, которая повторно разрешает прерывания с помощью инструкции CPSIE I, а возврат из процесса прерывания / исключения запускается с помощью инструкции BX LR.

При входе в прерывание CortexM автоматически складывает кадр исключения, содержащий изменчивый контекст (контекст, сохраненный вызывающей стороной), и переходит к первой инструкции вектора исключения / прерывания.

По данным Информационного центра ARM требуется не менее 12 циклов для завершения процесса стекирования и получения адреса первой инструкции целевого вектора из NVIC (вложенный контроллер векторных прерываний). Если во время процесса стекирования поступает другое прерывание с более высоким приоритетом (это случай с поздним поступлением), процесс стекирования продолжается, но процесс с более высоким приоритетом будет обслуживаться в первую очередь.

Мой первый вопрос: считается ли этот случай позднего прибытия сценарием вложенного прерывания, т.е. регистр LR будет 0xFFFF FFF1 (учитывая только базовый фрейм)?

Во-вторых, возможно ли, что исключение может быть принято между завершением процесса наложения и выполнением CPSID I?


person Rookie    schedule 19.10.2018    source источник


Ответы (1)


Самый простой способ избежать вложенности - это присвоить всем прерываниям одинаковый приоритет.

Вы все равно можете расставить приоритеты, используя под-приоритеты, если хотите, но я не уверен, что это принесет вам какую-либо пользу.

Позднее поступление немного похоже на вложение, за исключением того, что прерывание с более высоким приоритетом будет выполняться перед прерыванием с более низким приоритетом. Прерывание с более низким приоритетом переходит в цепочку прерывания с более высоким приоритетом.

Да, прерывание с более высоким приоритетом может быть принято до того, как вы выполните CPSID I. В зависимости от времени вы получите либо сценарий позднего прибытия, либо сценарий вложенности.

person Realtime Rik    schedule 19.10.2018
comment
да, я знаю о хвостовой цепочке прерывания с низким приоритетом после обработки прерывания с высоким приоритетом, но просто чтобы уточнить, я хотел бы спросить: в случае позднего прибытия шаблон в LR будет 0xFFFFFFF9 внутри обработчика позднего прибытия с высоким приоритетом или 0xFFFFFFF1? - person Rookie; 19.10.2018
comment
Это несущественно: ваше предлагаемое решение все еще содержит гонку, когда полный переход на ISR может быть прерван другим IRQ до выполнения инструкции CPSID, поэтому этот ответ является единственно правильным. - person cooperised; 19.10.2018