Я же уже писал...
В моём ARM9-ядре (ARM926EJ-S из состава OMAP-L137) достаточно в контроллере прерываний посадить только одно прерывание на линию FIQ (остальные - на IRQ).
Тогда достаточно будет оставить:
Код
SUB LR, LR, #4
STMFD SP!, {..., LR}
...
LDMFD SP!, {..., PC}^
Вместо многоточия можно писать свой код, учитывая, что регистры R8-R12 можно не сохранять.
Вместо многоточия можно также поставить вызов си-функции. Тогда в команды STMFD/LDMFD нужно добавить все регистры из диапазона R0-R7, которые нужно сохранять
(список таких регистров ищется в разделе "Calling Conventions" на ваш компилятор).
Для CodeComposer (и ARM926EJ-S из состава OMAP-L137) это будет:
Код
FIQ_handler:
SUBS LR, LR, #4
STMFD SP!, {R0-R3, R12, LR} ;Store registers on FIQ stack
BL c_func ;Go to ISR (still in FIQ mode), will return to following line
LDMFD SP!, {R0-R3, R12, PC}^ ;Restore registers from FIQ stack. Return to program current status
Так что выгоднее FIQ-обработчик писать на асм - если уложитесь в регистры R8-R12 то вообще ничего на стек сохранять не нужно и можно избавиться от STMFD/LDMFD, и может даже от команд загрузки рабочих регистров статическими переменными и константами.
Я так на ARM7 с частотой 72МГц получал частоты прерываний порядка нескольких мегагерц при 50% загрузке CPU. И даже без JTAG...