Я хочу избежать вложенных прерываний в записи прерываний в микроконтроллере на базе CortexM.
Для этого у меня есть файл сборки, содержащий векторы прерываний, и первая инструкция каждого вектора - это инструкция (CPSID I
)отключить прерывания глобально.После каждого отдельного обработчика прерываний (записанного на C) выполнение возвращается к общей процедуре сборки, которая повторно разрешает прерывания с помощью инструкции CPSIE I
, а возврат из процесса прерывания / исключения запускается с помощью инструкции BX LR
.
При вводе прерывания CortexM автоматически суммирует кадр исключения, содержащий изменчивый контекст (сохраненный контекст вызывающего абонента) и переходит к первой команде вектора исключения / прерывания.
Согласно ARMИнфоцентр требуется не менее 12 циклов для завершения процесса суммирования и извлечения адреса первой команды целевого вектора из NVIC
(Nested Vectored Interrupt Controller).Если во время процесса суммирования поступает другое прерывание с более высоким приоритетом (это случай позднего прибытия), процесс стека продолжается, но процесс с более высоким приоритетом будет обслуживаться первым.
Мой первый вопрос: рассматривается ли этот случай позднего прибытиякак сценарий вложенного прерывания, т. е. регистр LR
будет 0xFFFF FFF1
(с учетом только базового кадра)?
Во-вторых, возможно ли принятие исключения между завершением процесса суммирования и до CPSID I
исполняется?