レベルベースの割り込みの意味は何ですか?


8

レベルベースの割り込みの実用的な実装について検索したところ、ISRに入るとすぐに割り込みが無効になるので、トリガーが戻されないという提案が1つだけ見つかりました。

私が読んだ別のことは、それがループを作成するために使用されるということです。つまり、割り込みが存在する限り、ISRを提供しますが、それはwhileor do whileループで達成できます。

そして、レベルエッジ割り込みが提供する利点は、ISRとレイテンシの処理の間にメインプログラムの1つの命令を実行する贅沢かもしれません。私は推測する。

それで、レベルエッジ割り込みを理解する上で欠けているものはありますか?

素晴らしい答えは、レベルベースの割り込みのある種の実際的な使用法を私に示すことです。


...私が読んだ他のことは、それがループを作成するために使用されることです。つまり、割り込みが存在する限り、ISRを処理しますが、それは、whileまたはdo whileループで達成 できます。 1つの方法で達成したということは、同じことを行う他のすべての方法を排除する必要があるという意味ではありません。
Eugene Sh。

@EugeneSh。それについては間違いありませんが、同じことを他の方法で行うには確かな利点があるはずです。だよね?私はその「利点」を知ることにもっと興味があります。ループステートメントとレベルベースの割り込みを使用したループで、どのような違いがあるのか​​知りたいだけです。ループがそれを使用して達成される唯一の目的である場合。
MaNyYaCk

2
1つのラインで保留中の複数の割り込みがある場合はどうなりますか?たとえば、ISRの各トリガーは1パケットのデータを処理しますが、デバイスはキューに複数ありますか?エッジトリガー割り込みでは、割り込みコントローラーは、前の割り込みがいつ処理され、いつ次の割り込みを送信するかを知る必要があります。また、ホストが前の割り込みを処理しているときに複数の割り込みがアサートされるユースケースでは、レベルトリガーなしでそれらをキューに入れて優先順位を付けるのは困難です。
user3528438

回答:


10

レベルベースの割り込みは、簡単かつ確実に安全に共有およびカスケードできます。対照的に、エッジトリガー割り込みを確実に共有することは、しばしば困難であり、時には不可能です。

レベルベースの割り込みを使用する場合、割り込みハンドラーは、可能な各割り込みソースに順番に「注意が必要ですか」と尋ね、その場合はそれを処理します。完了すると、ハンドラーは戻ることができます。シーケンスの早い段階でポーリングされた割り込みソースが、後のソースが処理されている間に注意が必要であると判断した場合、プロセッサはIRQピンがまだアクティブであることに気づき、割り込みハンドラを再トリガーします。整備される。

カスケードされていないエッジトリガー割り込みを使用すると、状況はさらに複雑になります。割り込みハンドラーがすべてのユーザーにサービスを提供した後、それを通過してすべてのユーザーに再度ポーリングを行い、以前にポーリングされたデバイスがサービスが必要であると判断したかどうかを確認する必要があります。すべてのデバイスがサービスを必要としないことを連続的に報告した後にのみ、割り込みが安全に戻ることができます。サービスを必要とするデバイスが「サービスが必要」の表示をアクティブにしておく場合、デバイスがサービスを必要とするときに割り込みハンドラーから戻ると、その割り込みが永久に役に立たなくなる可能性があります。

I / Oピンには、エッジが到着したときにラッチを設定し、ソフトウェアがクリアするまで「サービスが必要」という表示を出力する、いくつかのエッジキャプチャロジックがあると便利な場合があります。このようなことが、エッジセンシティブな割り込みとしてフロントエンドに表示される場合があります。ただし、下流のポイントでは、上流のポイントが満たされない場合は常に割り込みを処理するように割り込みロジックに要求することをお勧めします。


大変お時間をいただき、誠に申し訳ございません。しかし、私が尋ねた質問は、コントローラーの外部割り込みに非常に固有のものであり、割り込みコントローラーを備えたプロセッサーを検討する際に注がれたすべての答えを理解するのにある程度の時間がかかりました。この貴重な答えを提供してくれてありがとう。
MaNyYaCk 2017

6

レベルベースの割り込みが有効である明らかな状況の1つは、コードが信号の監視を開始したときに、信号が既にその状態になっている状況です。

典型的な例を考えてみましょう...

信号: "Case_Over_Temperature"ボックス内の周囲が高すぎて通常の操作ができない場合に低くなります。

明らかに、この信号は、熱を出しすぎているため、またはボックスが高温の場所に設置されているために、いつでも低下する可能性があります。

明らかに、電源投入時にそのラインはどちらの状態でもあり得ます。今のところ、電源投入コードは見た目だけでなく、割り込みに依存していると仮定しましょう。割り込みがエッジトリガーであり、信号がすでに低い場合、割り込みが有効になると、適切なコードが実行されません。ここでは、レベルセンシティブな割り込みが賢明です。

同様に、プロセッサがスリープ状態にあり、その割り込みでウェイクするように設定されていない場合、そのラインはいつでもLowになる可能性があります。他に何が起きても、その時に割り込みを発生させたいと思います。

確かに、間違いなく、スリープモードプロセッサの普及により、レベルベースの割り込みがより有用になっています。

ただし、コードに関連するすべてのものと同様に、「猫の皮」には常に複数の方法があります。レベルベースを使用しない場合、割り込みピンがプロセッサによって自動的にキューに入れられない場合、ウェイクアップコードは割り込みピンをポーリングする必要があります。

明らかに、レベルトリガーには、コードが処理済みであるという条件などを処理する必要があるという点で、独自の一連の問題も伴います。


2

それは多少逆です:レベルトリガーを簡単に行えるのに、なぜエッジトリガーのぎこちない割り込みがあるのですか?

エッジトリガー割り込みは、ノイズスパイクの影響を受けやすく、フィルター処理が困難です。そうなると、ケーブルを外付けまたは上向きに配線するのが危険になります。割り込みはソースによって取り消すことはできません。

レベルトリガー割り込みは、CPUがソースを確認するまでオンのままです。したがって、完全なハンドシェイクの強固な基盤があります。CPUは、ほぼすべての方法で割り込み信号からノイズを除去できます。これは、割り込み応答時間を増加させるだけです。アプリケーションが十分にフィルタリングされた信号を必要とし、それを可能にする場合、レベルトリガーを適用できます。

私は最初に、Z80や6502などのCPUのNMIに使用されるエッジトリガー割り込みを確認しましたが、マスク可能な割り込みはレベルトリガーを使用していました。NMIはエッジトリガーを使用して、スタックしたピンまたはスタックした駆動回路がCPUを永久にNMI ISRに再入力しないようにしました。NMIは、別のアクティビティーを取得するためにアクティビティーを示す必要があります。

もちろん、答えは、どちらにもアプリケーションがあるということです。ただし、特別なケースがあるため、レベルトリガーが開始点であり、エッジトリガーが行われます。


1
「スタック」ピンの問題を回避するためにZ80と6502がエッジトリガー割り込みを使用したとは言えません。代わりに、サービスが開始されると、あらゆる種類の割り込みをマスクできる必要があると私は言います。NMIの場合、NMIがサービスされたときに設定され、 NMIピンが解放されます。
スーパーキャット2017年

@supercat、あなたはそれをどのように見るかを説明しましたが、Z80 / 6502がどのように機能するかは説明しませんでした。NMIは、割り込みソースがhwまたはsw割り込み確認応答によって削除されたINT / IRQと同じレベルである可能性があります。完璧に動作します。NMIをエッジトリガーとして設計し、INT / IRQをレベルとして設計したのは何だと思いますか?どのような利点があると思いますか?
TonyM 2017年

「エッジトリガー」という用語は、同期装置の前にエッジ検出回路を配置する入力を表すために使用されます。これにより、1サイクル内で行き来するすべての信号が処理されますが、入力の記述にも使用されています。これは、各クロック信号で信号をラッチし、1つ以上のサイクルで存在しない信号を探し、1つ以上のサイクルの間存在します。ソフトウェアでNMIを確認する必要がある場合、最初の割り込みの確認に失敗すると、後続のすべての割り込みが事実上マスクされます。
スーパーキャット

@supercat、それはZ80 / 6502の動作方法ではなく、それらだけがあなたが質問した私の例の対象でした。エッジトリガーのNMIについて話し合った後は、コメント交換の拡大を避けるためにチャットにアクセスしてください。しかし、何を追加できるかわかりません。ありがとう。
TonyM

Z80の動作の詳細は確認していませんが、6502データシートによると、NMIは各phi2クロックで1回サンプリングされます。データシートにはサンプル/ホールドタイムについては記載されていませんが、私が他の場所で読んだものから、少なくとも3つの連続するサンプルの間に存在しないNMIパルスが常に処理されるとは限りません。
スーパーキャット

1

レベルベースのISRのサポートAck / Nakは、多数のソースがある場合に役立ちます。

SWと外部HWの両方にランク付けされた優先度を持つ多くのISRと多くの優先度ランクがある場合。

すべてのソースがエッジORである場合でも、各ソースをポーリングして、どのソースセットを見つけ、割り込みをクリアする必要があります。

したがって、異なるアーキテクチャでは、エッジとレベルの両方に利点があります。

Edge IRQを見逃さないようにするには、有効にして、ISRの終了直後にテストする必要があります。

一部のレベルのIRQは、ISRよりも長く続くことがあり、予想どおり検出されます。


1

動作のレベルモードがより理にかなっているのは、「パーティーライン」がオープンドレインまたはオープンコレクターとともに使用されているときです。

この場合、回線上の各「パーティ」は、「サービス」が必要なときに出力をアクティブにします。割り込み処理ソフトウェアが停止し、パーティライン上の各デバイスを順番にポーリング(および処理)すると、これらのデバイスは保留を解除して非アクティブになります。最終的に、残りの(レベル)割り込みはなくなり、割り込みライン自体が非アクティブになり、割り込みを処理するソフトウェアが再び「静止」します。


1
それは問題である。ホストがすでに割り込みを処理しているときに、ホストが別のラインで別のエッジを受信した場合はどうなりますか?いくつかの選択肢:1)着信割り込みを無視します。2)ハードウェアのキューに入れます。3)現在の割り込みハンドラーに割り込み、新しいハンドラーを処理します。完全に処理するか、後でキューに入れます。レベルトリガーを使用すると、それをそのままにしておくだけで、現在のISRを終了した後でも処理することができます。
user3528438

@ user3528438「なぜレベルなのか」という質問に答えています。したがって、その部分を削除して、議論を避けます。
jonk

1
専用の割り込みを使用する場合でも、エッジトリガー割り込みは、サービスを提供できる時間までに発生したり発生したりするイベントへの応答に関心があり、イベントラッチングを使用している場合にのみ、優れていることをお勧めしますレベルセンシティブな割り込みを駆動するデバイスは、エッジセンシティブな割り込みを使用するのと同じくらい便利です。エッジトリガー割り込みは、ラッチをクリアするために必要な命令を保存する可能性がありますが、それは一般的に意味のあるコストや節約ではありません。
スーパーキャット2017年

@supercat私はタイトル付きの質問に直接答えるように私の回答に再び焦点を合わせました。これは、長くて卑劣な章や節に巻き込まれないようにするためです。はるかに簡単です。(はい、私は以来... 1974割り込み方法のすべての方法を使用してきた...私はすべての理由を見てきたので、私が思うに、私はちょうど今日、それらを議論する必要はありません。)
jonk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.