ISRにジャンプするタイミングをコントローラーはどのようにして知るのですか?


12

私はコアレベルでのことについて話している。

私の知る限り、コントローラーコアはメモリからフェッチされた命令を実行するだけです(フェッチ-デコード-実行)。割り込みが到着すると、コア/ ALUはどのようにISRにジャンプすることを決定しますか?

私たちまたはコンパイラは、割り込みステータスをポーリングする命令を追加しないので、割り込みを処理する必要があることをどのように知るのでしょうか?

回答:


13

不足しているのは、コアメモリからフェッチされたオペコードを実行するだけではないということです。割り込みを実装するための特定のロジックが含まれています。

割り込み検出ハードウェアが割り込みを取る時間を知らせる信号をアサートすると、通常、メモリからフェッチされたことのない特別な命令がコアに詰め込まれます。ほとんどの場合、これは割り込みベクトルアドレスへのCALL命令です。これは、既存の命令実行メカニズムを使用して現在のPCを呼び出しスタックに保存し、それを割り込みベクトルアドレスに変更します。また、プリフェッチされた命令などの破棄も処理します。

特別な割り込み処理ロジックは、同じ割り込み条件が次のサイクルで割り込みベクターアドレスへの別の呼び出しを引き起こさないように、割り込みを無効にする必要もあります。異なるプロセッサには、これを処理する異なる方法があります。最も簡単な方法は、割り込みを単に無効にし、割り込みサービスルーチンの最後にソフトウェアがそれらを再度有効にすることです。他のプロセッサには割り込み優先度レベルがあります。このレベルは、優先順位の高い割り込み条件のみが新しい割り込みを引き起こすことができるようにバンプされます。割り込み優先度は、CALL戻りアドレスとともに自動的に保存され、割り込みからコードが戻ったときに復元されるものです。


1
多くの場合、CALL割り込みは異なる方法で終了するため、通常の命令ではありません(RETvs.を参照RETI)。
glglgl 14

1
割り込み検出ハードウェアがメモリの代わりに信号をアサートすると、CPUはどこか他の場所からジャンプする命令を取得します...スイッチのように...スイッチがオフのとき、メモリから命令をフェッチし、スイッチがオンのとき、この命令を実行しますか?
スワナンド14

3

一般に、最新のマイクロコントローラーには、割り込みの管理を担当する専用の割り込みコントローラー(IC)ユニットがあります。さらに、各周辺コンポーネントには、何らかの条件が当てはまる場合(たとえば、この周辺モジュールが何らかの作業を完了した場合)01(またはその逆に)発生する割り込み出力があります。この出力は、割り込みコントローラーに接続されています。CoreCPUは、いずれかのICを伝えることができ、この特定の割り込みを無視する(それを隠す)か、特定の信号をトリガすることによって起こるたびMCUに通知し、その後、MCUは、それをどのように処理するかを決定します。一般的な方法は、ICがMCUにどの割り込みが発生したかを伝え、対応する処理コードにジャンプすることです。


2

コンピューターコアには、トリガーされた特定の割り込みに対応するプログラムカウンターに新しい値を詰め込むハードウェアがあります。割り込みルーチンが完了した後、ハードウェアがプログラムカウンターに割り込みアドレスを詰め込む前に、プログラムカウンターの現在の値がスタックにプッシュされる場所を思い出すために。割り込みルーチンが完了すると、プログラムカウンタの元の値がスタックから復元されます。

割り込み時にプログラムカウンターにジャムする値は、通常2つのスキームのいずれかによって決定されます。1つのアプローチでは、各割り込みタイプの固定アドレスをプログラムカウンターに詰め込み、コンピューターコアはその固定位置から実行を開始します。固定位置のスペースはしばしばサイズが制限されるため、実際の割り込みサービス位置に移動する固定アドレスでジャンプ命令をコーディングするのが一般的です。もう1つのスキームは、割り込みベクターテーブルと呼ばれるものを使用します。ここで、ハードウェアは、割り込みタイプに基づいてベクターテーブルへの固定アドレスオフセットを生成します。その後、ハードウェアはそのテーブルの場所にあるコンテンツを引き出し、その値をアドレスとして使用してプログラムカウンターに押し込みます。


2

コントローラには、次に実行される命令が格納されているアドレスを追跡するプログラムカウンタ用のレジスタがあります。(このレジスタは、ジャンプが実行されるときにも書き込まれます。)

コントローラーには、割り込みベクトル(または、割り込みのタイプに応じて複数の場合があります)があります。これは、ISRが格納されているアドレスです。このアドレスは常に同じです。これは、プログラムが開始されるリセットベクトルのようなものです。

(多くの場合、このベクトルには、実行する実際のコードにジャンプするジャンプ命令があります。これは、ベクトルのスペースがプロシージャ全体を格納するのに十分でないためです。ただし、重要なことは、ISRが常に同じポジション。)

割り込みが発生すると、コントローラーに割り込みベクターを使用してプログラムカウンターを書き込む専用のハードウェアがあります。次に、コントローラは次の命令サイクルに達すると、プログラムカウンタ(つまり、割り込みベクトル)が指すアドレスから命令をフェッチします。

(コントローラの1つの命令サイクルには、実行するさまざまなタスクがあります。プログラムカウンタが指すアドレスから次の命令をフェッチし、プログラムカウンタを増やし、命令をデコードして実行します。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.