📄 noknl3s.c
字号:
B *stktop;
#endif
#if ERC
if (tskid == TSK_SELF)
return SYSER = E_OBJ;
else if (tskid > CFG.tskid_max)
return SYSER = E_ID;
#endif
dis_ims();
tcb = &TCB[tskid];
if (tcb->ctsk == NULL)
{ ret_ims2();
return E_NOEXS;
}
if (tcb->sts == S_DMT)
{ ctx = (T_CTX *)((B *)tcb->stk + tcb->ctsk->stksz) - 1;
sta_tsk_sub();
ctx->pc = tcb->ctsk->task;
tcb->sp = ctx;
tcb->wup = 0;
tcb->sus = 0;
tcb->sts = S_RDY;
return add_rdq_dispatch(tcb, tskid);
}
ret_ims2();
return E_OBJ;
}
#endif
#ifdef EXT_TSK
/************************************************/
/* Exit Task */
/************************************************/
void v3_ext_tsk(void)
{
T_TCB NEAR *tcb;
ID tskid;
#if ERC
if ((INEST)||(DDISP)||(RDQ[0] == (UB)(CFG.tskid_max+1)))
{ SYSER = E_CTX;
return;
}
#endif
dis_ims();
tskid = RDQ[0];
tcb = &TCB[tskid];
tcb->sts = S_DMT;
tcb->pri = (B)tcb->ctsk->itskpri;
del_que(tcb, tskid);
dispatch3();
}
#endif
#ifdef TER_TSK
/************************************************/
/* Terminate Task */
/************************************************/
ER v3_ter_tsk(ID tskid)
{
T_TCB NEAR *tcb;
INT sts;
#if ERC
if (tskid == TSK_SELF)
return SYSER = E_OBJ;
else if (tskid > CFG.tskid_max)
return SYSER = E_ID;
if (!INEST && RDQ[0] == (UB)tskid)
return SYSER = E_OBJ;
#endif
dis_ims();
tcb = &TCB[tskid];
if (tcb->ctsk == NULL)
{ ret_ims2();
return E_NOEXS;
}
sts = tcb->sts;
if (sts != S_DMT)
{ if (INEST && RDQ[0] == (UB)tskid)
DELAY = 1;
tcb->sts = S_DMT;
tcb->pri = (B)tcb->ctsk->itskpri;
if (sts & S_TMO)
del_tmq(tcb, tskid);
if ((sts == S_RDY && tcb->sus == 0)
|| (sts >= S_FLG)) /* S_FLG,S_SEM,S_MBX,.. */
return del_que_ret_ims(tcb, tskid);
else
return_ret_ims();
}
ret_ims2();
return E_OBJ;
}
#endif
#ifdef DIS_DSP
/************************************************/
/* Disable Dispatch */
/************************************************/
ER v3_dis_dsp(void)
{
dis_ims();
if (DDISP)
{
if (ref_sys_sub(IMASK))
{ ret_ims2();
return SYSER = E_CTX;
}
}
else
{
if ((INEST)||(RDQ[0] == (UB)(CFG.tskid_max+1)))
{ ret_ims2();
return SYSER = E_CTX;
}
DDISP = 1;
}
return_ret_ims();
}
#endif
#ifdef ENA_DSP
/************************************************/
/* Enable Dispatch */
/************************************************/
ER v3_ena_dsp(void)
{
dis_ims();
if (DDISP)
{
if ((INEST)||(RDQ[0] == (UB)(CFG.tskid_max+1))||ref_sys_sub(IMASK))
{ ret_ims2();
return SYSER = E_CTX;
}
DDISP = 0;
if (DELAY)
return dispatch2();
}
return_ret_ims();
}
#endif
#ifdef CHG_PRI
/************************************************/
/* Change Task Priority */
/************************************************/
ER v3_chg_pri(ID tskid, PRI tskpri)
{
T_TCB NEAR *tcb;
UB NEAR *que;
if (tskid == TSK_SELF)
{ tskid = RDQ[0];
#if ERC
if (tskpri > CFG.tpri_max)
return SYSER = E_PAR;
if (tskpri < 0)
return SYSER = E_PAR;
if (INEST || RDQ[0] == (UB)(CFG.tskid_max+1))
return SYSER = E_ID;
#endif
dis_ims();
tcb = &TCB[tskid];
if (tskpri == TPRI_INI)
tskpri = tcb->ctsk->itskpri;
L1:
if (tskpri >= NOWPRI)
{ tcb->pri = (B)tskpri;
chg_que((UB NEAR *)RDQ + tskpri, tcb, tskid);
return dispatch();
}
else
{ NOWPRI = (B)tskpri;
tcb->pri = (B)tskpri;
chg_que((UB NEAR *)RDQ + tskpri, tcb, tskid);
}
return_ret_ims();
}
#if ERC
if (tskid > CFG.tskid_max)
return SYSER = E_ID;
if (tskpri < 0)
return SYSER = E_PAR;
#endif
dis_ims();
tcb = &TCB[tskid];
if (tcb->ctsk == NULL)
{ ret_ims2();
return E_NOEXS;
}
if (tcb->sts == S_DMT)
{ ret_ims2();
return E_OBJ;
}
if (tskpri == TPRI_INI)
tskpri = tcb->ctsk->itskpri;
#if ERC
else if (tskpri > CFG.tpri_max)
{ ret_ims2();
return SYSER = E_PAR;
}
#endif
tcb->pri = (B)tskpri;
if (tcb->sts == S_RDY && tcb->sus == 0)
{ if (tskid == (ID)RDQ[0])
goto L1;
if ((tskpri < (PRI)NOWPRI) && (!DDISP))
{ return chg_que_dispatch1((UB NEAR *)RDQ + tskpri, tcb, tskid);
}
else
{ chg_que((UB NEAR *)RDQ + tskpri, tcb, tskid);
}
}
return_ret_ims();
}
#endif
#ifdef ROT_RDQ
/************************************************/
/* Rotate Ready Queue */
/************************************************/
ER v3_rot_rdq(PRI tskpri)
{
UB NEAR *rdq;
if (tskpri == TPRI_RUN)
{ dis_ims();
rdq = RDQ + NOWPRI;
if (*rdq != 0)
{ *rdq = TCB[*rdq].nid;
return dispatch();
}
return_ret_ims();
}
#if ERC
if (tskpri > CFG.tpri_max)
return SYSER = E_PAR;
if (tskpri < 0)
return SYSER = E_PAR;
#endif
rdq = RDQ + tskpri;
dis_ims();
if (*rdq != 0)
{ *rdq = TCB[*rdq].nid;
if (tskpri <= (PRI)NOWPRI)
return dispatch();
}
return_ret_ims();
}
#endif
#ifdef REL_WAI
/************************************************/
/* Release Wait */
/************************************************/
ER v3_rel_wai(ID tskid)
{
T_TCB NEAR *tcb;
INT sts;
#if ERC
if (tskid == TSK_SELF)
return SYSER = E_OBJ;
else if (tskid > CFG.tskid_max)
return SYSER = E_ID;
#endif
dis_ims();
tcb = &TCB[tskid];
if (tcb->ctsk == NULL)
{ ret_ims2();
return E_NOEXS;
}
sts = tcb->sts;
if (sts & S_TMO)
{ sts &= ~S_TMO;
del_tmq(tcb, tskid);
}
if (sts >= S_FLG) /* S_FLG,S_SEM,S_MBX,.. */
{ tcb->sts = S_RDY;
tcb->sp->ercd = E_RLWAI;
if (tcb->sus == 0)
return chg_rdq_dispatch(tcb, tskid);
else
return del_que_ret_ims(tcb, tskid);
}
if (sts >= S_SLP) /* S_SLP,S_DLY */
{ tcb->sts = S_RDY;
tcb->sp->ercd = E_RLWAI;
if (tcb->sus == 0)
return add_rdq_dispatch(tcb, tskid);
else
return_ret_ims();
}
ret_ims2();
return E_OBJ;
}
#endif
#ifdef GET_TID
/************************************************/
/* Get Task Identifier */
/************************************************/
ER v3_get_tid(ID *p_tskid)
{
if ((INEST)||(RDQ[0] == (UB)(CFG.tskid_max+1)))
*p_tskid = FALSE;
else
*p_tskid = RDQ[0];
return E_OK;
}
#endif
#ifdef VGET_TID
/************************************************/
/* Get Task Identifier Itself */
/************************************************/
ID v3_vget_tid(void)
{
return RDQ[0];
}
#endif
#ifdef REF_TSK
/************************************************/
/* Refer Task Status */
/************************************************/
ER v3_ref_tsk(T_RTSK *pk_rtsk, ID tskid)
{
T_TCB NEAR *tcb;
INT sts, sus;
const UH ttw[] =
{ TTW_SLP,TTW_DLY,TTW_RDV,TTW_FLG,TTW_SMBF,TTW_CAL,
TTW_ACP,TTW_SEM,TTW_MBX,TTW_MBF,TTW_MPL ,TTW_MPF,
};
if (tskid > CFG.tskid_max)
return E_ID;
dis_ims();
if (tskid == TSK_SELF)
{ tskid = RDQ[0];
tcb = &TCB[tskid];
}
else
{ tcb = &TCB[tskid];
if (tcb->ctsk == NULL)
{ ret_ims2();
return E_NOEXS;
}
}
pk_rtsk->exinf = tcb->ctsk->exinf;
pk_rtsk->tskatr = tcb->ctsk->tskatr;
pk_rtsk->task = tcb->ctsk->task;
pk_rtsk->itskpri = tcb->ctsk->itskpri;
pk_rtsk->stksz = tcb->ctsk->stksz;
pk_rtsk->tskpri = tcb->pri;
sts = (INT)(tcb->sts & 0xf0);
if (sts == S_DMT)
{ ret_ims2();
pk_rtsk->tskstat = TTS_DMT;
pk_rtsk->wupcnt = 0;
pk_rtsk->suscnt = 0;
pk_rtsk->tskwait = 0;
pk_rtsk->wid = 0;
return E_OK;
}
pk_rtsk->wupcnt = (UB)tcb->wup;
if (sts == S_RDY)
{ if (tskid == (ID)RDQ[0])
{ ret_ims2();
pk_rtsk->suscnt = 0;
pk_rtsk->tskstat = TTS_RUN;
}
else
{ sus = tcb->sus;
ret_ims2();
pk_rtsk->suscnt = sus;
if (sus == 0)
pk_rtsk->tskstat = TTS_RDY;
else
pk_rtsk->tskstat = TTS_SUS;
}
pk_rtsk->tskwait = 0;
pk_rtsk->wid = 0;
return E_OK;
}
if (sts <= S_DLY)
pk_rtsk->wid = 0;
else
pk_rtsk->wid = 1; /* not support */
sus = tcb->sus;
ret_ims2();
pk_rtsk->suscnt = sus;
if (sus == 0)
pk_rtsk->tskstat = TTS_WAI;
else
pk_rtsk->tskstat = TTS_WAS;
pk_rtsk->tskwait = ttw[(sts - S_SLP) >> 4];
return E_OK;
}
#endif
#ifdef SUS_TSK
/************************************************/
/* Suspend Task */
/************************************************/
ER v3_sus_tsk(ID tskid)
{
T_TCB NEAR *tcb;
B sus;
INT sts;
#if ERC
if (tskid == TSK_SELF)
return SYSER = E_OBJ;
else if (tskid > CFG.tskid_max)
return SYSER = E_ID;
if (!INEST && RDQ[0] == (UB)tskid)
return SYSER = E_OBJ;
#endif
dis_ims();
tcb = &TCB[tskid];
if (tcb->ctsk == NULL)
{ ret_ims2();
return E_NOEXS;
}
sts = tcb->sts;
if (sts != S_DMT)
{ sus = ++tcb->sus;
if (sus != (B)(SUSCNT_MAX+1))
{ if (sus == 1 && (sts == S_RDY))
{ if (INEST && RDQ[0] == (UB)tskid)
DELAY = 1;
return del_que_ret_ims(tcb, tskid);
}
return_ret_ims();
}
tcb->sus = (B)SUSCNT_MAX;
ret_ims2();
return E_QOVR;
}
ret_ims2();
return E_OBJ;
}
#endif
#ifdef RSM_TSK
/************************************************/
/* Resume Task */
/************************************************/
ER v3_rsm_tsk(ID tskid)
{
T_TCB NEAR *tcb;
B sus;
INT sts;
#if ERC
if (tskid == TSK_SELF)
return SYSER = E_OBJ;
else if (tskid > CFG.tskid_max)
return SYSER = E_ID;
#endif
dis_ims();
tcb = &TCB[tskid];
if (tcb->ctsk == NULL)
{ ret_ims2();
return E_NOEXS;
}
sts = tcb->sts;
if (sts != S_DMT)
{ sus = --tcb->sus;
if (sus != (B)-1)
{ if (sus == 0 && (sts == S_RDY))
return add_rdq_dispatch(tcb, tskid);
else
return_ret_ims();
}
tcb->sus = 0;
ret_ims2();
return E_OBJ;
}
ret_ims2();
return E_OBJ;
}
#endif
#ifdef FRSM_TSK
/************************************************/
/* Force Resume Task */
/************************************************/
ER v3_frsm_tsk(ID tskid)
{
T_TCB NEAR *tcb;
INT sts;
#if ERC
if (tskid == TSK_SELF)
return SYSER = E_OBJ;
else if (tskid > CFG.tskid_max)
return SYSER = E_ID;
#endif
dis_ims();
tcb = &TCB[tskid];
if (tcb->ctsk == NULL)
{ ret_ims2();
return E_NOEXS;
}
sts = tcb->sts;
if ((sts != S_DMT) && (tcb->sus != 0))
{ tcb->sus = 0;
if (sts == S_RDY)
return add_rdq_dispatch(tcb, tskid);
else
return_ret_ims();
}
ret_ims2();
return E_OBJ;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -