Решение 2. Запретить запросы IRQ и FIQ, используя отдельные команды записи в CPSR, как-то:
MRS |
rO, cpsr |
|||
ORR |
rO, rO, #1. |
.Bit |
; запрет |
IRQ |
MSR |
cpsr_c, rO |
|||
ORR |
rO, rO, #F_ |
.Bit |
; запрет |
FIQ |
MSR |
cpsr_c, rO |
Это лучшее решение, поскольку время, в течение которого запросы FIQ запрещены, никак не увеличивается. Однако при этом не решается проблема 1 и в каждом месте программы, где запросы IRQ и FIQ запрещаются одновременно, требуются дополнительные команды.
Решение 3. Вновь разрешаются запросы FIQ в начале обработчика запросов IRQ. Поскольку требуемое состояние всех битов в CPSR известно, то лучше всего записать в CPSR непосредственное значение, например:
MSR cpsr_c, #I_Bit:0R:irq_MODE ;IRQ должны быть запрещены
;FIQ разрешены
;Состояние ARM, режим запроса IRQ
Это решение требует только модификации обработчика запросов IRQ и позволяет вновь разрешать запросы FIQ, спустя меньший, чем в решении 1, интервал времени. Однако это решение можно использовать лишь в том случае, если система может гарантировать, что запросы FIQ не будут запрещены, когда разрешены запросы IRQ. Если такой гарантии нет, то следует использовать решение 1.
6.6. Рекомендации по использованию VIC
Если пользовательский програмный код выполняется во встроенной оперативной памяти и приложение использует прерывания, то векторы прерываний должны быть переотображены на адрес 0x0 Flash-памяти. Это необходимо, поскольку все векторы исключительных состояний (ИС — к ним относятся и пре-
рывания) расположены по адресам 0x0 и выше. Этого легко достигнуть путем конфигурирования регистра МЕММАР (расположенного в блоке управления системой) в режиме пользовательской оперативной памяти. Прикладной код должен быть связан с таблицей векторов прерываний (IVT), которая постоянно расположена по адресу 0x40000000.
Несмотря на то что в качестве генераторов запросов FIQ могут быть выбраны многие источники (VICIntSelect), для обслуживания всех доступных/существующих запросов FIQ должна быть выделена только одна сервисная подпрограмма обработки прерываний. Поэтому в случае, когда более чем один источник прерывания классифицирован как запрос FIQ, подпрограмма обработки прерывания FIQ должна читать регистр VICFIQStatus, чтобы по результатам чтения его содержимого выбрать алгоритм обработки запроса прерывания. Однако рекомендуется, чтобы как FIQ был классифицирован только один источник прерывания. Классификация в качестве FIQ более чем одного источника увеличит время ожидания начала обработки прерывания.
После завершения требуемой сервисной подпрограммы обработки прерывания, сброс флага прерывания на уровне периферии сведется к изменению состояний некоторого множества битов в регистрах VIC (VICRawIntr, VICFIQStatus и VICIRQStatus). Необходимо также до возвращения из прерывания выполнить запись в регистр VICVectAddr, прежде, чем может быть обслужено следующее прерывание. Эта запись сбрасывает соответствующий флаг прерывания во внутренней логической схеме аппаратной обработки прерываний.
НА ГЛАВНУЮ | | ЧТО ТАКОЕ PIC ? | | ПРОГРАММАТОР | | ПРОЕКТЫ | | СТАТЬИ | | ССЫЛКИ | | КАРТА САЙТА |