回答:
不足しているのは、コアがメモリからフェッチされたオペコードを実行するだけではないということです。割り込みを実装するための特定のロジックが含まれています。
割り込み検出ハードウェアが割り込みを取る時間を知らせる信号をアサートすると、通常、メモリからフェッチされたことのない特別な命令がコアに詰め込まれます。ほとんどの場合、これは割り込みベクトルアドレスへのCALL命令です。これは、既存の命令実行メカニズムを使用して現在のPCを呼び出しスタックに保存し、それを割り込みベクトルアドレスに変更します。また、プリフェッチされた命令などの破棄も処理します。
特別な割り込み処理ロジックは、同じ割り込み条件が次のサイクルで割り込みベクターアドレスへの別の呼び出しを引き起こさないように、割り込みを無効にする必要もあります。異なるプロセッサには、これを処理する異なる方法があります。最も簡単な方法は、割り込みを単に無効にし、割り込みサービスルーチンの最後にソフトウェアがそれらを再度有効にすることです。他のプロセッサには割り込み優先度レベルがあります。このレベルは、優先順位の高い割り込み条件のみが新しい割り込みを引き起こすことができるようにバンプされます。割り込み優先度は、CALL戻りアドレスとともに自動的に保存され、割り込みからコードが戻ったときに復元されるものです。
一般に、最新のマイクロコントローラーには、割り込みの管理を担当する専用の割り込みコントローラー(IC)ユニットがあります。さらに、各周辺コンポーネントには、何らかの条件が当てはまる場合(たとえば、この周辺モジュールが何らかの作業を完了した場合)0
に1
(またはその逆に)発生する割り込み出力があります。この出力は、割り込みコントローラーに接続されています。Core
CPUは、いずれかのICを伝えることができ、この特定の割り込みを無視する(それを隠す)か、特定の信号をトリガすることによって起こるたびMCUに通知し、その後、MCUは、それをどのように処理するかを決定します。一般的な方法は、ICがMCUにどの割り込みが発生したかを伝え、対応する処理コードにジャンプすることです。
コンピューターコアには、トリガーされた特定の割り込みに対応するプログラムカウンターに新しい値を詰め込むハードウェアがあります。割り込みルーチンが完了した後、ハードウェアがプログラムカウンターに割り込みアドレスを詰め込む前に、プログラムカウンターの現在の値がスタックにプッシュされる場所を思い出すために。割り込みルーチンが完了すると、プログラムカウンタの元の値がスタックから復元されます。
割り込み時にプログラムカウンターにジャムする値は、通常2つのスキームのいずれかによって決定されます。1つのアプローチでは、各割り込みタイプの固定アドレスをプログラムカウンターに詰め込み、コンピューターコアはその固定位置から実行を開始します。固定位置のスペースはしばしばサイズが制限されるため、実際の割り込みサービス位置に移動する固定アドレスでジャンプ命令をコーディングするのが一般的です。もう1つのスキームは、割り込みベクターテーブルと呼ばれるものを使用します。ここで、ハードウェアは、割り込みタイプに基づいてベクターテーブルへの固定アドレスオフセットを生成します。その後、ハードウェアはそのテーブルの場所にあるコンテンツを引き出し、その値をアドレスとして使用してプログラムカウンターに押し込みます。
コントローラには、次に実行される命令が格納されているアドレスを追跡するプログラムカウンタ用のレジスタがあります。(このレジスタは、ジャンプが実行されるときにも書き込まれます。)
コントローラーには、割り込みベクトル(または、割り込みのタイプに応じて複数の場合があります)があります。これは、ISRが格納されているアドレスです。このアドレスは常に同じです。これは、プログラムが開始されるリセットベクトルのようなものです。
(多くの場合、このベクトルには、実行する実際のコードにジャンプするジャンプ命令があります。これは、ベクトルのスペースがプロシージャ全体を格納するのに十分でないためです。ただし、重要なことは、ISRが常に同じポジション。)
割り込みが発生すると、コントローラーに割り込みベクターを使用してプログラムカウンターを書き込む専用のハードウェアがあります。次に、コントローラは次の命令サイクルに達すると、プログラムカウンタ(つまり、割り込みベクトル)が指すアドレスから命令をフェッチします。
(コントローラの1つの命令サイクルには、実行するさまざまなタスクがあります。プログラムカウンタが指すアドレスから次の命令をフェッチし、プログラムカウンタを増やし、命令をデコードして実行します。)
CALL
割り込みは異なる方法で終了するため、通常の命令ではありません(RET
vs.を参照RETI
)。