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

📄 os_task.c

📁 Small RTOS v1.50.0在32位CPU上可以说支持无限的任务(仅受内存限制)
💻 C
字号:
/*********************************************************************************************************
**                                        Small RTOS
**                                   The Real-Time Kernel
**                           (c) Copyright 2002-2003, chenmingji
**                                     All Rights Reserved
**                                         V1.50.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: OS_Task.C
**创   建   人: 陈明计
**最后修改日期: 2004年9月5日
**描        述: Small RTOS任务处理代码
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版  本: V1.00
** 日 期: 2004年9月5日
** 描 述: 基本完成全新的Small RTOS核
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#define  IN_OS_TASK
#define  IN_OS
#include "config.h"

/*********************************************************************************************************
** 函数名称: _OS_TaskResume
** 功能描述: 将指定任务加入优先级链表
** 输 入: Tcb : 任务控制块指针
** 输 出: 无
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 _OS_TaskResume(OS_TCB *Tcb)
{
    uint8 Prio;
    OS_TCB_PRIO *Ptcb;
    
    Tcb->OSTCBStat &= ~OS_STAT_SUSPEND;         /* 处于就绪状态 */
    Prio = Tcb->OSTCBPrio;
    Ptcb = &(OSTCBPrioTbl[Prio]);
    /* 插入优先级链表 */
    Tcb->TcbPrev = NULL;
    if (Ptcb->TcbNext != NULL)
    {
        Tcb->TcbNext = Ptcb->TcbNext;
        Tcb->TcbPrev = Ptcb->TcbNext->TcbPrev;
        Tcb->TcbPrev->TcbNext = Tcb;
        Tcb->TcbNext->TcbPrev = Tcb;
    }
    else
    {
        Tcb->TcbNext = Tcb;
        Tcb->TcbPrev = Tcb;
    }
    Ptcb->TcbNext = Tcb->TcbNext;
	if (Tcb->OSTCBPrio < OSHighPrio)            /* 调整OSHighPrio,用于加速任务切换 */
	{
		OSHighPrio = Tcb->OSTCBPrio;
    }
    return OS_NO_ERR;
}

/*********************************************************************************************************
** 函数名称: OS_TaskResume
** 功能描述: 恢复任务,但不进行任务切换
** 输 入: TaskID : 任务ID
** 输 出: OS_NO_ERR:成功
**         OS_TASKID_INVALID:目标任务不存在
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
         uint8 OS_TaskResume(TASK_ID TaskID)
{
    uint8 Rt;
    OS_TCB *Tcb;
    
    /* 获取任务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)
    {
        OS_ENTER_CRITICAL();
        if (Tcb->OSTCBStat != OS_STAT_DEATH)                /* 任务存在 */
        {
            if ((Tcb->OSTCBStat & OS_STAT_SUSPEND) != 0)
            {
                Tcb->OSTCBStat &= ~OS_STAT_SUSPEND;
                _OS_TaskResume(Tcb);
            }
            Rt = OS_NO_ERR;
        }
        OS_EXIT_CRITICAL();
    }
    return Rt;
}

/*********************************************************************************************************
** 函数名称: _OS_TaskSuspend
** 功能描述: 将指定任务从优先级链表中删除
** 输 入: Tcb : 任务控制块指针
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
         uint8 _OS_TaskSuspend(OS_TCB *Tcb)
{
    uint8 Prio;
    OS_TCB_PRIO *Ptcb;

    Prio = Tcb->OSTCBPrio;
    Ptcb = &(OSTCBPrioTbl[Prio]);
    if (Ptcb->TcbNext != NULL)
    {
	    if (Ptcb->TcbNext == Tcb)
	    {
	        Ptcb->TcbNext = Tcb->TcbNext;
	        if (Ptcb->TcbNext == Tcb)
	        {
	            Ptcb->TcbNext = NULL;
	        }
	    }
        Tcb->OSTCBStat |= OS_STAT_SUSPEND;
        Tcb->TcbNext->TcbPrev = Tcb->TcbPrev;
        Tcb->TcbPrev->TcbNext = Tcb->TcbNext;
    }
    return OS_NO_ERR;
}

/*********************************************************************************************************
** 函数名称: OSTaskCreate
** 功能描述: 创建任务
** 输 入: Task:任务开始地址
**         Pdata:任务参数
**         Ptos:堆栈地址
**         Prio:任务优先级
**         TaskId:任务ID
**         StkSize:堆栈尺寸
**         PSR:附加参数,与移植相关
** 输 出: OS_NO_ERR:成功
**         OS_TASKID_INVALID:错误的任务ID
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSTaskCreate(void   (*Task)(void *Pd),
                           void    *Pdata,
                           OS_STK  *Ptos,
                           uint8    Prio,
                           TASK_ID  TaskId,
                           uint32   StkSize,
                           int      PSR)
{
    OS_STK *Psp;
    OS_TCB *Tcb;
    uint8 Rt;
    
    StkSize = StkSize;
    OS_ENTER_CRITICAL();
    Rt = OS_TASKID_INVALID;
    if (TaskId < OS_MAX_TASKS)                  /* ID有效       */
    {
        Tcb = &(OSTCBTbl[TaskId]);
        if (Tcb->OSTCBStat == OS_STAT_DEATH)    /* 此ID还未使用 */
        {
            if (Prio >= OS_LOWEST_PRIO)         /* 优先级无效   */
            {
                Rt = OS_TASKID_INVALID;
            }
            else
            {
                Psp = (OS_STK *)OSTaskStkInit(Task, Pdata, Ptos, PSR);  /* 初始化堆栈 */
                /* 初始化TCB */
                Tcb->OSTCBStkPtr = Psp;
                Tcb->OSTCBStat = 0;
                Tcb->OSTCBInfo = OS_INFO_MSG_SENGED;
                Tcb->OSTCBPrio = Prio;
#if EN_OS_MSG > 0
                Tcb->Msg = NULL;
                Tcb->MsgHard = NULL;
                Tcb->MsgEnd = NULL;
                Tcb->MsgNext = NULL;
#endif
                _OS_TaskResume(Tcb);
                Rt = OS_NO_ERR;
//            OSTCBInitHook(Tcb);
                OSSched();
            }
        }
    }
    OS_EXIT_CRITICAL();
    return Rt;
}

/*********************************************************************************************************
** 函数名称: OSTaskDel
** 功能描述: 删除任务
** 输 入: TaskID:任务ID
** 输 出: OS_NO_ERR:成功
**         OS_TASKID_INVALID:错误的任务ID
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        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 (Tcb->EventPrev != NULL)
            {
                Tcb->EventPrev->EventNext = Tcb->EventNext;
            }
            if (Tcb->EventNext != NULL)
            {
                Tcb->EventNext->EventPrev = Tcb->EventPrev;
            }
            Tcb->EventPrev = NULL;
            Tcb->EventNext = NULL;
            
            /* 在任务链表中删除此任务  */
            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:目标任务不存在
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSTaskResume(TASK_ID TaskID)
{
    uint8 Rt;
    Rt = OS_TaskResume(TaskID);
    OSSched();                                              //开始任务切换
    return Rt;
}

/*********************************************************************************************************
** 函数名称: OSTaskSuspend
** 功能描述: 使指定任务休眠
** 输 入: TaskID : 任务ID
** 输 出: OS_NO_ERR:成功
**         OS_TASKID_INVALID:错误的任务ID
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        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:错误的任务优先级
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        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->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 + -