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

📄 flag.c

📁 最近在國外網站抓到的作業系統 以Arm為基礎去開發的
💻 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 + -