DSPの割り込み
こんにちはuzakadeuです。
今回はDSPの割り込みについてお話しします。
昔使ったDSPは記憶が曖昧なので、直近で携わったテキサス・インスツルメント社のC64x+の話をします。
割り込みとは、外部非同期イベントに応答してアプリケーションが実行すべき処理、またはそのイベント、またはその仕組みのことです。
非同期つまりいつ割り込みが発生するか完全には予測できないので、関数コールのように予め引数や戻りアドレスを準備することができません。またアプリケーションがどんな処理をしていようが関係なく割り込まれてしまいます*1。このため戻りアドレスを保存/復帰するためにはハードウェアのサポートが必要です。
割り込みコントローラ(INTC)*2には、イベント結合器、割り込みセレクタといった機能があって複雑ですが、INTCがDSP CPUへ入力する割り込みはそんなに難しくはありません。
すなわち
- 1つのリセット信号(RESET)
- 1つのノンマスカブル割り込み(NMI)
- 12のマスカブル割り込み(INT4〜15)
の14の割り込み信号をどのように扱うかという話だけになります。
その後のシーケンスは次のとおりです。いずれもハードウェアが行います。
- NMIおよびINT4〜15が入力された場合、割り込みフラグレジスタ(IFR)の該当ビットをセットする。
- INT4〜15の場合、グローバル割り込みイネーブル(GIE)ビットおよび割り込みイネーブルレジスタ(IER)の該当ビットをチェックする。チェックの結果割り込みが許可されていたら以下のシーケンスを実行する。RESETおよびNMIはこのようなチェックは働かない*3。
- 割り込み禁止にする。NMIの場合、NMIEをクリアする。INT4〜15の場合、GIEをPGIEへコピした後にGIEをクリアする。
- 戻りアドレスを保存する。NMIの場合、NMIリターンポインタ(NRP)に保存する。INT4〜15の場合、割り込みリターンポインタ(IRP)に保存する。
- 割り込みサービステーブル(IST、私の周りでは割り込みベクタテーブルと呼ぶ)の該当オフセット(割り込みベクタ)へ分岐する。
この後は割り込みベクタの内容に従って割り込み処理を行います。割り込み処理が完了したらNRPまたはIRPへ分岐することにより、割り込み前に行っていた処理をつづける事ができます。