SSブログ

例外ベクタを調べた (1) [ColdFire V2]このエントリーを含むはてなブックマーク#

1990557

MCF52233の内蔵モジュールをめぐる旅を続けてきましたが、例外(割り込み)については、ほぼ無視してきました。 SilentCで使うには無理があるだろうという理由からです。 本当のところ、例外処理関連はどうなっているのか調べてみました。

例外ベクタ・テーブルは、どこだ?

例外ベクタ・テーブルの先頭アドレスは、CPU内の Vector Base Register (VBR) に格納されています。 ところが、このレジスタには、 BDM を使って裏口からのぞきに行く以外には、書き込みを行うインストラクションしか見当たりません。 そのため、例外ベクタ・テーブルの正確な場所を調べることはできません。 ただし、VBR レジスタの値は1MByte単位でしか移動できないため、MCF52233で動作しているSilentCの場合、 FLASH (0x00000000) または、 RAM (0x20000000) しか可能性がありません。 きっと、 RAM には置かないだろうという推測の下、 0x00000000 からの内容を調べてみました。

CPUに直結したシステム例外

MCF52233の例外ベクタは、三つの部分に分かれています。

  1. CPUに直結したシステム例外
  2. 割り込みコントローラ0が発行する例外
  3. 割り込みコントローラ1が発行する例外

最初は、システム例外ベクタを調べます。 MCF52233リファレンス・マニュアルに用途が明記されていたベクタ及び例外ベクタ・テーブルに値が書き込まれていた(0xFFFFFFFFではない)ベクタを抜き出してみました。

例外ベクタ0-63
ベクタ番号ベクタ・アドレスベクタ用途
00x0000x20000800初期スーパバイザ・スタック・ポインタ
10x0040x00000418リセット・ベクタ
20x0080x000115F0アクセス・エラー
30x00C0x000115F0アドレス・エラー
40x0100x000115F0不正命令
50x0140xFFFFFFFF0割り
80x0200x000115F0特権違反
90x0240x000115F0トレース
100x0280x000115F0未実装A行命令
110x02C0x000115F0未実装F行命令
120x0300x000115F0デバッグ
140x0380x000115F0フォーマット
150x03C0x000115F0Reserved
240x0600xFFFFFFFFスプリアス割り込み
25-310x064 - 0x07C0x000115E0Reserved
32-470x080 - 0x0BC0x000115F0TRAP命令
620x0F80x001FE8**Reserved
630x0FC0x****0000Reserved

ベクタ番号0には、初期スーパバイザ・スタック・ポインタの値が入っています。 0x20008000 というと RAM の末尾を指しているように見えます。 しかし、リセット直後、 MCF52233 の RAM は使用不可の状態になっているため、そのままでは使用することが出来ません。 RAM を使用可能にするには、 MOVEC インストラクションで隠しレジスタ RAMBAR に値を設定しなくてはなりません。 リセット直後のプログラムであわただしく、この初期化作業をしているのだろうと思われます。 初期化される前にバス・エラーなんかが起こったら、どうなるんだろうね。

ベクタ番号5の「0割り (divide by zero)」のベクタが実装されていません。 もし、「0割り」が発生したら、0xFFFFFFFFにインストラクション・フェッチが発生します。 ところが、奇数番地でのインストラクション実行は禁止されているので、別のエラー(どれかな?)が発生して、0x000115F0に飛ぶことになるでしょう。

ベクタ番号15の未使用 (Reserved) ベクタに値が書かれています。 ここは、ColdFire のプログラマーズ・マニュアルでは、「未初期化割り込み (Uninitialized Interrupt)」があるとされていますが、MCF52233では、「未使用 (Reserved)」になっています。

ベクタ番号24には、「スプリアス割り込み」が割り当てられていますが、ベクタが実装されていません。 スプリアス割り込みって、何でしょうね? 説明が見当たりません。

ベクタ番号25から31は、MCF52233では未使用 (Reserved) なのですが、ベクタが入っています。 ColdFire のプログラマーズ・マニュアルによると、この部分にはオート・ベクタと呼ばれる外部割込みのためのベクタが入ることになっています。 ところが、MCF52233の場合には、すべての割り込みが割り込みコントローラを介して発行されるので、オード・ベクタは、入っていないはずです。

ベクタ番号62,63は、未使用 (Reserved) ですが、ベクタらしからぬ値が入っています。 これは、MACアドレスだ。 こういう所に置かれると、そうそう簡単には書き換えられないですね。

一覧にしてわかったのは、システム例外は、「リセット」と「それ以外」の二つの選択肢しかないということです。 リセット以外のシステム例外が発生したら、どういう処理がなされるのかな? スタック・フレームを調べて、改めて分岐するようなプログラムになっているのかな?

参考文献

Interface (インターフェース) 2008年 09月号 [雑誌]

Interface (インターフェース) 2008年 09月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2008/07/25
  • メディア: 雑誌

nice!(0)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。