[Uclinux-h8-devel] Re: h3069(h8max)での割り込み処理

Back to archive index

Yoshinori Sato ysato****@users*****
2005年 8月 15日 (月) 00:43:48 JST


At Tue, 09 Aug 2005 20:27:24 +0900,
taji wrote:
> 
> tajimaと申します。
> 
> uClinuxをh3069(h8max)上で稼動させてアプリケーション開発をしています。
> pwmのinput captureを行うために割り込み処理を使いたいのですが方法がわかりません。
> 
> 1. uClinux-dist-h8300/linux-2.4.x/System.mapから_interrupt_redirect_tableのアドレスをチェックする
> 2. このアドレスの値を読むと、interrupt handlerのベースアドレス(base)がわかる
> 3. vector番号(vec_num)を調べて、base+4*vec_num のアドレスにinterrupt
> handlerを入れる
> 
> とやろうとしたのですが、結局interrupt handlerの実行時のアドレスがわから
> ず、うまくいきません。
> 
> 割り込みベクトルのアドレスはどこにいるんでしょう?
> 割り込みハンドラはどのようにして登録すればよいんでしょう?
> 
> 過去に上記の組み合わせで割り込み処理(SCIでも何でもよいですので)を使用
> された方がいらっしゃいましたら何か情報いただけませんでしょうか。
> 

すみません、出遅れました。
#しかも遅れている間に解決したようで…

正しい手法としては、ドライバを作ってrequest_irqを使えば、そのへん
の面倒な事は全部面倒見てもらえます。

ユーザープログラムからお手軽に割り込みを使いたいということであれば、
(今回はこれ?)もっと下の方にあるベクタテーブルを *強引に* 書き換
えることになります。
この手順を文章で説明するとややこしくなるので、サンプル作りました。
実際に動かしていないので、参考程度に。
VECTORの割り込みでinterrupt_handlerが呼ばれるようになります。

===File ~/user-int.c========================================
#define VECTOR 32

void interrupt_handler(void) __attribute__((interrupt_handler));

void interrupt_handler(void)
{
}

unsigned long hook_interrupt(int vec,void (*handler)(void))
{
	unsigned long oldvec;
	unsigned long *ramvec;
	ramvec = (unsigned long *)(*(unsigned long *)(vec * 4) & 0x00ffffff);
	oldvec = *ramvec;
        *ramvec = 0x5a000000 | ((unsigned long)handler & 0x00ffffff);
	return oldvec;
}

void restore_interrupt(int vec, unsigned long oldvec)
{
	unsigned long *ramvec;
	ramvec = (unsigned long *)(*(unsigned long *)(vec * 4) & 0x00ffffff);
        *ramvec = oldvec;
}

int main(void)
{
	unsigned long old_vector;

	old_vector = hook_interrupt(VECTOR, interrupt_handler);

	restore_interrupt(VECTOR, old_vector);

	return 0;
}
============================================================

-- 
Yoshinori Sato
<ysato****@users*****>



Uclinux-h8-devel メーリングリストの案内
Back to archive index