(toppers-users 1882) Re: H8/3048Fでの割り込みハンドラ利用手

Yuki WAKUDA wakuda @ robo.mein.nagoya-u.ac.jp
2005年 2月 5日 (土) 21:29:34 JST


> とりあえず、より簡単にしてみましょう。2つの割込みハンドラを書いてしまったら
> どちらが原因か解らなくなります。簡単なほう…もしどちらも簡単だと思うなら
> 自分が使い慣れているデバイスのほうのみでやってみましょう。
IRQ1のほうで行うことにします.

> つぎに、割込みが来るか来ないかというような根幹部分のデバッグで
> syslogみたいな複雑で重いものを使うのは止めましょう。
> LEDを光らすとかブザーならすとか、そういう単純なアクセスが可能か
> どうか検討してみましょう。
確かにそうですね.アドバイス有難う御座います.

> H8の場合はROMですので、例外的に開発者がsys_support.Sに手で書き込みます。手間ですが、仕方ないです。
そのようですよね.
最初は,全くピンときませんでしたが,つながりを追いかけているうちに納得してきました.

> cpu_config.h の INT_ENTRY マクロ → kernel_cfg.c の CFG_INT_ENTRY マクロ →
> kernel_cfg.c の /* Object iinitializer [interrupt] */付近
> と追って行くと、宣言と参照は見えてきますね。
はい,確かに追っていくと*_entryの宣言等は見えてきますが,疑問点があります.

その後,さらに追っていきましたが(ずらずらと長くて申し訳ありませんが,MLにDBとして残したほうが良いかと思い,できるだけ書きました)

1.
kernel_cfg.c の /* Object iinitializer [interrupt] */付近にて
const INHINIB _kernel_inhinib_table[TNUM_INHNO] = {
 {13,0,(FP)CFG_INT_ENTRY(irq1_handler)},
・・・
}
という配列があることが分かる.

2.
次に,これら_kernel_inhinib_table等の配列は,jsp_rename.h内にて
#define inhinib_table  _kernel_inhinib_table
などとされており,

3.
さらにinhinib_tableを追いかけていくと,
inhinib_tableは interrupt.c 内にて,
void interrupt_initialize()
{
 UINT  i;
 const INHINIB *inhinib;
 for (inhinib = inhinib_table, i = 0; i < tnum_inhno; inhinib++, i++) {
  define_inh(inhinib->inhno, inhinib->inthdr);
 }
}
とされています.

4.
そこで,define_inh()は何を行っているのか,ということを調べますと,
define_inhについては,

【参照:h8.txtから抜粋】================================
2. 3  CPU 例外管理機能と CPU 例外ハンドラ
  割込みハンドラ番号のデータ型 (EXCNO) は unsigned int 型に定義されて
いる。H8 の割込みと CPU 例外ベクタは ROM 領域にあり、 動的に内容を変更
するためには特別の方法が必要であるため、動的なハンドラの登録機能はない。
従って、 割込みハンドラの設定関数 define_inh、CPU 例外ハンドラの設定関
数 define_exc は、何もしない関数である。

【参照:config.txtから抜粋】=============================
(8) 割込みハンドラ/CPU例外ハンドラの定義
(8-1) void define_inh(INHNO inhno, FP inthdr)
割込みハンドラ番号 inhno の起動番地を inthdr に設定する.割込み管理機
能の初期化処理から呼ばれる.
/*
 *  割込みハンドラの設定
 *  ベクトル番号 inhno の割込みハンドラの起動番地を inthdr に設定する.
と解説があり,実際には以下のように記述されている.

Inline void
define_inh(INHNO inhno, FP inthdr)
{
 }

つまり,define_inh()は何もしない関数であることがわかる.

と,ここでだいたい決着するのですが,
ここで疑問があります.なぜ
Inline void define_inh(INHNO inhno, FP inthdr) {  }
という何もしない関数なのに,
“ベクトル番号 inhno の割込みハンドラの起動番地を inthdr に設定する.”
ということが可能なのでしょうか?

とりあえず次の期日には割り込みを使用せずに対応し,おいおい粘って問題を解決していこうかと思います.

湧田 雄基