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