Инструменты пользователя

Инструменты сайта


doc:doclist:irq

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

Наиболее подробно тема прерываний описана в этом ресурсе Обработка_исключений_в_M-профиле.

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

В регистре PRIMASK используется только младший бит. При установке данного бита в "1", приоритет текущего исполнения повышается до 0, следовательно он может быть прерван только прерыванием с более высоким приоритетом - HardFaul, NMI или сбросом.

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

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

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

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

  // Отключение прерываний с меньшим или равным приоритетом. 
  // Активны прерывания с численным значением приоритета < N.
  __set_BASEPRI(N); 
doc/doclist/irq.txt · Последнее изменение: 2022/04/03 23:09 (внешнее изменение)