(toppers-users 1881) Re: H8/3048Fでの割り込みハンドラ利用手順に関する質問です.

Yuki WAKUDA wakuda @ robo.mein.nagoya-u.ac.jp
2005年 2月 5日 (土) 18:40:45 JST


宿口 様

湧田です.
アドバイス有難う御座います.

> この「OSが停止する」というのはどのような状況でしょうか?
> > 予定していた“I'm irq1 !”などの出力も無く,前後にあるsyslogの出力途中などで止まったりするという症状です.
> とありますが、もう少し具体的に説明いただけないでしょうか?

IRQ1で実験する場合,
 *(volatile UB*)H8IER |= 0x02;  /*IRQ1のみを割り込み許可セット*/

にてIRQ1の割り込み許可した後,

例えば,1秒ごとにサイクリックハンドラにてsyslogで言葉を吐く設定にして動作しているときに,ボタンを押すと,予定では,LCDにメッセージが
表示され,またサイクリックハンドラの動作に復帰するのでは,と思っているのですが,
実際には,ボタン押した瞬間に,IRQを押した場合に出るはずのメッセージも無く,全ての動作が停止し,その後はスイッチを切らないと復帰しな
いのです.ということで,カーネルが停止してしまっているのではないかと思ったのです.

> それと、
> 確認なんですが、割込みが発生したときに、irq1_handler()、imia2_handler()
> がコールされている(ハンドラにブレイクポイントを設定したとして、ブレイク
> するか?)のでしょうか?
これについては,
割り込みハンドラ内にて,LCDでメッセージを表示する設定にしたり,
syslogでメッセージを吐くように設定したりしているのですが,メッセージが表示されないので,割り込みハンドラ関数に到達できていないのだと
思います.


> > また,わざと_no_reg_exceptionに飛ばして,その中のcpu_experr()を書き換えて利用すれば,割り込みが機能してもカーネルが停止すること
な
> > く,延々と割り込み処理をかけることはできました.
>
> これは具体的にはどのように書き換えられたのでしょうか?
具体的には,
sys_support.S内にて,
 .long _no_reg_exception  /* 13, 0x0034: IRQ1 */
などと設定してある場合には,IRQ1に対応するボタンを押すと,
no_reg_exceptionに対応した
cpu_support.S内の
/*=======
 *  no_reg_exception()
 *  CPU例外として登録されていない例外が発生すると呼び出される。
 *  例外が発生した時点のPC,ER0〜7を出力してカーネル
 *  を停止する。
 */
 .globl _no_reg_exception
_no_reg_exception:

 push.l er6  /*  ER0〜6を保存    */
 push.l er5
 push.l er4
 push.l er3
 push.l er2
 push.l er1
 push.l er0

 mov.l sp, er0  /*  引数設定    */
 jsr @_cpu_experr /*  cpu_experr()の呼び出し cpu_config.c内の */
/*-------*/
という関数が呼び出され,
この中のcpu_experr()
という関数が呼び出されていたことから↓
void cpu_experr(EXCSTACK *sp)
{
    syslog(LOG_EMERG, "Unexpected interrupt.");
    syslog(LOG_EMERG, "PC  = %08x SP  = %08x", sp->pc, sp - 32);
    syslog(LOG_EMERG, "ER0 = %08x ER1 = %08x ER2 = %08x ER3 = %08x",
                       sp->er0, sp->er1, sp->er2, sp->er3);
    syslog(LOG_EMERG, "ER4 = %08x ER5 = %08x ER6 = %08x",
                       sp->er4, sp->er5, sp->er6);
    while(1) ;/**/
}
この中で,例えばですが,
    while(1) ;/**/
の代わりに,
 syslog(LOG_NOTICE, "m f_IMIA2 !");/**/
 *(volatile UB*)w_ITU2_TSR &= 0xFE; /*IMFAクリア*/
を追加すると,
メッセージが表示され,IMFAクリアも実行され,毎回割り込みが成功するのです.
あたりまえですが..

つまり,sys_support.S内にて割り込みベクタの設定をしますが,
_no_reg_exceptionへの対応する行き先はあるけれど,
_irq1_handler_entry等への対応する行き先はない.
という感触です.


以下その他,やってみたことです.

1.
spu_support.Sの中の,no_reg_exception()内でcpu_experr()の呼び出しが成功しているのなら,
    jsr @_cpu_experr /*  cpu_experr()の呼び出し (cpu_config.c内の) */
という行の代わりに
    jsr @_irq1_handler

として呼び出し先を入れ替えてみましたが,これまで同様カーネル動作がピタリと止まるばかりでした.
なんだかirq1_handlerやirq1_handler_entry自体が存在しないorカーネルに登録されていないような感触です..


湧田 雄基


----- Original Message ----- 
From: "SHUKUGUCHI Masahiro" <ms89019 @ mms.co.jp>
To: <users @ toppers.jp>
Sent: Monday, January 31, 2005 9:40 PM
Subject: (toppers-users 1865) Re: H8/3048Fでの割り込みハンドラ利用手順に関する質問です.


> 宿口と申します。
>
> お役に立てるかどうかわかりませんが。。。
>
> 湧田さん:
> > HW割り込みやタイマ割り込みなど,割り込み機能を使いたいのですが,タイマ割り込み,IRQ,どちらで試しても,割り込みがかかった段階
で,OS
> > が停止してしまいま
> > す.
>
> この「OSが停止する」というのはどのような状況でしょうか?
> > 予定していた“I'm irq1 !”などの出力も無く,前後にあるsyslogの出力途中などで止まったりするという症状です.
> とありますが、もう少し具体的に説明いただけないでしょうか?
>
> それと、
> 確認なんですが、割込みが発生したときに、irq1_handler()、imia2_handler()
> がコールされている(ハンドラにブレイクポイントを設定したとして、ブレイク
> するか?)のでしょうか?
>
> > また,わざと_no_reg_exceptionに飛ばして,その中のcpu_experr()を書き換えて利用すれば,割り込みが機能してもカーネルが停止すること
な
> > く,延々と割り込み処理をかけることはできました.
>
> これは具体的にはどのように書き換えられたのでしょうか?
>
> もちろんお仕事のご都合もあると思いますので、可能な限りで結構です。
>
> では。
>
>