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

📄 os_task.c

📁 SmallRTOSAVR.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************************************************
**                                        Small RTOS
**                                   The Real-Time Kernel
**                           (c) Copyright 2002-2003, chenmingji
**                                     All Rights Reserved
**                                         V1.50.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: OS_Task.c
**创   建   人: 陈明计
**最后修改日期: 2005年6月10日
**描        述: Small RTOS任务处理代码
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版  本: V1.00
** 日 期: 2005年6月10日
** 描 述: 基本完成全新的Small RTOS核
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版  本:
** 日 期:     
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 焦进星
** 日 期: 2007年12月30日
** 描 述: 移植到AVR系列芯片,适用于atmega16/32等
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

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

uint8 CRITICALNUM=0;
/*********************************************************************************************************
** 函数名称: _OS_TaskResume
** 功能描述: 将指定任务加入优先级链表
** 输 入: Tcb : 任务控制块指针
** 输 出: 无
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        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;
    }
	if (Tcb->OSTCBPrio < OSHighPrio)            /* 调整OSHighPrio,用于加速任务切换 */
	{
		OSHighPrio = Tcb->OSTCBPrio;
    }
    return OS_NO_ERR;
}

/*********************************************************************************************************
** 函数名称: OS_TaskResume
** 功能描述: 恢复任务,但不进行任务切换
** 输 入: TaskID : 任务ID
** 输 出: OS_NO_ERR:成功
**         OS_TASKID_INVALID:目标任务不存在
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
         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)
    {
        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;
        }
    }
    return Rt;
}

/*********************************************************************************************************
** 函数名称: _OS_TaskSuspend
** 功能描述: 将指定任务从优先级链表中删除
** 输 入: Tcb : 任务控制块指针
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
         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
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSTaskCreate(void   (*Task)(void *Pd),
                           void    *Pdata,
                           OS_STK  *Ptos,
                           uint8    Prio,
                           TASK_ID  TaskId,
                           uint32   StkSize,
                           int      PSR,
                           uint8    TaskStat)
{
    OS_STK *Psp;
    OS_TCB *Tcb;
    uint8 Rt;
    
    StkSize = StkSize;
    OS_ENTER_CRITICAL_TWO;
    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_PRIO_INVALID;
            }
            else
            {
                Psp = (OS_STK *)OSTaskStkInit(Task, Pdata, Ptos, PSR);  /* 初始化堆栈 */
                /* 初始化TCB */
                Tcb->OSTCBStat = 0;
                Tcb->OSTCBStkPtr = Psp;
                Tcb->OSTCBInfo = OS_INFO_MSG_SENGED;
                Tcb->OSTCBDly = 0;
                Tcb->OSTCBPrio = Prio;
                Tcb->TcbNext = NULL;
                Tcb->TcbPrev = NULL;

#if OS_MAX_EVENTS > 0
                Tcb->EventNext = NULL;
                Tcb->EventPrev = NULL;
#endif


#if EN_OS_MSG > 0
                Tcb->Msg = NULL;
                Tcb->MsgHard = NULL;
                Tcb->MsgEnd = NULL;
                Tcb->MsgNext = NULL;
#endif
                if (TaskStat != 0)
                {
                    Tcb->OSTCBStat = OS_STAT_SUSPEND;

⌨️ 快捷键说明

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