======Прерывания и приоритеты====== Наиболее подробно тема прерываний описана в этом ресурсе [[http://ru.osdev.wikia.com/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B2_M-%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D0%B5|Обработка_исключений_в_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);