📄 flag.c
字号:
//*************************************************************************
//
// Copyright (C) SEIKO EPSON CORP. 1997
// All Rights Reserved
//
// Filename : flag.c
// Function : Eventflag functions
// Revision :
// 1997/08/01 H.Matsuoka start
// 1998/09/01 H.Matsuoka single task wait flag
// 1999/08/27 H.Matsuoka BUG FIX(critical section)
// 1999/11/25 H.Matsuoka Add iset_flg
// 2000/02/23 H.Matsuoka Fix suspend status problem
// 2000/11/30 Y.Taka Add Enter/Return_critical_section
// 2001/01/22 Y.Taka Add twai_flg() & 16bit of flag
// 2001/03/08 Y.Taka Change critical section
//
//*************************************************************************
#include "ros33.h"
#include "internal.h"
#include "M68328.h"
//****************************************************************************
//*** 3.3 Synchronization and Communication Functions ***
//****************************************************************************
//********************************************************************
// Set Eventflag
// [Parameters]
// ID flgid EventFlagID
// UINT setptn SetBitPattern
// [Return Parameters]
// ER ercd ErrorCode
//********************************************************************
ER set_flg
(
ID flgid,
UINT setptn
)
{
T_FLGCB* pFlgcb;
T_TSKCB* pTskcb;
UW psr;
#ifndef NO_ERROR_CHECK
if(flgid <= 0)
{
return E_ID;
}
if(flgid > FLG_NUM)
{
return E_NOEXS;
}
#endif
psr = ent_cri();
pFlgcb = &g_sFlgcb[flgid-1];
pFlgcb->uhFlgPtn |= setptn; // set flag pattern
if(pFlgcb->pNxtTsk == (UW*)pFlgcb) // not exist flag wait task
{
ret_cri(psr);
return E_OK;
}
// flag matching condition
if(pFlgcb->bWaiMode & TWF_ORW)
{
if((pFlgcb->uhWaiPtn & pFlgcb->uhFlgPtn) == 0)
{
ret_cri(psr);
return E_OK;
}
} else
{
if((pFlgcb->uhWaiPtn & pFlgcb->uhFlgPtn) != pFlgcb->uhWaiPtn)
{
ret_cri(psr);
return E_OK;
}
}
// flag condition matching case
pTskcb = (T_TSKCB*)pFlgcb->pNxtTsk; // flag wait task
pTskcb->ubStatus &= ~TTS_WAI; // clear wait
pTskcb->ubWaitStat &= ~TTW_FLG; // clear flag wait
if(pTskcb->ubIntinfo == 0) // interrupt information
{
((T_SAVEDREG_MIN *)(pTskcb->uwSP))->returnvalue = E_OK;
}
*pTskcb->pFlgptn = pFlgcb->uhFlgPtn; // set return value (flag pattern)
if(pFlgcb->bWaiMode & TWF_CLR)
{
pFlgcb->uhFlgPtn = 0; // clear flag
}
/* clear time out task link */
vfnDelInitMember((T_NODE*)&(pTskcb->pNxtTmoTsk));
vfnDelAddMember((T_NODE*)&g_sReadyQueue[pTskcb->bPriority],
(T_NODE*)pTskcb);
int_dispatch(); // dispatch & disable interrupt
ret_cri(psr);
#ifndef NO_RETURN_VALUE
return E_OK;
#endif
}
//********************************************************************
// Clear Eventflag
// [Parameters]
// ID flgid EventFlagID
// UINT clrptn ClearBitPattern
// [Return Parameters]
// ER ercd ErrorCode
//********************************************************************
ER clr_flg
(
ID flgid,
UINT clrptn
)
{
T_FLGCB* pFlgcb;
UW psr;
#ifndef NO_ERROR_CHECK
if(flgid <= 0)
{
return E_ID;
}
if(flgid > FLG_NUM)
{
return E_NOEXS;
}
#endif
psr = ent_cri();
pFlgcb = &g_sFlgcb[flgid-1];
pFlgcb->uhFlgPtn &= clrptn;
ret_cri(psr);
#ifndef NO_RETURN_VALUE
return E_OK;
#endif
}
//********************************************************************
// Wait for Eventflag
// [Parameters]
// ID mbxid MailboxID
// TMO tmout Timeout
// [Return Parameters]
// ER ercd ErrorCode
// T_MSG *pk_msg Start Address of Message Packet
//********************************************************************
ER twai_flg
(
UINT *p_flgptn,
ID flgid,
UINT waiptn,
UINT wfmode,
TMO tmout
)
{
T_FLGCB* pFlgcb;
UW psr;
#ifndef NO_ERROR_CHECK
if((g_ubIntNestCnt != 0) // issued from task-independent portions
|| (g_ubSysStat & TSS_DDSP)) // task in dispatch disabled state
{
return E_CTX;
}
if(flgid <= 0)
{
return E_ID;
}
if(flgid > FLG_NUM)
{
return E_NOEXS;
}
if((waiptn == 0)
||(wfmode > 3) || (tmout <= -2))
{
return E_PAR;
}
#endif
psr = ent_cri();
pFlgcb = &g_sFlgcb[flgid-1];
// wait single object
if((T_TSKCB*)(pFlgcb->pNxtTsk) != (T_TSKCB*)pFlgcb)
{
ret_cri(psr);
return E_OBJ;
}
pFlgcb->bWaiMode = (B)wfmode;
pFlgcb->uhWaiPtn = (UH)waiptn;
*p_flgptn = pFlgcb->uhFlgPtn;
if(wfmode & TWF_ORW)
{
if(waiptn & pFlgcb->uhFlgPtn)
{
if(pFlgcb->bWaiMode & TWF_CLR)
{
pFlgcb->uhFlgPtn = 0;
}
//dbgprintf("clear\n");
ret_cri(psr);
return E_OK;
}
} else
{
if((pFlgcb->uhWaiPtn & pFlgcb->uhFlgPtn) == pFlgcb->uhWaiPtn)
{
if(pFlgcb->bWaiMode & TWF_CLR)
{
pFlgcb->uhFlgPtn = 0;
}
ret_cri(psr);
return E_OK;
}
}
if(tmout == TMO_POL)
{
ret_cri(psr);
return E_TMOUT;
}
/* wait flag pattern */
g_pCurTsk->ubStatus |= TTS_WAI;
g_pCurTsk->ubWaitStat |= TTW_FLG;
g_pCurTsk->pFlgptn = p_flgptn;
vfnDelAddMember((T_NODE*)pFlgcb, (T_NODE*)g_pCurTsk);
//dbgprintf("add ok\n");
/* set time out */
if(tmout != TMO_FEVR) {
g_pCurTsk->utime = g_sSysTime.utime;
if (g_sSysTime.ltime > g_sSysTime.ltime + tmout)
g_pCurTsk->utime += 1;
g_pCurTsk->ltime = g_sSysTime.ltime + tmout;
vfnAddTimer((T_NODE*)&(g_pCurTsk->pNxtTmoTsk));
}
int_dispatch(); // dispatch & disable interrupt
ret_cri(psr);
MOV_R1TOR0; // mov r1(from the returnvalue in the stack) to ro (in asm)
return; // return value is E_OK or E_RLWAI
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -