Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Из патента:

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

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

Ответ 2

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

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

Итак, почему ARM вызывает FIQ "быстро"?

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

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

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

Ответ 3

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

  • Отдельный режим с банковским регистром, включая стек, реестр ссылок и R8-R12.
  • Отдельный бит включения/отключения FIQ.
  • Хвост векторной таблицы (которая всегда находится в кеше и отображается 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 не подходит. Примечание. Если вы используете 16-битные значения, вы можете удвоить регистрацию со сдвигами и вращать, которые свободны на ARM.

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

Резюме

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

Ответ 11

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