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 не подходит. Примечание: Вы можете удвоить некоторые регистры с сдвигами и поворотами , которые свободны на ARM, если вы используете 16-битные значения.
Очевидно, что FIQ более сложный. Разработчики ОС хотят поддерживать несколько источников прерываний. Требования клиентов к FIQ будут различаться, и часто они понимают, что должны просто позволить клиенту свернуть свои . Обычно поддержка для FIQ ограничена, так как любая поддержка может отвлекать от основного преимущества, SPEED .
Краткое описание
Не ругай моего друга FIQ . Это системный программист, одна хитрость против тупого оборудования. Это не для всех, но у него есть свое место. Когда все другие попытки уменьшить задержку и увеличить частоту обслуживания ISR не увенчались успехом, FIQ может быть вашим единственным выбором (или лучшей командой аппаратного обеспечения).
Также возможно использование в качестве прерывания в некоторых критических для безопасности приложениях.