(toppers-users 770) Re: 割込みハンドラ出口処理について

SHUKUGUCHI Masahiro ms89019 @ mms.co.jp
2003年 3月 11日 (火) 15:14:11 JST


かりやさま

dispatch: でなく ret_int: ですね。失礼いたしました。

懸念されているのは、カレントタスクが無い状態で、割込みが発生したが、
割込みハンドラでタスクを起床・起動しなかった場合にどうなるかですね。

TOPPERS/JSPでの割込み処理は、割込み出入口処理でくるむことになって
いるので、ハンドラはこの割込み出入口処理から呼ばれます。

cpu_config.h:227行目あたり

#define	INTHDR_ENTRY(inthdr)		\
extern void inthdr##_entry(void);	\
asm(".text				\n" \
#inthdr "_entry:			\n" \
"	movem.l %d0-%d1/%a0-%a1, -(%sp)	\n" /* スクラッチレジスタを保存 */ \
"	jsr " #inthdr "			\n" /* 割込みハンドラを呼び出す */ \
"	movem.l (%sp)+, %d0-%d1/%a0-%a1	\n" /* スクラッチレジスタを復帰 */ \
"	btst.b #4, (%sp)		\n" /* 戻り先が割込みモードなら */ \
"	jbeq 1f				\n" /*           すぐにリターン */ \
"	or.w #0x0700, %sr		\n" /* 割込み禁止 */ \
"	tst.l _kernel_reqflg		\n" /* reqflg が TRUE であれば */ \
"	jbne _kernel_ret_int		\n" /*              ret_int へ */ \
"1:	rte				\n")

#define	INT_ENTRY(inthdr)	inthdr##_entry

割込みハンドラでタスクを起床させるなどの処理が行われた場合は、上記の
_kernel_reqflg(カーネルコード内では reqflg と表記)がTRUEになります。
逆に言えば、割込みハンドラでスケジューリングされなければ、ここはFALSE
のままですので、_kernel_ret_int へ、即ち ret_int へは飛びません。

よく検証していませんが、確かに、直に ret_int が呼出されてしまうと、
問題が生じるかもしれませんね。

# 自信無くしてしまったので、フォローをお願いします。m(__)m

宿口雅弘