В чем разница между FIQ и системой прерываний IRQ? - PullRequest
69 голосов
/ 10 июня 2009

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

Ответы [ 11 ]

153 голосов
/ 08 января 2013

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, совместимым со стандартом ATPCS вызова процедур ARM, вместо этого будет использовать регистры r0-r3 для пустых значений и не будет производить правильный cpsr восстановления кода возврата в конце функции.
  2. Все оборудование контроллера прерываний обычно находится на выводе IRQ. Использование FIQ имеет смысл, только если у вас есть один источник прерываний с наивысшим приоритетом, подключенный к входу nFIQ, и у многих систем нет одного источника с наивысшим приоритетом. Нет смысла подключать несколько источников к FIQ, а затем устанавливать приоритеты программного обеспечения между ними, поскольку это устраняет почти все преимущества, которые FIQ имеет по сравнению с IRQ.
65 голосов
/ 22 января 2014

FIQ или быстрое прерывание часто упоминается как Soft DMA в некоторых ссылках ARM.
Особенности FIQ есть,

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

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

Демонстрация скорости в 'C'

Некоторые процитировали сложность кодирования на ассемблере для обработки FIQ. gcc содержит аннотации для кодирования обработчика FIQ . Вот пример,

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.

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

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

Поскольку FIQ имеет отношение к скорости, вы не должны учитывать это, если не уверены в кодировании на ассемблере (или хотите посвятить время). Ассемблер, написанный бесконечно работающим программистом, будет быстрее, чем компилятор. Помощь GCC может помочь новичку.

Задержка

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

Слабость

FIQ не масштабируется. Чтобы использовать несколько FIQ источников, банковские регистры должны быть разделены между подпрограммами обработки прерываний. Также необходимо добавить код для определения причины прерывания / FIQ. FIQ - это обычно пони с одним трюком .

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

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

Краткое описание

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

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

59 голосов
/ 19 июня 2009

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

Из патента:

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

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

6 голосов
/ 24 июня 2009

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

4 голосов
/ 23 июня 2010

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

4 голосов
/ 19 июня 2009

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

1 голос
/ 05 июля 2011

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

1 голос
/ 16 ноября 2010

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

1 голос
/ 23 июня 2009

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

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

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

0 голосов
/ 21 декабря 2012

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

...