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

📄 os_task.c

📁 SmallRTOSAVR.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
                }
                else
                {
                    _OS_TaskResume(Tcb);
                    OSSched();
                    Rt = OS_NO_ERR;
                }
            }
        }
    }
    OS_EXIT_CRITICAL_TWO;
    return Rt;
}

/*********************************************************************************************************
** 函数名称: OSTaskDel
** 功能描述: 删除任务
** 输 入: TaskID:任务ID
** 输 出: OS_NO_ERR:成功
**         OS_TASKID_INVALID:错误的任务ID
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSTaskDel(TASK_ID TaskID)
{
    OS_TCB *Tcb;
    uint8 Rt;
    
    if (OSIntNesting > 0) 
    {
        return (OS_TASK_DEL_ISR);
    }

    Tcb = NULL;
    if (TaskID == OS_ID_SELF)
    {
        Tcb = OSTCBCur;
    }
    if (TaskID < OS_MAX_TASKS)
    {
        Tcb = &(OSTCBTbl[TaskID]);
    }
    Rt = OS_TASKID_INVALID;
    if (Tcb != NULL)
    {
        OS_ENTER_CRITICAL();
        //Rt = OS_TASKID_INVALID;
        if (Tcb->OSTCBStat != OS_STAT_DEATH)
        {
#if EN_OS_MSG > 0
            /* 在消息链表中删除此任务  */            
            OSMsgDel(TaskID);
            OSMsgFlush(TaskID);
#endif
            if ((Tcb->OSTCBStat & OS_STAT_DLY) != 0)
            {
                OS_TimeTickDel(Tcb);
            }
#if OS_MAX_EVENTS > 0
            /* 在等待事件链表中删除此任务  */
            if (Tcb->EventPrev != NULL)
            {
                Tcb->EventPrev->EventNext = Tcb->EventNext;
            }
            if (Tcb->EventNext != NULL)
            {
                Tcb->EventNext->EventPrev = Tcb->EventPrev;
            }
            Tcb->EventPrev = NULL;
            Tcb->EventNext = NULL;
#endif
            
            /* 在任务链表中删除此任务  */
            if (Tcb->TcbPrev != NULL)
            {
                Tcb->TcbPrev->TcbNext = Tcb->TcbNext;
            }
            if (Tcb->TcbNext != NULL)
            {
                Tcb->TcbNext->TcbPrev = Tcb->TcbPrev;
            }
            /* 加到空闲任务控制块链表中 */
            Tcb->TcbPrev = NULL;
            Tcb->TcbNext = NULL;

            Tcb->OSTCBStat = OS_STAT_DEATH;
            OSSched();
            Rt = OS_NO_ERR;
        }
        OS_EXIT_CRITICAL();
    }
    return Rt;
}

/*********************************************************************************************************
** 函数名称: OSTaskResume
** 功能描述: 恢复任务
** 输 入: TaskID : 任务ID
** 输 出: OS_NO_ERR:成功
**         OS_TASKID_INVALID:目标任务不存在
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSTaskResume(TASK_ID TaskID)
{
    uint8 Rt;

    OS_ENTER_CRITICAL();
    Rt = OS_TaskResume(TaskID);
    OSSched();                                              //开始任务切换
    OS_EXIT_CRITICAL();
    return Rt;
}

/*********************************************************************************************************
** 函数名称: OSTaskSuspend
** 功能描述: 使指定任务休眠
** 输 入: TaskID : 任务ID
** 输 出: OS_NO_ERR:成功
**         OS_TASKID_INVALID:错误的任务ID
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSTaskSuspend(TASK_ID TaskID)
{
    OS_TCB *Tcb;
    uint8 Rt;
    
    /* 获取任务TCB */
    Tcb = NULL;
    if (TaskID == OS_ID_SELF)
    {
        Tcb = OSTCBCur;
    }
    if (TaskID < OS_MAX_TASKS)
    {
        Tcb = &(OSTCBTbl[TaskID]);
    }
    Rt = OS_TASKID_INVALID;
    if (Tcb != NULL)                            /* 任务TCB有效 */
    {
        OS_ENTER_CRITICAL();
        if (Tcb->OSTCBStat != OS_STAT_DEATH)    /* 任务存在 */
        {
            if ((Tcb->OSTCBStat & OS_STAT_SUSPEND) == 0)
            {
                Tcb->OSTCBStat |= OS_STAT_SUSPEND;
                _OS_TaskSuspend(Tcb);
                OSSched();
            }
            Rt = OS_NO_ERR;
        }
        OS_EXIT_CRITICAL();
    }
    return Rt;
}
/*********************************************************************************************************
** 函数名称: OSTaskChangePrio
** 功能描述: 改变任务优先级
** 输 入: TaskID : 任务ID
** 输 出: OS_NO_ERR:成功
**         OS_TASKID_INVALID:错误的任务ID
**         OS_PRIO_INVALID:错误的任务优先级
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSTaskChangePrio(TASK_ID TaskID, uint8 NewPrio)
{
    OS_TCB *Tcb;
    uint8 Rt;
    
    if (NewPrio < OS_LOWEST_PRIO)           /* 新优先级有效 */
    {
        /* 获取任务TCB */
        Tcb = NULL;
        if (TaskID == OS_ID_SELF)
        {
            Tcb = OSTCBCur;
        }
        if (TaskID < OS_MAX_TASKS)
        {
            Tcb = &(OSTCBTbl[TaskID]);
        }
        Rt = OS_TASKID_INVALID;
        if (Tcb != NULL)                    /* TCB有效 */
        {
            OS_ENTER_CRITICAL();
            if (Tcb->OSTCBStat != OS_STAT_DEATH)    /* 任务存在 */
            if (Tcb->OSTCBPrio != NewPrio)
            {
                Tcb->OSTCBPrio = NewPrio;
                if (Tcb->OSTCBStat == 0)    /* 任务处于就绪状态 */    
                {
                    _OS_TaskSuspend(Tcb);
                    _OS_TaskResume(Tcb);
                    OSSched();
                }
                Rt = OS_NO_ERR;
            }
            OS_EXIT_CRITICAL();
        }
    }
    else
    {
        Rt = OS_PRIO_INVALID;
    }
    
    return Rt;
}


/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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