24258

Прерывания и приоритеты

Дата последнего изменения: 14.02.2020 16:29:04


Отключение прерываний

Регистр маски приоритетов PRIMASK используется для запрета всех исключений, кроме исключения HardFault и немаскируемого прерывания. В этом регистре используется только младший бит PRIMASK[0]. При установке данного бита в "1" приоритет текущего исполнения повышается до 0, следовательно? он может быть прерван только прерыванием с более высоким приоритетом - HardFault, NMI или сбросом.

__set_PRIMASK(1); // Отключение всех прерываний кроме NMI и HardFault

В регистре FAULTMASK также используется только младший бит. Когда он установлен, приоритет выполняющегося в данный момент кода повышается до –1. Он может быть прерван только NMI или сбросом. Этот бит может быть установлен, если текущий уровень приоритета равен или больше нуля. Попытка установить этот бит в обработчике HardFault или NMI игнорируется. Возврат из любого исключения, кроме NMI, сбрасывает этот бит.

__set_FAULTMASK(1); // Отключение всех прерываний кроме NMA

Регистр BASEPRI задает минимальный приоритет процессу обработки исключений. Он содержит одноимённое поле, которое позволяет повысить приоритет текущего выполняемого кода и тем самым повлиять на способность исключений вытеснить его из процессора. Поле BASEPRI не запрещает прерывания полностью, а лишь поднимает «верхнюю планку» приоритета. Значение в регистре BASEPRI влияет на текущий приоритет выполнения лишь в том случае, если оно численно меньше, чем собственный приоритет текущего выполняющегося обработчика (то есть нельзя понизить приоритет кода ниже его собственного уровня). При этом значение 0 используется как индикатор того, что повышение приоритета с помощью BASEPRI отключено.

// Отключение прерываний с меньшим или равным приоритетом.
// Активны прерывания с численным значением приоритета < N.
__set_BASEPRI(N);

Сохранить статью в PDF

Документация

Теги

Была ли статья полезной?