Предыдущая Следующая

В данном примере и IRQ, и FIQ оказались запрещенными, а произошло это, когда только один из этих типов прерываний был запрещен. Тот факт, что ядро обрабатывает запрос прерывания после завершения команды MSR, которая запрещает прерывания, обычно не вызывает проблем для прерывания, поступающего на один цикл раньше указанной команды.

Когда подпрограмма обслуживания прерывания возвращает управление, то команда SUBS рс,1г,#4 восстанавливает SPSR_IRQ в CPSR. В CPSR будут снова установлены биты I и F, и поэтому выполнение программы продолжится со всеми запрещенными прерываниями. Однако это может вызвать проблемы в следующих случаях:

Проблема 1. Специфическая подпрограмма, возможно, вызванная как обработчик запроса IRQ или как регулярная подпрограмма. В последнем случае необходимо гарантировать, чтобы запросы IRQ были запрещены до вызова подпрограммы. Подпрограмма, в свою очередь, должна учитывать это требование и проверять условия в момент своего вызова (анализируя состояние бита I SPSR), а возвращать управление должна, используя соответствующую команду. Если в подпрограмму входит команда MSR, которая отключает запросы IRQ (при этом бит I в SPSR будет установлен), и запрос IRQ поступает во время выполнения этой команды, то подпрограмма не воспримет запрос IRQ.

Проблема 2. И запросы FIQ, и запросы IRQ запрещены одной и той же записью в CPSR. В этом случае, если запрос IRQ поступил в ходе записи в CPSR, то запросы FIQ будут запрещены на время выполнения обработчика запросов IRQ. Это может быть неприемлемым в системе, где запросы FIQ не должны запрещаться на время большее, чем несколько циклов.

Компания NXP предлагает три возможных решения вышеописанных проблем. Какое из них является наиболее приемлемым, будет зависеть от требований, предъявляемых к конкретной системе.

Решение 1. Следует добавить в начало подпрограммы обслуживания прерывания программный код, подобный приведенному ниже:

SUB

lr, lr, #4

STMFD sp!, {..., lr) MRS lr, SPSR

TST lr, #I_Bit

LDMNEFD sp!, {. . . , pc}'

Корректируем LR так, чтобы указать на возврат.

Освобождаем некоторые регистры (сохраняем контекст).

Определяем, получили ли мы прерывание в то время как

прерывания были запрещены.

Если так, то возврат немедленно. Прерывание становится отложенным, так как мы не имеем возможности сейчас его обрабатывать, а сможем

; сделать это, когда прерывания

; впоследствии будут разрешены.

; Остальная часть подпрограммы

; обработки прерывания.

Эта небольшая программа анализирует, не был ли запрос IRQ получен в момент, когда производилось отключение запросов IRQ. Если имеет место как раз такой случай, программа инициирует немедленный возврат из прерывания, запрос IRQ сбрасывается, а в дальнейшем запросы IRQ запрещаются.

Подобный программный код может быть применен и в обработчике FIQ, чтобы решить вышеуказанную проблему номер 1. Предложенный подход рекомендуется производителем, поскольку позволяет решить также и вторую проблему. Однако при решении второй проблемы, интервал времени, в течение которого будут запрещены запросы FIQ, увеличивается на несколько циклов.


Предыдущая Следующая



НА ГЛАВНУЮ | ЧТО ТАКОЕ PIC ? | ПРОГРАММАТОР | ПРОЕКТЫ | СТАТЬИ | ССЫЛКИ | КАРТА САЙТА
Hosted by uCoz