web-dev-qa-db-ja.com

FIQとIRQ割り込みシステムの違いは何ですか?

マイクロプロセッサ、たとえばARM926EJでのFIQとIRQ割り込みシステムの違いを知りたい。

69
Renjith G

現代の機能ARM CPU(および他のいくつか))。

特許から:

複数の割り込みを処理できるデジタルデータプロセッサで高速割り込みを実行する方法を提供します。高速割り込み要求が受信されると、フラグが設定され、プログラムカウンターと条件コードレジスタがスタックに格納されます。割り込みサービスルーチンの最後で、割り込み命令からのリターンは、デジタルデータプロセッサのステータスを含む条件コードレジスタを取得し、フラグが設定されているかどうかを確認します。フラグが設定されている場合、高速割り込みが処理されたため、プログラムカウンターのみがアンスタックされることを示します。

言い換えると、FIQは優先度の高い割り込み要求であり、要求の処理中にIRQおよびその他のFIQハンドラーを無効にすることで優先順位が付けられます。したがって、アクティブなFIQ割り込みの処理中に他の割り込みが発生することはありません。

60
Chaos

ARMは、FIQ高速割り込みを呼び出し、IRQ通常優先度であることを意味します。実際のシステムでは、2つのデバイスよりも多くの割り込みソースが存在するため、これらの複数のソースのマスキング、優先順位付けなどを可能にし、プロセッサへの割り込み要求ラインを駆動する外部ハードウェア割り込みコントローラーがあります。

これにより、2つの割り込みモードはある程度冗長になり、多くのシステムはnFIQをまったく使用しないか、マスク不可(NMI)割り込みに類似した方法で使用します他のプロセッサで見つかりました(ただし、FIQはほとんどのARMプロセッサ)でソフトウェアマスク可能です。

では、なぜARM FIQを「高速」と呼ぶのでしょうか?

  1. FIQモードには、専用のバンクレジスタr8-r14があります。 R14は、FIQからの戻りアドレス(+4)を保持するリンクレジスタです。ただし、r8-r13のみを使用するようにFIQハンドラーを作成できる場合、これらのバンクレジスタを次の2つの方法で利用できます。
    • 1つは、割り込みサービスルーチン(ISR)で使用されるレジスタをプッシュおよびポップするオーバーヘッドが発生しないことです。これにより、ISRへの入り口と出口の両方で大幅なサイクル数を節約できます。
    • また、ハンドラーは、ある呼び出しから次の呼び出しまでレジスターに保持されている値に依存することができるため、たとえばr8をハードウェアデバイスへのポインターとして使用でき、ハンドラーは次回同じときにr8にある値に依存できますと呼ばれます。
  2. 例外ベクターテーブル(0x1C)の最後にあるFIQの場所は、FIQハンドラーコードがベクターテーブルの最後に直接配置されている場合、分岐は必要ないことを意味します。コードは0x1Cから直接実行できます。これにより、ISRへのエントリ時に数サイクル節約できます。
  3. FIQの優先順位はIRQよりも高くなっています。これは、コアがFIQ例外を取得すると、IRQを自動的にマスクすることを意味します。 IRQはFIQハンドラーを中断できません。逆は当てはまりません-IRQはFIQをマスクしないため、FIQハンドラー(使用する場合)はIRQを中断できます。さらに、IRQ要求とFIQ要求の両方が同時に発生した場合、コアは最初にFIQを処理します。

では、なぜ多くのシステムがFIQを使用しないのですか?

  1. FIQハンドラーコードは通常、Cで記述することはできません。アセンブリ言語で直接記述する必要があります。 ISRのパフォーマンスに十分注意してFIQを使用したい場合は、Cでコーディングすることでテーブルにいくつかのサイクルを残したくないでしょうが、さらに重要なことは、Cコンパイラはレジスタr8-r13のみを使用します。 ARMのATPCSプロシージャコール標準に準拠したCコンパイラによって生成されたコードは、スクラッチ値にレジスタr0-r3を代わりに使用し、関数の最後に正しいcpsr復元戻りコードを生成しません。
  2. 通常、割り込みコントローラーハードウェアはすべてIRQピンにあります。 FIQの使用は、nFIQ入力に接続された単一の最高優先度の割り込みソースがあり、多くのシステムに単一の永続的な最高優先度のソースがない場合にのみ意味があります。複数のソースをFIQに接続し、それらの間でソフトウェアに優先順位を付けることは、FIQがIRQよりも優れている点をほぼすべて取り除くため、価値がありません。
158
manav m-n

[〜#〜] fiq [〜#〜]または高速割り込みは、Soft DMAARM参照。
[〜#〜] fiq [〜#〜]の機能は、

  1. スタック、リンクレジスタ、R8-R12を含むバンクレジスタを使用した個別モード。
  2. 個別のFIQイネーブル/ディセーブルビット。
  3. ベクターテーブルの末尾(常にキャッシュ内にあり、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 [〜#〜]はおそらくレディビットを持っていますが、高速を作成するコード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割り込みとして使用することもできます。

67
artless noise

カオスはすでによく答えていますが、これまでカバーされていない追加の点は、FIQがベクターテーブルの最後にあるため、ルーチンをすぐに開始するのが一般的/伝統的であるのに対して、IRQベクターは通常それだけであるということです。 (つまり、他の場所へのジャンプ)。スタッシュとコンテキストを完全に切り替えた直後に余分な分岐を回避すると、速度がわずかに向上します。

6
Pod

FIQは優先度が高く、別のIRQが処理されている間に導入できます。最も重要なリソースはFIQによって処理され、残りはIRQによって処理されます。

4
Sev

もう1つの理由は、FIQの場合、スタックにプッシュするのに必要なレジスタの数が少なく、FIQモードにはR8からR14_fiqレジスタがある

4
Ashok

私はこれがあなたが探しているものだと信じています:

http://newsgroups.derkeiler.com/Archive/Comp/comp.sys.arm/2005-09/msg00084.html

基本的に、FIQは優先度が最も高く、複数の優先度の低いIRQソースを使用します。

1
AlbertoPL

FIQは優先度が高く、間違いなく残りのポイントは不明です。...FIQは高速データ転送(または)チャネル処理をサポートします。 。

1
Sriram

FIQに関する魔法はありません。 FIQは、提供されている他のIRQを中断することができます。これが「高速」と呼ばれる理由です。システムはこれらの割り込みにより速く反応しますが、その他は同じです。

1
mishmashru

割り込みハンドラの設計方法によって異なります。FIQは最後に1つの分岐命令を必要としない場合があるため、r8-r14レジスタの一意のセットがあるため、次にFIQ割り込みに戻ったときにプッシュ/ポップアップする必要はありません。スタック。もちろん、いくつかのサイクルを節約しますが、1つのFIQを処理するハンドラーを増やすことは賢明ではありません。はい、FIQがより優先されますが、割り込みをより速く処理すると言う理由はありません。したがって、それらは同じ速度で実行する必要があります。

0