📄 timemng.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 + -