*/
-#ifndef _KERNEL__arch__proc__h8__h8300h__proc_h__
-#define _KERNEL__arch__proc__h8__h8300h__proc_h__
+#ifndef _KERNEL__arch__proc__h8__h8300ha__proc_h__
+#define _KERNEL__arch__proc__h8__h8300ha__proc_h__
#define _KERNEL_IMSK_I 0x80 /**< %jp{割り込みマスクビット} */
/** %jp{コンテキスト情報保存ブロック} */
typedef struct _kernel_t_ctxcb
{
- VP_INT sp;
+ VP sp; /**< %jp{スタックポインタ}%en{Stack pointer} */
} _KERNEL_T_CTXCB;
+/** %jp{割込みコンテキスト情報保存ブロック} */
+typedef struct _kernel_t_ictxcb
+{
+ UB imsk; /**< %jp{割込みマスク}%en{Interrupt mask} */
+ UB intcnt; /**< %jp{割込みネストカウンタ}%en{Interrupt nest counter} */
+ VP isp; /**< %jp{割込み初期スタックポインタ}%en{Initial stack pointer for interrupt} */
+} _KERNEL_T_ICTXCB;
+
+
/* %jp{広域変数定義} */
-extern volatile UB _kernel_h83_imsk; /**< %jp{H8/300用割り込みマスク} */
-extern volatile UB _kernel_int_cnt; /**< %jp{割り込みネストカウンタ} */
+extern _KERNEL_T_ICTXCB _kernel_ictxcb; /**< %jp{割込みコンテキスト情報保存ブロック} */
#ifdef __cplusplus
extern "C" {
#endif
-void _kernel_ini_prc(void); /**< %jp{プロセッサの初期化} */
-
void _kernel_ena_int(void); /**< %jp{割り込み許可} */
void _kernel_dis_int(void); /**< %jp{割り込み禁止} */
void _kernel_wai_int(void); /**< %jp{割り込み待ち(アイドル時の処理)} */
#define _KERNEL_INI_PRC() do {} while (0)
-#define _KERNEL_ENA_INT() _kernel_ena_int() /**< %jp{割り込み許可} */
-#define _KERNEL_DIS_INT() _kernel_dis_int() /**< %jp{割り込み禁止} */
-#define _KERNEL_WAI_INT() _kernel_wai_int() /**< %jp{割り込み待ち(アイドル時の処理)} */
+#define _KERNEL_INI_INT(stksz, stk) do { _kernel_ictxcb.isp = (VB *)(stk) + (stksz); } while (0)
+#define _KERNEL_ENA_INT() _kernel_ena_int() /**< %jp{割り込み許可} */
+#define _KERNEL_DIS_INT() _kernel_dis_int() /**< %jp{割り込み禁止} */
+#define _KERNEL_WAI_INT() _kernel_wai_int() /**< %jp{割り込み待ち(アイドル時の処理)} */
#define _KERNEL_CRE_CTX(pk_ctxcb, stksz, stk, isp, entry, exinf1, exinf2) \
_kernel_cre_ctx((pk_ctxcb), (isp), (entry), (exinf1), (exinf2))
_kernel_swi_ctx((pk_ctxinf_nxt), (pk_ctxcb_now))
-#endif /* _KERNEL__arch__proc__h8__h8300h__proc_h__ */
+#endif /* _KERNEL__arch__proc__h8__h8300ha__proc_h__ */
/* end of file */
; ---------------------------------------------------------------------------
+ .EXPORT __kernel_ena_int
+ .IMPORT __kernel_ictxcb
- .EXPORT __kernel_ena_int ; 割り込み許可
- .IMPORT __kernel_h83_imsk ; 割り込みマスク
-
- .SECTION P, CODE, ALIGN=2
+ .SECTION P, CODE, ALIGN=2
; -----------------------------------------------
; -----------------------------------------------
.STACK __kernel_ena_int=4
__kernel_ena_int:
- mov.b @__kernel_h83_imsk, r0l
- ldc.b r0l, ccr ; 割り込みの許可
+ mov.b @(__kernel_ictxcb + 0), r0l
+ ldc.b r0l, ccr ; 割り込みの許可
rts
; ---------------------------------------------------------------------------
; Hyper Operating System V4 μITRON4.0仕様 Real-Time OS
; プロセッサ抽象化コンポーネント (日立 H8/300H 用)
-; 割り込みハンドラ
+; 割込みハンドラ
;
; Copyright (C) 1998-2006 by Project HOS
; http://sourceforge.jp/projects/hos/
.EXPORT __kernel_int_hdr
- .IMPORT __kernel_sta_inh ; 割り込み処理開始
- .IMPORT __kernel_end_inh ; 割り込み処理終了
- .IMPORT __kernel_exe_inh ; 割り込み処理実行
- .IMPORT __kernel_int_isp ; 割り込み用スタックアドレス
- .IMPORT __kernel_h83_imsk ; 現在の割り込みマスク値
- .IMPORT __kernel_int_cnt ; 割り込みネストカウンタ
+ .IMPORT __kernel_sta_inh ; 割込み処理開始
+ .IMPORT __kernel_end_inh ; 割込み処理終了
+ .IMPORT __kernel_exe_inh ; 割込み処理実行
+ .IMPORT __kernel_ictxcb ; 割込みコンテキスト制御情報
.SECTION P, CODE, ALIGN=2
and.b #h'c0, r1l
; -------- 多重割り込みの判別
- mov.b @__kernel_int_cnt, r1h
+ mov.b @(__kernel_ictxcb + 1), r1h ; 割込みネストカウンタ取得
bne multiple_int
; ======== 最初の割り込み ========
; ---- 割込みマスク値(_kernel_h83_imsk)を設定
- mov.b @__kernel_h83_imsk, r0h ; 古い割込みマスク値を保存
- mov.b r1l, @__kernel_h83_imsk ; 新しいマスク値を設定
+ mov.b @(__kernel_ictxcb + 0), r0h ; 古い割込みマスク値を保存
+ mov.b r1l, @(__kernel_ictxcb + 0) ; 新しいマスク値を設定
; ---- 割り込みネストカウンタ設定
mov.b #1, r1h
- mov.b r1h, @__kernel_int_cnt
+ mov.b r1h, @(__kernel_ictxcb + 1); 割込みネストカウンタ設定
; ---- スタックポインタの入れ替え
mov.l er7, er1
- mov.l @__kernel_int_isp, er7
+ mov.l @(__kernel_ictxcb + 2), er7
push.l er1 ; 直前のスタックポインタを保存
-
+
; ---- 古い割込みマスク値(r0h)と割込み番号(r0l)の保存
push.w r0
; -------- 割り込みネストカウンタクリア
xor.b r1l, r1l
- mov.b r1l, @__kernel_int_cnt
+ mov.b r1l, @(__kernel_ictxcb + 1)
; -------- 割り込みマスク値の復帰
mov.b @(8, er7), r1l
and.b #h'c0, r1l
- mov.b r1l, @__kernel_h83_imsk ; 割込み前の値に戻す
+ mov.b r1l, @(__kernel_ictxcb + 0) ; 割込み前の値に戻す
cmp.b r1l, r0h
bne return_int ; 割込み前処理中の多重割り込みなら後処理をカット
jsr @__kernel_end_inh
; -------- コンテキストスイッチの後処理
- mov.b @__kernel_h83_imsk, r0l ; マスク値取り出し
+ mov.b @(__kernel_ictxcb + 0), r0l ; マスク値取り出し
mov.b @(8, er7), r1l
and.b #h'3f, r1l
or.b r0l, r1l
multiple_int:
; -------- 割り込みネストカウンタ加算
add.b #1, r1h
- mov.b r1h, @__kernel_int_cnt
+ mov.b r1h, @(__kernel_ictxcb + 1)
; ---- 割込みマスク値(_kernel_h83_imsk)を設定
- mov.b r1l, @__kernel_h83_imsk ; 新しいマスク値を設定
+ mov.b r1l, @(__kernel_ictxcb + 0) ; 新しいマスク値を設定
; -------- 割り込みハンドラ呼び出し
jsr @__kernel_exe_inh
; -------- 割り込みネストカウンタ減算
- mov.b @__kernel_int_cnt, r1h
+ mov.b @(__kernel_ictxcb + 1), r1h
dec.b r1h
- mov.b r1h, @__kernel_int_cnt
+ mov.b r1h, @(__kernel_ictxcb + 1)
; -------- 復帰
bra return_int