マイクロプロセッサ、たとえばARM926EJでのFIQとIRQ割り込みシステムの違いを知りたい。
現代の機能ARM CPU(および他のいくつか))。
特許から:
複数の割り込みを処理できるデジタルデータプロセッサで高速割り込みを実行する方法を提供します。高速割り込み要求が受信されると、フラグが設定され、プログラムカウンターと条件コードレジスタがスタックに格納されます。割り込みサービスルーチンの最後で、割り込み命令からのリターンは、デジタルデータプロセッサのステータスを含む条件コードレジスタを取得し、フラグが設定されているかどうかを確認します。フラグが設定されている場合、高速割り込みが処理されたため、プログラムカウンターのみがアンスタックされることを示します。
言い換えると、FIQは優先度の高い割り込み要求であり、要求の処理中にIRQおよびその他のFIQハンドラーを無効にすることで優先順位が付けられます。したがって、アクティブなFIQ割り込みの処理中に他の割り込みが発生することはありません。
ARMは、FIQ
が高速割り込みを呼び出し、IRQ
が通常優先度であることを意味します。実際のシステムでは、2つのデバイスよりも多くの割り込みソースが存在するため、これらの複数のソースのマスキング、優先順位付けなどを可能にし、プロセッサへの割り込み要求ラインを駆動する外部ハードウェア割り込みコントローラーがあります。
これにより、2つの割り込みモードはある程度冗長になり、多くのシステムはnFIQ
をまったく使用しないか、マスク不可(NMI
)割り込みに類似した方法で使用します他のプロセッサで見つかりました(ただし、FIQ
はほとんどのARMプロセッサ)でソフトウェアマスク可能です。
では、なぜARM FIQを「高速」と呼ぶのでしょうか?
r8-r14
があります。 R14は、FIQからの戻りアドレス(+4)を保持するリンクレジスタです。ただし、r8-r13
のみを使用するようにFIQハンドラーを作成できる場合、これらのバンクレジスタを次の2つの方法で利用できます。r8
をハードウェアデバイスへのポインターとして使用でき、ハンドラーは次回同じときにr8
にある値に依存できますと呼ばれます。0x1C
)の最後にあるFIQの場所は、FIQハンドラーコードがベクターテーブルの最後に直接配置されている場合、分岐は必要ないことを意味します。コードは0x1C
から直接実行できます。これにより、ISRへのエントリ時に数サイクル節約できます。では、なぜ多くのシステムがFIQを使用しないのですか?
r8-r13
のみを使用します。 ARMのATPCS
プロシージャコール標準に準拠したCコンパイラによって生成されたコードは、スクラッチ値にレジスタr0-r3
を代わりに使用し、関数の最後に正しいcpsr
復元戻りコードを生成しません。[〜#〜] fiq [〜#〜]または高速割り込みは、Soft DMAARM参照。
[〜#〜] fiq [〜#〜]の機能は、
最後の機能は、分岐する必要がある[〜#〜] irq [〜#〜]よりも少し有利です。
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 [〜#〜]はおそらくレディビットを持っていますが、高速を作成するコードsoft DMAはFIQで10 -20命令。メインコードはFIQ r10
をポーリングして、バッファがいつ終了するかを判断する必要があります。メイン(非割り込みコード)は、msr
命令を使用して切り替えて、バンクされた[〜#〜] fiq [〜#〜]レジスタを転送およびセットアップできます。 [〜#〜] fiq [〜#〜]モードで、バンクされていないR0〜R7をバンクされたR8〜R13レジスタに転送します。
通常RTOS割り込みレイテンシは500-1000命令です。Linuxの場合、2000-10000命令かもしれません。ただし、高頻度の場合は、実際のDMAが常に望ましいです。単純な割り込み(バッファ転送など)、[〜#〜] fiq [〜#〜]は解決策を提供できます。
[〜#〜] fiq [〜#〜]は速度に関するものであるため、アセンブラーでのコーディングが安全でない場合(または献身的な意思がある場合)は考慮しないでください。時間)。無限に走るプログラマーによって書かれたアセンブラーは、コンパイラーよりも高速です。 GCCを支援することは初心者を助けることができます。
[〜#〜] fiq [〜#〜]には個別のマスクビットがあるため、ほとんどの場合に有効になっています。以前のARM CPU(ARM926EJなど))では、割り込みをマスクすることによっていくつかのアトミック操作を実装する必要がありました。多くの場合、割り込みにはサービス時間は重要ではありませんが、シグナルを送信してからサービスを提供するまでの時間です。ここでは、[〜#〜] fiq [〜#〜]も利点があります。
[〜#〜] fiq [〜#〜]はスケーラブルではありません。複数のFIQ
ソースを使用するには、バンクされたレジスタを割り込みルーチン間で共有する必要があります。また、割り込み/ FIQの原因を特定するコードを追加する必要があります。 [〜#〜] fiq [〜#〜]は、一般的にワントリックポニーです。
割り込みが非常に複雑な場合(ネットワークドライバー、USBなど)、FIQはほとんど意味がありません。これは基本的に、割り込みの多重化と同じステートメントです。 bankedレジスタは、6つの自由変数を使用して、メモリからロードしないを使用します。レジスタはメモリよりも高速です。レジスタはL2キャッシュよりも高速です。レジスタはL1キャッシュよりも高速です。レジスタは高速です。 6つの変数で実行されるルーチンを作成できない場合、[〜#〜] fiq [〜#〜]は適切ではありません。注:16ビット値を使用する場合、ARMでは無料であるshiftsおよびrotatesを使用して、一部のレジスタを2倍にすることができます。
明らかに[〜#〜] fiq [〜#〜]はより複雑です。 OS開発者は、複数の割り込みソースをサポートしたいと考えています。 [〜#〜] fiq [〜#〜]に対する顧客の要件はさまざまであり、多くの場合、単に顧客に任せるだけでよいことに気付きます独自のロール。通常、[〜#〜] fiq [〜#〜]のサポートは、サポートが主な利点を損なう可能性があるため制限されています[〜 #〜] speed [〜#〜]。
友人をバッシュしないでください[〜#〜] fiq [〜#〜]。愚かなハードウェアに対するシステムプログラマーの1つのトリックです。それは万人向けではありませんが、その場所があります。遅延を減らし、ISRサービスの頻度を増やす他のすべての試みが失敗した場合、[〜#〜] fiq [〜#〜]が唯一の選択肢(またはより優れたハードウェアチーム) )。
一部の安全性が重要なアプリケーションでは、panic割り込みとして使用することもできます。
カオスはすでによく答えていますが、これまでカバーされていない追加の点は、FIQがベクターテーブルの最後にあるため、ルーチンをすぐに開始するのが一般的/伝統的であるのに対して、IRQベクターは通常それだけであるということです。 (つまり、他の場所へのジャンプ)。スタッシュとコンテキストを完全に切り替えた直後に余分な分岐を回避すると、速度がわずかに向上します。
FIQは優先度が高く、別のIRQが処理されている間に導入できます。最も重要なリソースはFIQによって処理され、残りはIRQによって処理されます。
もう1つの理由は、FIQの場合、スタックにプッシュするのに必要なレジスタの数が少なく、FIQモードにはR8からR14_fiqレジスタがある
私はこれがあなたが探しているものだと信じています:
http://newsgroups.derkeiler.com/Archive/Comp/comp.sys.arm/2005-09/msg00084.html
基本的に、FIQは優先度が最も高く、複数の優先度の低いIRQソースを使用します。
FIQは優先度が高く、間違いなく残りのポイントは不明です。...FIQは高速データ転送(または)チャネル処理をサポートします。 。
FIQに関する魔法はありません。 FIQは、提供されている他のIRQを中断することができます。これが「高速」と呼ばれる理由です。システムはこれらの割り込みにより速く反応しますが、その他は同じです。
割り込みハンドラの設計方法によって異なります。FIQは最後に1つの分岐命令を必要としない場合があるため、r8-r14レジスタの一意のセットがあるため、次にFIQ割り込みに戻ったときにプッシュ/ポップアップする必要はありません。スタック。もちろん、いくつかのサイクルを節約しますが、1つのFIQを処理するハンドラーを増やすことは賢明ではありません。はい、FIQがより優先されますが、割り込みをより速く処理すると言う理由はありません。したがって、それらは同じ速度で実行する必要があります。