[H8-ML(2320)] Re:AKI-H8/3048Fの割り込み
From: "kazuaki kamei" <kkamei@xxxxxxxxxxxxxxxxx>
Date: 2002年10月27日(日)20時43分10秒
かめい@大和市と申します

 初めての投稿に成るかと思います。
 私も割り込みについて随分悩みました、たぶんokodaさんは概念が知りたいのだと
 思い、私自身の頭の整理も含めて書かせて頂きます。

 
> okodaといいます。
> 初めてMailします。
> AKI-H8/3048Fで割り込みを使用したいのですが、あまりにも初心者のため使い方がよ
> くわかりません。
> 使用していますCコンパイラはイエロ−ソフトを使っています。
> NMI、IRQの設定など、具体的な参考ソ−スがあれば教えてください。
> 低レベルの質問ですみません。
 
 ソースを見るよりちょっと書かせて下さい

割り込みには色々ありますよね(H8-3048 では 61種類ある)
   1..リセット                      <ベクタ番号 0>
   2.システム予約                   <ベクタ番号 1〜6>
   3.外部割り込みNMI(禁止できない割り込み) <ベクタ番号 7>
   4.トラップ命令                   <ベクタ番号 8〜11>
   5.外部割り込み(パラメータで禁止できる)   <ベクタ番号 12〜17>
   6.システム予約                  <ベクタ番号 18〜19>
   7.内部割り込み                  <ベクタ番号 20〜60>

一つの割り込みベクタ番号に対し4バイトのメモリ領域割り当てがあり
( 4バイト× 61番地 = 0x0000番地 〜 0x00F3番地までがベクタテーブルです)

[割り込みが発生するとどうなるの?]
上記の割り込みが発生すると現在実行している命令(アッセンブラレベルの1ステップ)
が完了した時点で即座にプログラムカウンタ(CPUの内部レジスタ)を上記ベクタテーブル
のアドレスに書き換えて、ベクターテーブルへジャンプします。
*このとき CPUはスタックの退去など何もしてくれません!
*割り込み時のジャンプだけは 4〜数クロックでしているのですよね。 

[ベクタテーブルには何を書けばいいの?]
ベクタ番号は実アドレスと 1対1 の関係があり、1つのベクタアドレスには
4バイトが割れ当てられていて、例えばリセットはベクタ番号0 で 
アドレスは  0x0000番地 〜 0x0003番地の4バイトです。
次のベクタ番号1 は 0x0004番地〜 0x0007番地の4バイトです。
たった4バイトでは何の処理も書けませんよね。
そこで、ベクターテーブルに書くのは割り込み処理プログラムへのジャンプ命令
を書きます。(プログラムカウンタに次に飛ぶアドレスを入れる処理だけ書きます)

イエローソフトのCPUボードだと、上記割り込みベクタの領域 0x0番地〜0xF3番地 は
イエロースコープのモニタープログラムが入っています。
何が書いてあるかと言うと、たしかRAM領域にそのままオフセットしてジャンプする
命令が書いてあります。

例えば、MNI割り込み(ベクタ番号7)の処理プログラムを書きたいときには
RAMの先頭アドレス+(7×4バイト)に処理プログラへのジャンプ命令を
書けば飛んでいってれます。
(RAMが 0x200000番地からの場合 0x200000 + (7 × 4) =  0x20001C番地)
*イエローソフトの Cでは ORGという命令を使って上記実アドレスを指定できます。

本題の処理ルーチンに飛んだらスタックの退去とかいろいろやるのでしょうが
それは C がやってくれるのかも知れません。

上記は全ての割り込みでハードウエアがどう動くのかを解説しました。
高級言語を使っていても知っていた方が良いですよね。
偉そうに書きましたが、私も趣味で少しやっているだけの初心者なので
もし内容に間違いがあったら指摘して下さい。

最後まで読んで頂いて有り難うございました(^_^;)

スレッド概略
[2315(R)](起点)
 └[表示中]
   ├[2321(1)]
   └[2322(2)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]