3

私たちのグループは、カスタム ドライバを使用して、共有 I2C バス上で 4 つの MAX3107 UART と接続しています。4 つの MAX3107 の割り込みは、ARM9 プロセッサ (LPC3180 モジュール) の GPIO ピンに接続されます (つまり、論理和による共有割り込み)。これらのデバイスの 1 つまたは複数が割り込みを行うと、レベル センシティブな割り込みとして構成されている GPIO ラインが低くなります。私の質問は、ハンドラ コード内の特定の割り込み行を無効にする必要があるかどうかに関するものです。(Linux 2.6.10 を実行していることを付け加えておきます)。

割り込みに関するいくつかの ARM 固有のアプリケーション ノートを読んだところによると、ARM プロセッサが割り込みを受け取ると、対応する割り込み行が自動的に無効化 (マスク?) されるようです (この場合、これは、選択した GPIO ピン)。これが正しい場合、割り込みハンドラー コードでこの GPIO ピンの割り込みを無効にする必要はないように思われます。別の言い方をすれば、割り込みが発生したときに ARM プロセッサが GPIO 割り込みを自動的に無効にする場合、どちらかといえば、割り込みハンドラー コードは、デバイスが処理された後に割り込みを再度有効にするだけでよいように思われます。

使用している割り込みハンドラー コードにdisable_irq_nosync(irqno);は、ハンドラーの最初と対応するenable_irq()ハンドラーの最後に含まれています。ARM プロセッサが (ハードウェアで) 割り込みラインを既に無効にしている場合、これらの呼び出し (つまり、 への呼び出しにdisable_irq_nosync()続いてenable(irq())?

4

1 に答える 1

6

Arm インフォメーション センターのドキュメントから:

例外 (割り込み) へのエントリ時:

  • すべての例外に対して割り込み要求 (IRQ) が無効になっています。

  • 高速割り込み要求 (FIQ) は、FIQ およびリセット例外に対して無効になります。

それから次のように続けます。

FIQ を処理すると、IRQ と後続の FIQ が無効になり、FIQ ハンドラーがそれらを有効にするまで処理されなくなります。これは通常、ハンドラの最後で SPSR から CPSR を復元することによって行われます。

したがって、それらを無効にすることについて心配する必要はありませんが、それらを再度有効にすることについて心配する必要があります.

ルーチンの最後に enable_irq() を含める必要がありますが、最初に何も無効にする必要はありません。ハードウェアで呼び出された後にソフトウェアで disable_irq_nosync(irqno) を呼び出しても、何の影響もないと思います。ソフトウェア呼び出しが引き継ぐ前に、ハードウェア呼び出しが最も確実に呼び出されるためです。しかし、慣例に従い、それを見て次のプログラマーを混乱させないように、コードからそれを削除する方がおそらく良いでしょう。

詳細はこちら:

アームインフォメーションセンター

于 2013-01-12T17:08:31.693 に答える