例外ベクタを調べた (1) [ColdFire V2]
MCF52233の内蔵モジュールをめぐる旅を続けてきましたが、例外(割り込み)については、ほぼ無視してきました。 SilentCで使うには無理があるだろうという理由からです。 本当のところ、例外処理関連はどうなっているのか調べてみました。
例外ベクタ・テーブルは、どこだ?
例外ベクタ・テーブルの先頭アドレスは、CPU内の Vector Base Register (VBR) に格納されています。 ところが、このレジスタには、 BDM を使って裏口からのぞきに行く以外には、書き込みを行うインストラクションしか見当たりません。 そのため、例外ベクタ・テーブルの正確な場所を調べることはできません。 ただし、VBR レジスタの値は1MByte単位でしか移動できないため、MCF52233で動作しているSilentCの場合、 FLASH (0x00000000) または、 RAM (0x20000000) しか可能性がありません。 きっと、 RAM には置かないだろうという推測の下、 0x00000000 からの内容を調べてみました。
CPUに直結したシステム例外
MCF52233の例外ベクタは、三つの部分に分かれています。
- CPUに直結したシステム例外
- 割り込みコントローラ0が発行する例外
- 割り込みコントローラ1が発行する例外
最初は、システム例外ベクタを調べます。 MCF52233リファレンス・マニュアルに用途が明記されていたベクタ及び例外ベクタ・テーブルに値が書き込まれていた(0xFFFFFFFFではない)ベクタを抜き出してみました。
ベクタ番号 | ベクタ・アドレス | ベクタ | 用途 |
---|---|---|---|
0 | 0x000 | 0x20000800 | 初期スーパバイザ・スタック・ポインタ |
1 | 0x004 | 0x00000418 | リセット・ベクタ |
2 | 0x008 | 0x000115F0 | アクセス・エラー |
3 | 0x00C | 0x000115F0 | アドレス・エラー |
4 | 0x010 | 0x000115F0 | 不正命令 |
5 | 0x014 | 0xFFFFFFFF | 0割り |
8 | 0x020 | 0x000115F0 | 特権違反 |
9 | 0x024 | 0x000115F0 | トレース |
10 | 0x028 | 0x000115F0 | 未実装A行命令 |
11 | 0x02C | 0x000115F0 | 未実装F行命令 |
12 | 0x030 | 0x000115F0 | デバッグ |
14 | 0x038 | 0x000115F0 | フォーマット |
15 | 0x03C | 0x000115F0 | Reserved |
24 | 0x060 | 0xFFFFFFFF | スプリアス割り込み |
25-31 | 0x064 - 0x07C | 0x000115E0 | Reserved |
32-47 | 0x080 - 0x0BC | 0x000115F0 | TRAP命令 |
62 | 0x0F8 | 0x001FE8** | Reserved |
63 | 0x0FC | 0x****0000 | Reserved |
ベクタ番号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月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2008/07/25
- メディア: 雑誌
コメント 0