(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()を書き換えて利用すれば,割り込みが機能してもカーネルが停止すること
な
> > く,延々と割り込み処理をかけることはできました.
>
> これは具体的にはどのように書き換えられたのでしょうか?
>
> もちろんお仕事のご都合もあると思いますので、可能な限りで結構です。
>
> では。
>
>