В чем разница между системой прерываний FIQ и IRQ?


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

11 65

11 ответов:

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

из патента:

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

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

ARM calls FIQ the быстрое прерывание, имея в виду, что 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 (если используется) может прервать 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.

FIQ или быстрое прерывание часто называют Soft DMA в некоторых ссылках ARM.
черт FIQ а,

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

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

демо скорости в 'C'

некоторые процитировали трудность кодирования на ассемблере для обработки FIQ. gcc имеет аннотации к коду a 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 вероятно, есть готовый бит, но код, чтобы сделать высокую скорость soft DMA С FIQ будет только 10-20 инструкций. Основной код должен опрашивать FIQ r10 чтобы определить, когда буфер будет завершен. Main (non-interrupt code) может передавать и настраивать banked FIQ регистры с помощью msr инструкция по переключению на FIQ режим и передача небанковских R0-R7 в банкированные регистры R8-R13.

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

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

задержка

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

слабость

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

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

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

резюме

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

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

хаос уже ответил Хорошо, но дополнительный момент, не охваченный до сих пор, заключается в том, что 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 будет поддерживать высокую скорость передачи данных (или) обработки каналов, где требуется высокая скорость обработки данных мы используем FIQs и, как правило, IRQs используются обычные прерывания handlling.

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

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