Согласно техническому справочному руководству AM335x регистр INTC_IRQ_PRIORITY содержит текущий активный уровень приоритета IRQ.
Кажется, что это правда, поскольку я проверил его, сохранив его значение в ISR и распечатав его в основном цикле (вне ISR).
Я также заметил, что вне ISR значение INTC_IRQ_PRIORITY, по-видимому, сохраняет значение , которое соответствует последнему IRQ , который произошел.
Получил ли яправильно?
Теперь , когда происходит прерывание с более высоким приоритетом во время обслуживания прерывания с более низким приоритетом (становится вложенным), значение INTC_IRQ_PRIORITY становится значением IRQ с более высоким приоритетом, как и следовало ожидать.
Однако , когда ISR с более высоким приоритетом завершается и выполнение возвращается к ISR с более низким приоритетом - значение INTC_IRQ_PRIORITY остается одним из значений с более высоким приоритетом .
Если ISR с низким приоритетом теперь проверяет его, он получит значение, которое не соответствует его приоритету .
Не вызовет ли это поведение проблемы в системах, которые проверяют, что некоторые API не вызываются из прерываний с высоким (э) приоритетом? (проверяя INTC_IRQ_PRIORITY.)
(На самом деле это происходит в моем порту FreeRTOS, который подтверждает вызов API «XxxxFromISR ()» из прерывания с низким приоритетом в описанной выше ситуации.Мне потребовалось несколько дней, чтобы понять, что происходит.)
Я что-то здесь упускаю?
Есть ли способ сохранить отслеживание INTC_IRQ_PRIORITY с обслуживанием приоритета IRQ во вложенных ситуациях??
Только для справки - регистр INTC_IRQ_PRIORITY доступен только для чтения.