Цитата(igorle @ Oct 23 2013, 02:15)

Можно ли запрещать прерывания ниже определенного приоритета?
В файле core_cmFunc.h есть функция
__set_BASEPRI(uint32_t basePri)
В двух словах,
все запросы прерываний приходят на приоритетный шифратор, он выбирает из них самый приоритетный,
им будет тот, у кого выше приоритет (меньше число в регистре NVIC_IPRx или SCB_SHPRx), а при равенстве - тот у кого меньше номер в таблице векторов.
Далее приоритет этого запроса сравнивается с приоритетом выполняющегося сейчас кода.
Для "просто программы" это содержимое регистра BASEPRI, если приоритет запроса выше - произойдёт прерывание.
Если процессор уже исполняет обработчик прерывания, то приоритет текущего обработчика сравнивается с приоритетом нового запроса. Только в этот момент имеет значение вся эта сложность с группами и суб-приоритетами.
Прервать обработчик прерывания сможет только запрос из более приоритетной группы.
Попробую сочинить пример:
после
NVIC_SetPriorityGrouping( 5 );
__set_BASEPRI(0xA0);
получаем следующую ситуацию:
есть 4 группы приоритетов: 0..3, 4..7, 8..11 и 12..15, прервать исполнение программы могут только запросы с приоритетом 9 и выше.
если запросы с приоритетом 8 и 9 придут одновременно, то первым будет обслужен 8-й.
Но, если сначала возникнет запрос с приоритетом 9, то произойдёт переход на его обработчик прерывания, а появившийся позже запрос с приоритетом 8 не сможет прервать уже исполняющийся обработчик, т.к. они принадлежат к одной группе.
А вот запрос с приоритетом от 7 и выше - сможет.
Russia est omnis divisa in partes octo.