/*****************************************************************************/
/* リアルタイム・マルチタスクカーネル 「ai-TRON」*/
/* Copyright (C) 2000-2001 by 今井彰彦 */
/*****************************************************************************/
/* システムコール */

#ifndef	__SYSCALL__
#define __SYSCALL__	1

#include "rossys.h"

/*****************************************************************************/
/* プロトタイプ宣言 */
/* 割り込みタスク内で発行出来るものはi*()、独自仕様はv*()、割り込み＆独自はiv*()となる */

#ifdef	__cplusplus
extern	"C" {
#endif
/* カーネル関係 */
void	_SetStack(void);	/* スタック設定関数 */
ER	_SystemCall(FN ,...);
ER	_ISystemCall(FN ,...);
/**/
void	InitROS(void);		/* 初期化 */
void	ROSInit(void);		/* 初期化 : V1.1 = InitROS() */
void	ROS(void);		/* ＯＳそのもの */
ER	ROSDefaultSemaphore(SEMA,SID);	/* セマフォへの初期値設定 : V1.2 */

/* タスク管理 */
ER	cre_tsk(TID *,FP ,PRI ,int );	/* 割り込み内禁止 */
ER	del_tsk(TID);			/* 割り込み内禁止 */
ER	sta_tsk(TID);
ER	ivsta_tsk(TID);			/* 独自 */
void	ext_tsk(void);			/* 割り込みタスクは自動的にext_tsk()するので不要 */
ER	ter_tsk(TID);
ER	chg_pri(TID,PRI);
ER	ichg_pri(TID,PRI);
ER	rot_rdq(PRI);
ER	irot_rdq(PRI);
ER	rel_wai(TID);
ER	irel_wai(TID);
ER	get_tid(TID *);			/* 割り込み内では無意味 */
ER	ivget_tid(TID *);		/* 独自 */
ER	tsk_sts(STAT *,PRI *,PRI *,SUSCNT *,WUPCNT *,TID );
ER	ivtsk_sts(STAT *,PRI *,PRI *,SUSCNT *,WUPCNT *,TID );	/* 独自 */
ER	get_pri(PRI *,TID );		/* μITRON V4.0 */
ER	ivget_pri(PRI *,TID );		/* 独自 */
/* タスク同期 */
ER	sus_tsk(TID);
ER	isus_tsk(TID);
ER	rsm_tsk(TID);
ER	irsm_tsk(TID);
ER	frsm_tsk(TID);
ER	ifrsm_tsk(TID);
ER	wai_tsk(TMO);			/* 割り込み内禁止 */
ER	dly_tsk(TMO);			/* μITRON4 : 割り込み内禁止 */
ER	slp_tsk(void);			/* 割り込み内禁止 */
ER	wup_tsk(TID);
ER	iwup_tsk(TID);
ER	can_wup(WUPCNT *,TID );
ER	ican_wup(WUPCNT *,TID );
ER	vwai_tsk(TMO );			/* 独自 */
ER	ivwai_tsk(TMO );		/* 独自 */
/* １ビットイベントフラグ */
ER	set_flg(FID);
ER	iset_flg(FID);
ER	clr_flg(FID);
ER	ivclr_flg(FID);			/* 独自 */
ER	wai_flg(FID);			/* 割り込み内禁止 */
ER	cwai_flg(FID);			/* 割り込み内禁止 */
ER	pol_flg(FID);
ER	ivpol_flg(FID);			/* 独自 */
ER	cpol_flg(FID);
ER	ivcpol_flg(FID);		/* 独自 */
ER	flg_sts(TID *,ROS_BOOL *,FID );
ER	ivflg_sts(TID *,ROS_BOOL *,FID );	/* 独自 */
/* タスク付属メイルボックス */
ER	snd_tmb(TID , T_MSG *);
ER	isnd_tmb(TID , T_MSG *);
ER	rcv_tmb(T_MSG **);		/* 割り込み内禁止 */
ER	prcv_tmb(T_MSG **);		/* 割り込み内禁止 */
ER	tmb_sts(ROS_BOOL *,T_MSG **,TID );
ER	ivtmb_sts(ROS_BOOL *,T_MSG **,TID );	/* 独自 */
ER	vwai_rcv_tmb(T_MSG *,TID);	/* 独自；予約 */
ER	vpol_tmb_rcv(T_MSG *,TID);	/* 独自 */
ER	ivpol_tmb_rcv(T_MSG *,TID);	/* 独自 */
/* セマフォ */
ER	sig_sem(SID );
ER	isig_sem(SID );
ER	wai_sem(SID );			/* 割り込み内禁止 */
ER	preq_sem(SID );			/* 割り込み内禁止 */
ER	sem_sts(TID *,SEMA *,SID );
ER	ivsem_sts(TID *,SEMA *,SID );	/* 独自 */

/* 周期起動 */
#if ROS_CYC_ALL	== ROS_ON
ER	def_cyc(HNO ,CFP ,ATR ,RELTIM );
ER	cre_cyc(HNO ,CFP ,ATR ,RELTIM );/* μITRON4 */
ER	del_cyc(HNO);			/* μITRON4 */
ER	act_cyc(HNO ,ATR );
ER	sta_cyc(HNO);			/* μITRON4 */
ER	stp_cyc(HNO);			/* μITRON4 */
ER	cyh_sts(ATR *,RELTIM *,HNO );
ER	ref_cyc(HNO,ATR,RELTIM);	/* μITRON4 */
/* 以下の周期起動システムコールは全部独自 */
ER	ivdef_cyc(HNO ,CFP ,ATR ,RELTIM );
ER	ivcre_cyc(HNO ,CFP ,ATR ,RELTIM );
ER	ivdel_cyc(HNO);
ER	ivact_cyc(HNO ,ATR );
ER	ivsta_cyc(HNO);
ER	ivstp_cyc(HNO);
ER	ivcyh_sts(ATR *,RELTIM *,HNO );
ER	ivref_cyc(HNO,ATR,RELTIM);
#endif

/* システム状態管理 */
ER	get_ver(T_VER *);
ER	ivget_ver(T_VER *);		/* 独自 */
ER	dis_dsp(void);			/* μITRON4 */
ER	ena_dsp(void);			/* μITRON4 */
#if ROS_SYS_DSP	== ROS_ON
ER	dis_int(void);			/* μITRON4 */
ER	ena_int(void);			/* μITRON4 */
#endif
#if ROS_SYS_CHK_DSP == ROS_ON
ER	vchk_dsp(void);			/* 独自 */
ER	vreq_dsp(void);			/* 独自 */
ER	ivreq_dsp(void);		/* 独自 */
#endif
#if ROS_SYS_EXT_ROS ==	ROS_ON
void	vext_ros(void);			/* 独自 */
#endif
#ifdef	__cplusplus
}
#endif

/*****************************************************************************/
/* 実体定義１：単純もの */
/*****************************************************************************/

/* タスク管理 */	/* INT_FLGがないと割り込みタスク（周期起動）中では発行出来ない */
#define	sta_tsk(id)		_SystemCall(STA_TSK,(TID)(id))
#define	ivsta_tsk(id)		_ISystemCall(STA_TSK,(TID)(id))
#define	chg_pri(id,pri)		_SystemCall(CHG_PRI,(TID)(id),(PRI)(pri))
#define	ichg_pri(id,pri)	_ISystemCall(CHG_PRI,(TID)(id),pri)
#define	rot_rdq(pri)		_SystemCall(ROT_RDQ,(PRI)(pri))
#define	irot_rdq(pri)		_ISystemCall(ROT_RDQ,(PRI)(pri))
#define	rel_wai(id)		_SystemCall(REL_WAI,(TID)(id))
#define	irel_wai(id)		_ISystemCall(REL_WAI,(TID)(id))
#define	ext_tsk()		_SystemCall(EXT_TSK)
#define	ter_tsk(id)		_SystemCall(TER_TSK,(TID)(id))
/* タスク同期 */
#define	sus_tsk(id)		_SystemCall(SUS_TSK,(TID)(id))
#define	isus_tsk(id)		_ISystemCall(SUS_TSK,(TID)(id))
#define	rsm_tsk(id)		_SystemCall(RSM_TSK,(TID)(id))
#define	irsm_tsk(id)		_ISystemCall(RSM_TSK,(TID)(id))
#define	frsm_tsk(id)		_SystemCall(FRSM_TSK,(TID)(id))
#define	ifrsm_tsk(id)		_ISystemCall(FRSM_TSK,(TID)(id))
#define	wai_tsk(tm)		_SystemCall(WAI_TSK,(TMO)(tm))
#define	slp_tsk()		_SystemCall(WAI_TSK,(TMO)(TMO_FEVR))
#define	wup_tsk(id)		_SystemCall(WUP_TSK,(TID)(id))
#define	iwup_tsk(id)		_ISystemCall(WUP_TSK,(TID)(id))
/* １ビットイベントフラグ */
#define	set_flg(fid)		_SystemCall(SET_FLG,(FID)(fid))
#define	iset_flg(fid)		_ISystemCall(SET_FLG,(FID)(fid))
#define	clr_flg(fid)		_SystemCall(CLR_FLG,(FID)(fid))
#define	ivclr_flg(fid)		_ISystemCall(CLR_FLG,(FID)(fid))
#define	wai_flg(fid)		_SystemCall(WAI_FLG,(FID)(fid))
#define	cwai_flg(fid)		_SystemCall(CWAI_FLG,(FID)(fid))
/* タスク付属メイルボックス */
#define	snd_tmb(id,msg)		_SystemCall(SND_TMB,(TID)(id),msg)
#define	isnd_tmb(id,msg)	_ISystemCall(SND_TMB,(TID)(id),msg)
#define	rcv_tmb(msg)		_SystemCall(RCV_TMB,msg)
/* セマフォ */
#define	sig_sem(sid)		_SystemCall(SIG_SEM,(SID)(sid))
#define	isig_sem(sid)		_ISystemCall(SIG_SEM,(SID)(sid))
#define	wai_sem(sid)		_SystemCall(WAI_SEM,(SID)(sid))
/* システム状態管理 */
#define	vchk_dsp()		_SystemCall(CHK_DSP)

/*****************************************************************************/
/* 実体定義２：別名定義 */
/*****************************************************************************/
/* 互換用 */
#define	dly_tsk(tmo)			wai_tsk(tmo)
#define	cre_cyc(hno,func,act,tim)	def_cyc(hno,func,act,tim)
#define	del_cyc(hno)			def_cyc(hno,NADR,TCY_OFF,1)
#define	sta_cyc(hno)			act_cyc(hno,TCY_ON)
#define	stp_cyc(hno)			act_cyc(hno,TCY_OFF)
#define	ref_cyc(hno,act,lftime)		cyh_sts(act,lftime,hno)
#define	dis_int()			_DINT()
#define	ena_int()			_EINT()
#define	InitROS()			ROSInit()	/* V1.1 */

/* 割り込み用 */
#define	ivget_tid(id)			get_tid(id)
#define	ican_wup(wup,tid)		can_wup(wup,tid)
#define	ivtsk_sts(st,pri,pri0,sus,wup,tid)	tsk_sts(st,pri,pri0,sus,wup,tid)
#define	ivwai_tsk(tm)			vwai_tsk(tm)
#define	ivget_pri(pri,tid)		get_pri(pri,tid)
#define	ivpol_flg(fid)			pol_flg(fid)
#define	ivcpol_flg(fid)			cpol_flg(fid)
#define	ivflg_sts(tid,bool,fid)		flg_sts(tid,bool,fid)
#define	ivsem_sts(tid,sema,sid)		sem_sts(tid,sema,sid)
#define	ivpol_tmb_rcv(msg,tid)		vpol_tmb_rcv(msg,tid)
#define	ivtmb_sts(tmbwait,msg,id)	tmb_sts(tmbwait,msg,id)
#define	ivdef_cyc(hno,cfp,atr,tim)	def_cyc(hno,cfp,atr,tim)
#define	ivcre_cyc(hno,cfp,atr,tim)	cre_cyc(hno,cfp,atr,tim)
#define	ivdel_cyc(hno)			del_cyc(hno)
#define	ivact_cyc(hno,atr)		act_cyc(hno,atr)
#define	ivsta_cyc(hno)			sta_cyc(hno)
#define	ivstp_cyc(hno)			stp_cyc(hno)
#define	ivcyh_sts(atr,tim,hno)		cyh_sts(atr,tim,hno)
#define	ivref_cyc(hno,atr,tim)		ref_cyc(hno,atr,tim)
#define	ivget_ver(ver)			get_ver(ver)
#define	ivreq_dsp()			vreq_dsp()

/*****************************************************************************/
/* 実体定義３：特殊定義 */
/*****************************************************************************/

#if ROS_SYS_EXT_ROS == ROS_ON
	#if DEBUG == -1
	#define	ROS()	(setjmp(_ext_ros_jbuf)==0? _ROS():DumpStackMain())
	#else
	#define	ROS()	if (setjmp(_ext_ros_jbuf)==0) _ROS()
	#endif
#else
	#if DEBUG == -1
	#define	ROS()	(_ROS(),DumpStackMain())
	#else
	#define	ROS()	_ROS()
	#endif
#endif

/*****************************************************************************/

#endif	/* __SYSCALL__ */

/*****************************************************************************/
