?? eventflg.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;
/* 婲彴偟偨僞僗僋偑偁傞側(cè)傜僨傿僗僷僢僠 */
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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -