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

📄 timemng.c

📁 最近在國外網站抓到的作業系統 以Arm為基礎去開發的
💻 C
字号:
//*************************************************************************
//
//  Copyright (C) SEIKO EPSON CORP. 1997
//  All Rights Reserved
//
//  Filename : timemng.c
//  Function : Time Management Functions
//  Revision :
//          1997/08/01  H.Matsuoka  start
//          1999/08/26  H.Matsuoka  Add message buffer function, bug fix
//          1999/11/26  H.Matsuoka  Change sys_clk (register save)
//          2000/02/23  H.Matsuoka  Fix suspend status problem
//          2000/11/30  Y.Taka      Add Enter/Return_critical_section
//          2001/02/15  Y.Taka      Add def_cyc, act_cyc, def_alm
//          2001/03/08  Y.Taka      Change critical section
//
//*************************************************************************
#include "Ros33.h"
#include "internal.h"

//****************************************************************************
//***    3.7 Time Management Functions                                     ***
//****************************************************************************

//********************************************************************
//  Set System Clock
//  [Parameters]
//      SYSTIME *pk_tim PacketAddressRepresentingCurrentTime
//      -(pk_tim members)-
//      SYSTIME systim  CurrentSystemTime
//  [Return Parameters]
//      ER      ercd    ErrorCode
//********************************************************************
ER  set_tim( SYSTIME *pk_tim )
{
	UW psr;
#if 0
#ifndef NO_ERROR_CHECK    
    if(pk_tim < 0)
    {
        return E_PAR;
    }
    if(pk_tim->utime < 0)
        return E_PAR;
#endif
#endif

	psr = ent_cri();
	
    g_sSysTime.utime = pk_tim->utime;
    g_sSysTime.ltime = pk_tim->ltime;
    
    ret_cri(psr);
#ifndef NO_RETURN_VALUE
    return E_OK;
#endif
}

//********************************************************************
//  Get System Clock
//  [Parameters]
//      SYSTIME *pk_tim Packet address representing current time
//  [Return Parameters]
//      ER      ercd    ErrorCode
//      -(pk_tim members)-
//      SYSTIME systim  CurrentSystemTime
//********************************************************************
ER  get_tim
    (
    SYSTIME *pk_tim
    )
{
	UW psr;
#if 0
#ifndef NO_ERROR_CHECK
    if(pk_tim < 0)
    {
        return E_PAR;
    }
#endif
#endif

	psr = ent_cri();
	
    pk_tim->utime = g_sSysTime.utime;
    pk_tim->ltime = g_sSysTime.ltime;
    
    ret_cri(psr);
#ifndef NO_RETURN_VALUE
    return E_OK;
#endif
}

//********************************************************************
//  Delay Task
//  [Parameters]
//      DLYTIME dlytim  DelayTime
//  [Return Parameters]
//      ER      ercd    ErrorCode
//********************************************************************
ER dly_tsk 
    ( 
    DLYTIME dlytim 
    )
{
    T_TSKCB*    pTskcb;
	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(dlytim <= 0)
    {
        return E_PAR;
    }
#endif

	psr = ent_cri();
	
    g_pCurTsk->utime = g_sSysTime.utime;
    if (g_sSysTime.ltime > g_sSysTime.ltime + dlytim)
        g_pCurTsk->utime += 1;
    g_pCurTsk->ltime = g_sSysTime.ltime + dlytim;


    g_pCurTsk->ubStatus |= TTS_WAI;  
    g_pCurTsk->ubWaitStat |= TTW_DLY;

    vfnDelInitMember((T_NODE*)g_pCurTsk);

    vfnAddTimer((T_NODE*)&(g_pCurTsk->pNxtTmoTsk));

    int_dispatch();            // dispatch & disable interruot
    
    ret_cri(psr);
    MOV_R1TOR0;		// mov r1(from the returnvalue in the stack) to ro (in asm)	
    
#ifndef NO_RETURN_VALUE
    return;
#endif
}   

//********************************************************************
//  Define Cyclic Handler
//  [Parameters]
//      HNO     cycno      Cyclic Handler number
//      FP      cychndr    Cyclic Handler start address
//      UINT    cycact     Cyclic Handler Activation
//      SYSTIME *pk_cyctim Packet Address Representing CyclicTime
//  [Return Parameters]
//      ER      ercd    ErrorCode
//********************************************************************
ER  def_cyc
    (
    HNO     cycno,
    FP      cychndr,
    UINT    cycact,
    SYSTIME *pk_cyctim
    )
{
    T_HNDRCB*  pCycHndrcb;
	UW psr;
	
#ifndef NO_ERROR_CHECK    
    if(cycno <= 0)                 // cycno illegal check
    {
        return E_PAR;
    }
    if(cycno > CYCHNDR_NUM)         // cycno max check
    {
        return E_PAR;
    }
#endif

	psr = ent_cri();
	
    if((int)pk_cyctim == NADR)              // packet is no address check
    {
        pCycHndrcb = &g_sCycHndrcb[cycno-1];

        pCycHndrcb->ubHndrStat = 0;         // reset Handler Status

        //  DelInit member to TimeHndr list
        vfnDelInitMember((T_NODE*)&(pCycHndrcb->pNxtTimeHndr));

		ret_cri(psr);
        return E_OK;
    }

#ifndef NO_ERROR_CHECK    
    if(pk_cyctim->utime == 0)               // cyctime illegal check
    {
        if(pk_cyctim->ltime == 0)
        {
        	ret_cri(psr);
            return E_PAR;
        }
    }

    if(cycact > 1)                          // cycact illegal check
    {
    	ret_cri(psr);
        return E_PAR;
    }
#endif

    pCycHndrcb = &g_sCycHndrcb[cycno-1];

    pCycHndrcb->fpPC = cychndr;    // set Cyclic Handler start address
    pCycHndrcb->cycact = cycact;   // set Cyclic Handler Activation
    pCycHndrcb->Iniutime = pk_cyctim->utime;  // set CyclicTime
    pCycHndrcb->Iniltime = pk_cyctim->ltime;
    pCycHndrcb->ubHndrStat = HNDR_CYC;         // set Handler Status

    //  DelInit member to TimeHndr list
    vfnDelInitMember((T_NODE*)&(pCycHndrcb->pNxtTimeHndr));

    // set utime, ltime 
    pCycHndrcb->utime = g_sSysTime.utime + pk_cyctim->utime;
    if(g_sSysTime.ltime > g_sSysTime.ltime + pk_cyctim->ltime)
        pCycHndrcb->utime += 1;
    pCycHndrcb->ltime = g_sSysTime.ltime + pk_cyctim->ltime;

    //  Add member to TimeHndr list
    vfnAddTimeHndr((T_NODE*)&(pCycHndrcb->pNxtTimeHndr));

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

//********************************************************************
//  Activate Cyclic Handler
//  [Parameters]
//      HNO     cycno      Cyclic Handler number
//      UINT    cycact     Cyclic Handler Activation
//  [Return Parameters]
//      ER      ercd    ErrorCode
//********************************************************************
ER  act_cyc
    (
    HNO     cycno,
    UINT    cycact
    )
{
    T_HNDRCB*  pCycHndrcb;
	UW psr;
	
#ifndef NO_ERROR_CHECK    
    if(cycno <= 0)                 // cycno illegal check
    {
        return E_PAR;
    }
    if(cycno > CYCHNDR_NUM)        // cycno max check
    {
        return E_PAR;
    }
    if(cycact > 3)                // cycact illegal check
    {
        return E_PAR;
    }
#endif

	psr = ent_cri();
	
    pCycHndrcb = &g_sCycHndrcb[cycno-1];

#ifndef NO_ERROR_CHECK    
    if(pCycHndrcb->ubHndrStat != HNDR_CYC)     // cycno object check
    {
    	ret_cri(psr);
        return E_NOEXS;
    }
#endif

    if(cycact & TCY_INI)
    {
        //  DelInit member to TimeHndr list
        vfnDelInitMember((T_NODE*)&(pCycHndrcb->pNxtTimeHndr));

        // set utime, ltime 
        pCycHndrcb->utime = g_sSysTime.utime + pCycHndrcb->Iniutime;
        if(g_sSysTime.ltime > g_sSysTime.ltime + pCycHndrcb->Iniltime)
            pCycHndrcb->utime += 1;
        pCycHndrcb->ltime = g_sSysTime.ltime + pCycHndrcb->Iniltime;

        //  Add member to TimeHndr list
        vfnAddTimeHndr((T_NODE*)&(pCycHndrcb->pNxtTimeHndr));

    }
    pCycHndrcb->cycact = (cycact & ~TCY_INI); // set Cyclic Handler Activation

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

//********************************************************************
//  Define Alarm Handler
//  [Parameters]
//      HNO     almno      Alarm Handler number
//      FP      almhndr    Alarm Handler start address
//      UINT    tmmode     Alarm Handler Time mode
//      SYSTIME *pk_cyctim Packet Address Representing AlarmTime
//  [Return Parameters]
//      ER      ercd    ErrorCode
//********************************************************************
ER  def_alm
    (
    HNO     almno,
    FP      almhndr,
    UINT    tmmode,
    SYSTIME *pk_almtim
    )
{
    T_HNDRCB*  pAlmHndrcb;
	UW psr;
	
#ifndef NO_ERROR_CHECK    
    if(almno <= 0)
    {
        return E_PAR;
    }
    if(almno > ALMHNDR_NUM)
    {
        return E_PAR;
    }
#endif
	
	psr = ent_cri();
	
    if((int)pk_almtim == NADR)             // packet is no address check
    {
        pAlmHndrcb = &g_sAlmHndrcb[almno-1];

        pAlmHndrcb->ubHndrStat = 0;        // reset Handler Status

        //  DelInit member to TimeHndr list
        vfnDelInitMember((T_NODE*)&(pAlmHndrcb->pNxtTimeHndr));
		ret_cri(psr);
        return E_OK;
    }

#ifndef NO_ERROR_CHECK    
    if(tmmode > 1)                         // tmmode illegal check
    {
    	ret_cri(psr);
        return E_PAR;
    }
    if((tmmode == TTM_ABS) 
      && ((pk_almtim->utime < g_sSysTime.utime)
        || ((pk_almtim->utime == g_sSysTime.utime)
           && (pk_almtim->ltime < g_sSysTime.ltime))))
    {
    	ret_cri(psr);
        return E_PAR;
    }
    if((tmmode == TTM_REL) && (pk_almtim->utime < 0))
    {
    	ret_cri(psr);
        return E_PAR;
    }
#endif

    pAlmHndrcb = &g_sAlmHndrcb[almno-1];

    pAlmHndrcb->fpPC = almhndr;                // set Handler PC address
    pAlmHndrcb->tmmode = tmmode;               // set alarm time mode
    pAlmHndrcb->Iniutime = pk_almtim->utime;   // set alarm init time
    pAlmHndrcb->Iniltime = pk_almtim->ltime;
    pAlmHndrcb->ubHndrStat = HNDR_ALM;         // set Handler Status

    //  DelInit member to TimeHndr list
    vfnDelInitMember((T_NODE*)&(pAlmHndrcb->pNxtTimeHndr));

    // set utime, ltime 
    if(tmmode == TTM_ABS)
    {
        pAlmHndrcb->utime = pk_almtim->utime;
        pAlmHndrcb->ltime = pk_almtim->ltime;
    }
    else{
        pAlmHndrcb->utime = g_sSysTime.utime + pk_almtim->utime;
        if(g_sSysTime.ltime > g_sSysTime.ltime + pk_almtim->ltime)
            pAlmHndrcb->utime += 1;
        pAlmHndrcb->ltime = g_sSysTime.ltime + pk_almtim->ltime;
    }

    //  Add member to TimeHndr list
    vfnAddTimeHndr((T_NODE*)&(pAlmHndrcb->pNxtTimeHndr));

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

⌨️ 快捷键说明

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