Вопрос

Я хочу знать разницу между системой прерываний FIQ и IRQ в любой микропроцессор, например:ARM926EJ.

Это было полезно?

Решение

Особенность современных процессоров ARM (и некоторых других).

Из патента:

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

Другими словами, FIQ - это просто запрос на прерывание с более высоким приоритетом, которому присваивается приоритет путем отключения IRQ и других обработчиков FIQ во время обслуживания запроса.Следовательно, никакие другие прерывания не могут возникать во время обработки активного прерывания FIQ.

Другие советы

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

В некоторой степени это делает различие между двумя режимами прерывания избыточным, и многие системы не используют nFIQ вообще, или используйте его способом, аналогичным немаскируемому (NMI) прерывание , обнаруженное на других процессорах (хотя FIQ программно маскируется на большинстве процессоров ARM).

Так почему же ARM называет FIQ "быстрым"?

  1. Режим FIQ имеет свои собственные выделенные банковские регистры, r8-r14.R14 - это регистр ссылок, который содержит обратный адрес (+4) из FIQ.Но если ваш обработчик FIQ может быть написан таким образом, что он использует только r8-r13, он может воспользоваться преимуществами этих банковских регистров двумя способами:
    • Во-первых, это не влечет за собой накладных расходов на нажатие и выталкивание каких-либо регистров, которые используются процедурой обслуживания прерываний (ISR).Это может сэкономить значительное количество циклов как при входе, так и при выходе из ISR.
    • Кроме того, обработчик может полагаться на значения, сохраняющиеся в регистрах от одного вызова к следующему, так что, например r8 может использоваться как указатель на аппаратное устройство, и обработчик может полагаться на то же значение, находящееся в r8 в следующий раз, когда он будет вызван.
  2. Местоположение FIQ в конце таблицы векторов исключений (0x1C) означает, что если код обработчика FIQ помещен непосредственно в конец векторной таблицы, ветвление не требуется - код может выполняться непосредственно из 0x1C.Это экономит несколько циклов при входе в ISR.
  3. FIQ имеет более высокий приоритет, чем IRQ.Это означает, что когда ядро принимает исключение FIQ, оно автоматически маскирует IRQ-запросы.IRQ не может прервать обработчик FIQ.Обратное неверно - IRQ не маскирует FIQ, и поэтому обработчик FIQ (если используется) может прерывать IRQ.Кроме того, если оба запроса IRQ и FIQ происходят одновременно, ядро сначала обработает FIQ.

Так почему же многие системы не используют FIQ?

  1. Код обработчика FIQ обычно не может быть написан на C - он должен быть написан непосредственно на языке ассемблера.Если вы достаточно заботитесь о производительности ISR, чтобы захотеть использовать FIQ, вы, вероятно, в любом случае не захотели бы оставлять несколько циклов в таблице, кодируя на C, но, что более важно, компилятор C не будет создавать код, который следует ограничению на использование только регистров r8-r13.Код, созданный компилятором C, совместимым с ARM ATPCS стандарт вызова процедуры вместо этого будет использовать регистры r0-r3 для нулевых значений и не выдаст правильного cpsr восстановление кода возврата в конце функции.
  2. Все аппаратное обеспечение контроллера прерываний обычно находится на выводе IRQ.Использование FIQ имеет смысл только в том случае, если у вас есть единственный источник прерывания с наивысшим приоритетом, подключенный к входу nFIQ, а во многих системах нет единого источника с постоянным наивысшим приоритетом.Нет смысла подключать к FIQ несколько источников, а затем устанавливать приоритеты программного обеспечения между ними, поскольку это устраняет почти все преимущества FIQ перед IRQ.

ФИК или быстрое прерывание часто упоминается как Мягкий DMA в некоторых ссылках на ARM.
Особенности ФИК являются,

  1. Отдельный режим с банковским регистром, включающим стек, регистр связи и R8-R12.
  2. Отдельный бит включения / выключения FIQ.
  3. Хвост векторной таблицы (которая всегда находится в кэше и отображается MMU).

Последняя особенность также дает небольшое преимущество перед IRQ который должен разветвляться.

Демонстрация скорости на языке "C"

Некоторые ссылались на трудность кодирования на ассемблере для обработки FIQ. gcc имеет аннотации к коду a ФИК обработчик.Вот один из примеров,

void  __attribute__ ((interrupt ("FIQ"))) fiq_handler(void)
{
    /* registers set previously by FIQ setup. */
    register volatile char *src asm ("r8");  /* A source buffer to transfer. */
    register char *uart asm ("r9");          /* pointer to uart tx register. */
    register int size asm ("r10");           /* Size of buffer remaining. */
    if(size--) {
        *uart = *src++;
    }
}

Это приводит к следующему почти хорошему ассемблеру,

00000000 <fiq_handler>:
   0:   e35a0000        cmp     sl, #0
   4:   e52d3004        push    {r3}            ; use r11, r12, etc as scratch.
   8:   15d83000        ldrbne  r3, [r8]
   c:   15c93000        strbne  r3, [r9]
  10:   e49d3004        pop     {r3}            ; same thing.
  14:   e25ef004        subs    pc, lr, #4

Процедура ассемблера в 0x1c может выглядеть как,

   tst     r10, #0    ; counter zero?
   ldrbne  r11, [r8]  ; get character.
   subne   r10, #1    ; decrement count
   strbne  r11, [r9]  ; write to uart
   subs    pc, lr, #4 ; return from FIQ.

Настоящий УАРТ вероятно, есть готовый бит, но код для создания высокой скорости мягкий DMA с FIQ было бы всего 10-20 инструкций.Основной код должен опрашивать FIQ r10 чтобы определить, когда буфер будет завершен.Основной (код без прерывания) может передавать и настраивать ФИК регистрируется с помощью msr инструкция по переключению на ФИК преобразуйте и передайте неканкеризованные регистры R0-R7 в банкированные регистры R8-R13.

Обычно задержка прерывания RTOS составляет 500-1000 инструкций.Для Linux это может быть 2000-10000 инструкций.Реальный DMA всегда предпочтительнее, однако для высокочастотных простых прерываний (таких как передача в буфер), ФИК может предложить решение.

В качестве ФИК речь идет о скорости, вам не следует рассматривать это, если вы не уверены в кодировании на ассемблере (или не готовы посвятить этому время).Ассемблер, написанный бесконечно работающим программистом, будет быстрее, чем компилятор.Наличие GCC assist может помочь новичку.

Задержка

В качестве ФИК имеет отдельный бит маски, он включен почти повсеместно.На более ранних процессорах ARM (таких как ARM926EJ) некоторые атомарные операции приходилось реализовывать путем маскирования прерываний.Тем не менее, даже с самыми совершенными процессорами Cortex бывают случаи, когда операционная система маскирует прерывания.Часто критичным для прерывания является не время обслуживания, а время между подачей сигнала и обслуживанием.Здесь, в ФИК также имеет преимущество.

Слабость

В ФИК не масштабируется.Для того, чтобы использовать несколько FIQ источники, объединенные регистры должны быть общими для подпрограмм прерывания.Кроме того, необходимо добавить код, чтобы определить, что вызвало прерывание / FIQ.В ФИК как правило, является один трюк пони.

Если ваше прерывание очень сложное (сетевой драйвер, USB и т.д.), то FIQ, вероятно, не имеет особого смысла.По сути, это то же самое утверждение, что и мультиплексирование прерываний.В накренившийся регистры предоставляют 6 бесплатных переменных для использования, которые никогда не загружайте из памяти.Регистр работает быстрее, чем память.Регистры работают быстрее, чем L2-кэш.Регистры работают быстрее, чем L1-кэш.Регистрация происходит быстро.Если вы не можете написать подпрограмму, которая выполняется с 6 переменными, то ФИК не подходит.Примечание:Вы можете удвоить пошлину, некоторые регистрируются с сдвиги и вращается которые свободны на ARM, если вы используете 16-битные значения.

Очевидно, что ФИК является более сложным.Разработчики операционной системы хотят поддерживать несколько источников прерываний.Требования заказчика к ФИК будут меняться, и часто они понимают, что должны просто позволить клиенту катят свои собственные.Обычно поддержка для ФИК ограничен, поскольку любая поддержка, скорее всего, умалит основное преимущество, Скорость.

Краткие сведения

Не бей моего друга по ФИК.Это единственный трюк системных программистов против глупого оборудования.Это не для всех, но у этого есть свое место.Когда все другие попытки уменьшить задержку и увеличить частоту обслуживания ISR завершились неудачей, ФИК может быть вашим единственным выбором (или лучшей командой разработчиков оборудования).

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

Хаос уже хорошо ответил, но дополнительный момент, который пока не рассмотрен, заключается в том, что FIQ находится в конце векторной таблицы, и поэтому обычно / традиционно просто запускать процедуру прямо там, тогда как вектор IRQ обычно именно такой.(то есть прыжок куда-то еще).Избегание этой дополнительной ветви сразу после полного сохранения и переключения контекста - это небольшое увеличение скорости.

FIQ имеет более высокий приоритет и может быть введен во время обработки другого IRQ.Наиболее важные ресурсы обрабатываются FIQ, остальные обрабатываются IRQ.

другая причина заключается в том, что в случае FIQ для загрузки в стек требуется меньшее количество регистров, режим FIQ имеет регистры от R8 до R14_fiq

Я верю, что это то, что вы ищете:

http://newsgroups.derkeiler.com/Archive/Comp/comp.sys.arm/2005-09/msg00084.html

По сути, FIQ будет иметь наивысший приоритет с несколькими источниками IRQ с более низким приоритетом.

Никакой магии в FIQ нет.FIQ просто может прервать любой другой IRQ, который обслуживается, вот почему он называется "быстрым".Система быстрее реагирует на эти прерывания, но в остальном все то же самое.

Вопросы, без сомнения, имеют более высокий приоритет, в остальных пунктах я не уверен.....FIQs будет поддерживать высокоскоростную передачу данных (или) обработку канала, там, где требуется высокоскоростная обработка данных, мы используем FIQs, и обычно IRQs используются для обычной обработки прерываний.

Это зависит от того, как мы разрабатываем обработчики прерываний, поскольку FIQ, наконец, может не нуждаться в одной инструкции перехода, также у него есть уникальный набор регистров r8-r14, поэтому в следующий раз, когда мы вернемся к прерыванию FIQ, нам не нужно будет запускать / всплывать стек.Конечно, это экономит некоторые циклы, но опять же, неразумно иметь больше обработчиков, обслуживающих один FIQ, и да, FIQ имеет больший приоритет, но это не повод говорить, что он обрабатывает прерывание быстрее, оба IRQ / FIQ выполняются на одной частоте процессора, поэтому они должны работать с одинаковой скоростью.

Это может быть неправильно.Все, что я знаю, это то, что FIQ расшифровывается как запрос на быстрое прерывание, а IRQ - как запрос на прерывание.Судя по этим именам, я могу предположить, что FIQ будет обработан (выброшен?) быстрее, чем IRQ.Вероятно, это как-то связано с конструкцией процессора, где FIQ будет прерывать процесс быстрее, чем IRQ.Прошу прощения, если я ошибаюсь, но обычно я занимаюсь программированием более высокого уровня, сейчас я просто предполагаю.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top