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