⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eventflg.c

📁 050117 CD 修正分 iTRON hosroot
💻 C
字号:
/* ------------------------------------------------------------------------- */
/*  HOS 僀儀儞僩僼儔僌娗棟                                                   */
/*                                                                           */
/*                                   Copyright (C) 1998-2002 by Project HOS  */
/* ------------------------------------------------------------------------- */

#include "itron.h"


/* 僀儀儞僩僼儔僌懸偪忬懺 */
typedef struct t_wflg_stat {
	UB  waiptn;	/* 懸偪價僢僩僷僞乕儞 */
	UB  wfmode;	/* 懸偪儌乕僪 */
} T_WFLG_STAT;


/* 僼儔僌偺僠僃僢僋 */
BOOL __chk_flg(T_FCB *fcb, T_WFLG_STAT *wflg_stat);


/* 僀儀儞僩僼儔僌弶婜壔 */
void __ini_flg(void)
{
	int i;
	
	for ( i = 0; i < fcbcnt; i++ ) {
		fcbtbl[i].flgptn     = fcbstbl[i].iflgptn;
		fcbtbl[i].que.tskcnt = 0;
	}
}


/* 僀儀儞僩僼儔僌僙僢僩 */
ER   set_flg(ID flgid, UB setptn)
{
	T_FCB *fcb;
	T_TCB *tcb;
	T_TCB *tcbNext;
	UB    old_syssat;
	BOOL  reqdsp;
	
#if __ERR_CHECK_LEVEL >= 4
	/* ID僠僃僢僋 */
	if ( flgid <= 0 )
		return E_ID;
	if ( flgid > fcbcnt )
		return E_NOEXS;
#endif
	
	fcb = &fcbtbl[flgid - 1];
	
	__set_imsk();
	
	/* 僼儔僌僙僢僩 */
	fcb->flgptn |= setptn;
	
	/* 懸偪偺僞僗僋偺僠僃僢僋 */
	if ( fcb->que.tskcnt > 0 ) {
		/* 堦帪揑偵僨傿僗僷僢僠傪嬛巭 */
		old_syssat = sysstat;
		sysstat   |= TSS_DDSP;
		reqdsp     = FALSE;
		
		/* 僼儔僌偺堦抳偡傞僞僗僋傪慡偰婲彴 */
		tcb = fcb->que.head;
		do {
			tcbNext = tcb->next;
			if ( __chk_flg(fcb, (T_WFLG_STAT *)tcb->data) ) {
				__wup_dsp(tcb, E_OK);
				reqdsp = TRUE;
			}
			tcb = tcbNext;
		} while ( tcb != fcb->que.head );
		
		/* 忬懺暅婣 */
		sysstat = old_syssat;
		
		/* 婲彴偟偨僞僗僋偑偁傞側傜僨傿僗僷僢僠 */
		if ( reqdsp )
			__tsk_dsp();
	}
	
	__res_imsk();
	
	return E_OK;
}


/* 僀儀儞僩僼儔僌偺僋儕傾 */
ER   clr_flg(ID flgid, UB clrptn)
{
	T_FCB *fcb;
	
#if __ERR_CHECK_LEVEL >= 4
	/* ID僠僃僢僋 */
	if ( flgid <= 0 )
		return E_ID;
	if ( flgid > fcbcnt )
		return E_NOEXS;
#endif
	
	fcb = &fcbtbl[flgid - 1];
	
	__set_imsk();
	
	/* 僼儔僌僋儕傾 */
	fcb->flgptn &= clrptn;
	
	__res_imsk();
	
	return E_OK;
}


/* 僀儀儞僩僼儔僌懸偪 */
ER   wai_flg(UB *p_flgptn, ID flgid, UB waiptn, UB wfmode)
{
	T_WFLG_STAT wflg_stat;
	T_FCB  *fcb;
	INT    ercd;
	
#if __ERR_CHECK_LEVEL >= 4
	/* ID僠僃僢僋 */
	if ( flgid <= 0 )
		return E_ID;
	if ( flgid > fcbcnt )
		return E_NOEXS;
	if ( wfmode > 3 || waiptn == 0 )
		return E_PAR;
#endif
	
	fcb = &fcbtbl[flgid - 1];
	
	__set_imsk();
	
#if __ERR_CHECK_LEVEL >= 3
	/* 忬懺僠僃僢僋 */
	if ( sysstat != 0 ) {
		__res_imsk();
		return E_CTX;
	}
#endif
	
	if ( p_flgptn != NADR )
		*p_flgptn = fcb->flgptn;
	
	/* 僼儔僌僠僃僢僋 */
	wflg_stat.waiptn = waiptn;
	wflg_stat.wfmode = wfmode;
	if ( __chk_flg(fcb, &wflg_stat) ) {
		__res_imsk();
		return E_OK;
	}
	
	/* 懸偪忬懺偵堏峴 */
	__del_que(curtcb);
	curtcb->tskstat = TTS_WAI;
	curtcb->tskwait = TTW_FLG;
	curtcb->data    = (VP)&wflg_stat;
	__adt_que(&fcb->que, curtcb);
	
	/* 僨傿僗僷僢僠 */
	ercd = __tsk_dsp();
	
	__res_imsk();
	
	return ercd;
}


/* 僀儀儞僩僼儔僌懸偪(億乕儕儞僌) */
ER   pol_flg(UB *p_flgptn, ID flgid, UB waiptn, UB wfmode)
{
	T_WFLG_STAT wflg_stat;
	T_FCB  *fcb;
	
#if __ERR_CHECK_LEVEL >= 4
	/* ID僠僃僢僋 */
	if ( flgid <= 0 )
		return E_ID;
	if ( flgid > fcbcnt )
		return E_NOEXS;
	if ( wfmode > 3 || waiptn == 0 )
		return E_PAR;
#endif
	
	fcb = &fcbtbl[flgid - 1];
	
	__set_imsk();
	
	/* 僼儔僌僠僃僢僋 */
	wflg_stat.waiptn = waiptn;
	wflg_stat.wfmode = wfmode;
	if ( __chk_flg(fcb, &wflg_stat) ) {
		if ( p_flgptn != NADR )
			*p_flgptn = fcb->flgptn;
		__res_imsk();
		return E_OK;
	}
	
	__res_imsk();
	
	return E_TMOUT;
}


/* 僀儀儞僩僼儔僌忬懺嶲徠 */
ER   ref_flg(T_RFLG *pk_rflg, ID flgid)
{
	T_FCB  *fcb;
	const T_FCBS *fcbs;
	
#if __ERR_CHECK_LEVEL >= 4
	/* ID僠僃僢僋 */
	if ( flgid <= 0 )
		return E_ID;
	if ( flgid > fcbcnt )
		return E_NOEXS;
#endif
	
	fcb  = &fcbtbl[flgid - 1];
	fcbs = &fcbstbl[flgid - 1];
	
	__set_imsk();
	
	pk_rflg->exinf = fcbs->exinf;
	if ( fcb->que.tskcnt == 0 )
		pk_rflg->wtsk = 0;
	else
		pk_rflg->wtsk = (BOOL_ID)(fcb->que.head - tcbtbl + 1);
	pk_rflg->flgptn = fcb->flgptn;
	
	__res_imsk();
	
	return E_OK;
}


/* 僼儔僌偺僠僃僢僋 */
BOOL __chk_flg(T_FCB *fcb, T_WFLG_STAT *wflg_stat)
{
	/* 僼儔僌僠僃僢僋 */
	if ( wflg_stat->wfmode & TWF_ORW ) {
		if ( !(fcb->flgptn & wflg_stat->waiptn) )
			return FALSE;
	}
	else {
		if ( (fcb->flgptn & wflg_stat->waiptn) != wflg_stat->waiptn )
			return FALSE;
	}
	
	/* TWF_CLR偑巜掕偝傟偰偄傟偽僼儔僌傪僋儕傾 */
	if ( wflg_stat->wfmode & TWF_CLR )
		fcb->flgptn = 0;
	
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -