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

📄 tskmng.c

📁 最近在國外網站抓到的作業系統 以Arm為基礎去開發的
💻 C
字号:
//*************************************************************************
//
//  Copyright (C) SEIKO EPSON CORP. 1997
//  All Rights Reserved
//
//  Filename : tskmng.c
//  Function : Task Management Functions for C33 itron 
//  Revision :
//          1997/08/01  H.Matsuoka  start
//          1999/08/26  H.Matsuoka  Add message buffer function
//          2000/02/23  H.Matsuoka  Fix suspend status problem
//          2000/11/29  Y.Taka      Add Enter/Return_critical_section
//          2001/03/08  Y.Taka      Change critical section
//          2001/03/30  Y.Taka      Del TimeOutTsk in ter_tsk
//
//*************************************************************************
#include "Ros33.h"
#include "internal.h"


//****************************************************************************
//***    3.1 Task Management Functions                                     ***
//****************************************************************************

//****************************************************************************
//  Start Task
//  [Parameters]
//      ID      tskid   TaskID
//      INT     stacd   TaskStartCode
//  [Return Parameters]
//      ER      ercd    ErrorCode
//****************************************************************************
ER  sta_tsk(ID  tskid,INT stacd)
{
    T_SAVEDREG* pSavedreg;
    T_TSKCB*    pTskcb;
	UW psr;
	
#ifndef NO_ERROR_CHECK    
    /* check parameter */
    if(tskid > TSK_NUM) 
    {
        return E_NOEXS;
    }

    if(tskid <= 0)
    {
        return E_ID;
    }
#endif

	psr = ent_cri();
	
    pTskcb = &g_sTskcb[tskid-1];

#ifndef NO_ERROR_CHECK
    if(pTskcb->fpPC == 0)
    {
    	ret_cri(psr);
        return E_NOEXS;
    }

    if(!(pTskcb->ubStatus & TTS_DMT))
    {
    	ret_cri(psr);
        return E_OBJ;
    }
#endif

    // init task control block 
    pTskcb->bPriority = pTskcb->bIniPriority;
    pTskcb->uhWupcnt = 0;

    // interrupt information use first dispatch
    #ifdef DEBUG_KERNEL
    /* set not check checksum bit at debug mode */
    pTskcb->ubIntinfo = 0x1 | 0x8;   // restore all register 
                                     // and not check stack checksum 
                                     // use bit 3
    #else
    pTskcb->ubIntinfo = 0x1;     // restore all register
    #endif
    
    // stack pointer set
    pTskcb->uwSP = pTskcb->uwIniSP - sizeof(T_SAVEDREG);
    pSavedreg = (T_SAVEDREG*)(pTskcb->uwSP);

    // init saved register 
    pSavedreg->pc =(FP)pTskcb->fpPC;  //GFD
    pSavedreg->psr = INI_PSR;
    #ifdef USE_GP
    pSavedreg->r[8] = GLOBAL_POINTER;
    #endif

    pTskcb->ubWaitStat = 0;
    
    pTskcb->ubStatus = TTS_RDY|TTS_RUN;
    // link to ready queue 
    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
}
    

//***********************************************************************
//  Exit Task
//  [Parameters]
//      None
//  [Return Parameters]
//      Not returned to the context issuing the system call.
//***********************************************************************/
void ext_tsk( )
{
	UW psr;
	
#ifndef NO_ERROR_CHECK    
//    if(g_ubSysStat != TSS_TSK)
//        return;     // return E_CTX
#endif

	psr = ent_cri();
	
    g_pCurTsk->ubStatus |= TTS_DMT;
    vfnDelInitMember((T_NODE*)g_pCurTsk);

    int_dispatch();         // dispatch & disable interrupt
    
    ret_cri(psr);
    POP_PSR;
}

//********************************************************************
//  Terminate Task
//  [Parameters]
//      ID  tskid   TaskID
//  [Return Parameters]
//      ER  ercd    error code
//********************************************************************
ER ter_tsk(ID  tskid)
{
    T_TSKCB*    pTskcb;
    UW psr;
    
#ifndef NO_ERROR_CHECK    
    if(tskid <= 0)      /* 0 is tskid = TSK_SELF */
    {
        return E_ID;
    }
    
    if(tskid > TSK_NUM)
    {
        return E_NOEXS;
    }
#endif
    
    psr = ent_cri();
	
    pTskcb = &g_sTskcb[tskid-1];

#ifndef NO_ERROR_CHECK    
    if(pTskcb->fpPC == 0)
    {
    	ret_cri(psr);
        return E_NOEXS;
    }

    if((pTskcb == g_pCurTsk) 
    || (pTskcb->ubStatus & TTS_DMT))
    {
    	ret_cri(psr);
        return E_OBJ;
    }
#endif
    
    pTskcb->ubStatus |= TTS_DMT;
    vfnDelInitMember((T_NODE*)pTskcb);

    pTskcb->ubWaitStat = 0;             /* clear Wait Status */
    vfnDelInitMember((T_NODE*)&(pTskcb->pNxtTmoTsk));

	ret_cri(psr);
#ifndef NO_RETURN_VALUE
    return E_OK;
#endif
    
}

//********************************************************************
//  Disable Dispatch
//  [Parameters]
//      None
//  [Return Parameters]
//      ER  ercd    error code
//********************************************************************
ER dis_dsp( )
{
	UW psr;
	
	psr = ent_cri();
	
#ifndef NO_ERROR_CHECK    
    if((g_ubIntNestCnt != 0) 
    || (g_ubSysStat == TSS_LOC))
    {   
    	ret_cri(psr);
        return E_CTX;
    }
#endif  

    g_ubSysStat |= TSS_DDSP;
    
    ret_cri(psr);
#ifndef NO_RETURN_VALUE
    return E_OK;
#endif
}

//********************************************************************
//  Enable Dispatch
//  [Parameters]
//      None
//  [Return Parameters]
//      ER  ercd    error code
//********************************************************************
ER ena_dsp( )
{
	UW psr;
	
	psr = ent_cri();
	
#ifndef NO_ERROR_CHECK    
    if((g_ubIntNestCnt != 0) 
    || (g_ubSysStat == TSS_LOC))
    {   
    	ret_cri(psr);
        return E_CTX;
    }
#endif  

    g_ubSysStat &= ~TSS_DDSP;
    
    if(g_blDelay & 1)
    {
    	int_dispatch();         // dispatch & disable interrupt
    }

	ret_cri(psr);
#ifndef NO_RETURN_VALUE
    return E_OK;
#endif
}

//********************************************************************
//  Change Task Priority
//  [Parameters]
//      ID  tskid   Task ID
//      PRI tskpri  Task Priority
//  [Return Parameters]
//      ER  ercd    error code
//********************************************************************
ER chg_pri(ID  tskid, PRI tskpri)
{
    T_TSKCB*    pTskcb;
	UW psr;
	
#ifndef NO_ERROR_CHECK    
    if((tskid < 0)       
    || ((g_ubIntNestCnt != 0) & (tskid == TSK_SELF)))
    {
        return E_ID;
    }
    
    if(tskid > TSK_NUM)
    {
        return E_NOEXS;
    }
    
    if((tskpri < 1) 
    || (tskpri > MAX_TSKPRI))
    {
        return E_PAR;
    }
#endif

	psr = ent_cri();
	
    if(tskid == TSK_SELF)
    {
        pTskcb = g_pCurTsk;
    } else  {
        pTskcb = &g_sTskcb[tskid-1];
    }
    
#ifndef NO_ERROR_CHECK    
    if(pTskcb->fpPC == 0)
    {
    	ret_cri(psr);
        return E_NOEXS;
    }

    if(pTskcb->ubStatus & TTS_DMT)
    {
    	ret_cri(psr);
        return E_OBJ;
    }
#endif
    
    pTskcb->bPriority = --tskpri;   // Internal Priority is 0 to MAX-1

    if(!(pTskcb->ubStatus & ~3))        // Is status TTS_RUN or TTS_RDY ? 
    {
        vfnDelAddMember((T_NODE*)&g_sReadyQueue[tskpri], (T_NODE*)pTskcb);
    int_dispatch();         // dispatch & disable interrupt
    }
    
    ret_cri(psr);
#ifndef NO_RETURN_VALUE
    return E_OK;
#endif
}
    
//********************************************************************
//  Rotate Ready Queue
//  [Parameters]
//      PRI tskpri  Task Priority
//  [Return Parameters]
//      ER  ercd    error code
//********************************************************************
rot_rdq(PRI tskpri)   
{
    T_NODE* pTmp;
	UW psr;
	
#ifndef NO_ERROR_CHECK    
    if((tskpri < 0) 
    || (tskpri > MAX_TSKPRI))
    {
        return E_PAR;
    }
#endif
	
	psr = ent_cri();
	
    if(tskpri == TPRI_RUN)
    {
        tskpri = g_pCurTsk->bPriority;
    } else {
        tskpri--;
    }
    
    pTmp = ((T_NODE*)&g_sReadyQueue[tskpri])->pNxt;
    vfnDelAddMember(((T_NODE*)&g_sReadyQueue[tskpri]), pTmp);
    
    int_dispatch();         // dispatch & disable interrupt
    
    ret_cri(psr);
#ifndef NO_RETURN_VALUE
    return E_OK;
#endif
}


//********************************************************************
//  Release Wait
//  [Parameters]
//      ID  tskid   Task ID
//  [Return Parameters]
//      ER  ercd    error code
//********************************************************************
ER rel_wai(ID tskid)
{
    T_TSKCB*    pTskcb;
	UW psr;
	
#ifndef NO_ERROR_CHECK    
    if(tskid <= 0)              // 0 is tskid = TSK_SELF 
    {
        return E_ID;
    }
    
    if(tskid > TSK_NUM)
    {
        return E_NOEXS;
    }
#endif

	psr = ent_cri();
	
    pTskcb = &g_sTskcb[tskid-1];

#ifndef NO_ERROR_CHECK    
    if(pTskcb->fpPC == 0)
    {
    	ret_cri(psr);
        return E_NOEXS;
    }

    if((pTskcb == g_pCurTsk) 
    || (pTskcb->ubStatus & TTS_DMT))
    {
    	ret_cri(psr);
        return E_OBJ;
    }
#endif

    if(!(pTskcb->ubStatus & ~3))        // Is status TTS_RUN or TTS_RDY ? 
    {
    	ret_cri(psr);
        return E_OBJ;
    }

    pTskcb->ubStatus &= ~TTS_WAI;
    pTskcb->ubWaitStat = 0;
    
    // set error code 
    if(pTskcb->ubIntinfo  == 0)          // interrupt information
    {
        ((T_SAVEDREG_MIN*)(pTskcb->uwSP))->returnvalue = E_RLWAI;  //GFD
    }

    /* 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
}


//********************************************************************
//  Get Task Identifier
//  [Parameters]
//      None
//  [Return Parameters]
//      ER  ercd    ErrorCode
//      ID  tskid   TaskIdentifier
//********************************************************************
ER  get_tid
    (
    ID  *p_tskid
    )
{
	UW psr;
	
	psr = ent_cri();
	
#ifndef NO_ERROR_CHECK    
    if(g_ubIntNestCnt)
    {
        *p_tskid = FALSE;
    }
#endif
    *p_tskid = g_pCurTsk - g_sTskcb;
    (*p_tskid)++;

	ret_cri(psr);
#ifndef NO_RETURN_VALUE
    return E_OK;
#endif
}

⌨️ 快捷键说明

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