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

📄 noknl3s.c

📁 NORTi3 is a realtime multitasking operating system conforming to the micro-ITRON 3.0 specification.
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -