CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

割込み処理

デジタル系であと確認しておくこととして割込みがありました。DSPの本来の処理はサンプリング間隔の一定のタイムスロット内で完了させるものであり、それに必要な周期割込みが機能するかやってみます。

ADSP-2101の割込み要因はハード割込み3本、シリアル送受信、内蔵タイマがありそれぞれのベクタテーブルは固定されています。

f:id:O3I:20210731143327j:plain

Z808085もそうですがリセットベクタと割込みベクタが並んでいて固定の場合、リセットベクタはROM領域(0ページ)になければならないのでアプリケーションに応じてベクタを書き換えるのには工夫がいります。ですがADSP-2101の場合はブートROMからRAMに展開されてから起動するので0ページにある割込みベクタテーブルを自由に書き換えができます。

・・と思ったのですが、割込みベクタテーブルに置くサービスルーチンのアドレスは割込み処理自体ではなく、ラップ関数(割込み処理本体に被さってレジスタ退避/復旧、RTIで戻る)を呼ばなければならないことがわかりました。しかもそのラップ関数の実体はCのランタイムライブラリの中にあり、ユーザプログラムとは別にビルドされているモニタではそのアドレスが判りません。

そこで苦肉の策として2段階のテーブルジャンプを行うことにします。

まずモニタ内にある0ページにロードされる本来のベクタテーブル。RAM上にあるユーザプログラムの仮ベクタへ飛ばします

f:id:O3I:20210731145054j:plain

ユーザプログラムの先頭にリンクされ、ラップ関数への実アドレスが解決しているベクタテーブル2。

f:id:O3I:20210731150205j:plain

 

この2種のベクタテーブルを介した制御の流れを図にしました。左は通常の電源ON起動時でモニタがらGコマンドでユーザプログラムを起動する場合でこれは単純です。

右はユーザプログラム実行中、①でタイマ割込みがかかった場合でタイマ割込みのハンドラが呼び出されて元のルーチンに戻るまでを示しています。

f:id:O3I:20210731150817j:plain