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

📄 os_time.c

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

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

OS_TCB              *OSTCBTimeDly;                  /* 超时延时任务链表 */
uint16              OSTickCnt;                      /* 当前计数初值 */
uint16              OSTickThisCnt;                  /* 当前计数剩余值*/

/*********************************************************************************************************
** 函数名称: OS_TimeTickDel
** 功能描述: 将任务从延时队列中删除
** 输 入: 无
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:  
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OS_TimeTickDel(OS_TCB *Tcb)
{
    Tcb->OSTCBDly = 0;
    if (Tcb != OSTCBTimeDly)
    {
        if (Tcb->TcbPrev != NULL)
        {
            Tcb->TcbPrev->TcbNext = Tcb->TcbNext;
        }
        if (Tcb->TcbNext != NULL)
        {
            Tcb->TcbNext->TcbPrev = Tcb->TcbPrev;
        }
    }
    else
    {
        OSTCBTimeDly = Tcb->TcbNext;
    }
    Tcb->TcbPrev = NULL;
    Tcb->TcbNext = NULL;

    if (Tcb->OSTCBPrio < OSHighPrio)
    {
        OSHighPrio = Tcb->OSTCBPrio;
    }
    return OS_NO_ERR;
}

/*********************************************************************************************************
** 函数名称: OS_TimeTickAdd
** 功能描述: 将任务加入延时队列中
** 输 入: 无
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8  OS_TimeTickAdd(OS_TCB *Tcb)
{
    /* 加入延时队列中 */
    Tcb->TcbPrev = NULL;
    if (OSTCBTimeDly != NULL)
    {
        if (Tcb != OSTCBTimeDly)
        {
            Tcb->TcbNext = OSTCBTimeDly;
            OSTCBTimeDly->TcbPrev = Tcb;
            OSTCBTimeDly = Tcb;
        }
    }
    else
    {
        Tcb->TcbNext = NULL;
        Tcb->TcbPrev = NULL;
        OSTCBTimeDly = Tcb;
    }
    return OS_NO_ERR;
}

/*********************************************************************************************************
** 函数名称: OS_TimeTick
** 功能描述: 与OSTimeTick一样,不过不进行任务切换
** 输 入: 无
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8  OS_TimeTick(void)
{
    uint16 Min,ThisCnt;
    OS_TCB_PRIO *tcbp;
    OS_TCB *tcb,*NextTcb;
    
    tcb = OSTCBTimeDly;

    /* 减少任务的延时,同时收缩下次最小的执行间隔 */
    ThisCnt = OSTickThisCnt - OSTickCnt;
    Min = 0;
    Min--;
    while (tcb != NULL)
    {
        NextTcb = tcb->TcbNext;
       if ((tcb->OSTCBStat & OS_STAT_DLY) != 0)
        {
           if (tcb->OSTCBDly > ThisCnt )
            {
                tcb->OSTCBDly -= ThisCnt;
                if (Min > tcb->OSTCBDly)
                {
                    Min = tcb->OSTCBDly;
                }
            }
            else
            {
                tcb->OSTCBStat = 0;                /* 任务进入运行状态 */
                OS_TimeTickDel(tcb);               /* 从等待延时队列中删除 */
                _OS_TaskResume(tcb);               /* 加入优先级链表 */
            }
        }
        tcb = NextTcb;
    }
    
    OSFindNextRunningTask();
    
    /* 如果优先级未变,则看是否需要轮询  */
    tcbp = &(OSTCBPrioTbl[OSHighPrio]);
    if (OSTCBCur == OSTCBHighRdy)
    {
        if (tcbp->OSTCBDly > OSTickThisCnt)
        {
            tcbp->OSTCBDly -= OSTickThisCnt;
        }
        else
        {
            if (tcbp->OSTCBDly != 0)
            {
                tcbp->OSTCBDly = tcbp->OSTCBDlyReload;
                OSTCBHighRdy = tcbp->TcbNext->TcbNext;
                tcbp->TcbNext = OSTCBHighRdy;
            }
        }
        if (tcbp->OSTCBDly != 0)
        if (tcbp->OSTCBDly < Min)
        {
            Min = tcbp->OSTCBDly;
        }
    }
    /* 设置下次延时参数 */
    OSTickCnt = Min;
    OSTickThisCnt = Min;
    return OS_NO_ERR;
}

/*********************************************************************************************************
** 函数名称: OSTimeTick
** 功能描述: 系统时钟处理函数,处理各个任务的延时
** 输 入: 无
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
         uint8  OSTimeTick(void)
{  
	
    OS_ENTER_CRITICAL();
    if (OSTickCnt != 0)
    if (--OSTickCnt ==0)
    {  
        OS_TimeTick();
        if (OSIntNesting == 0)              /* 是否是中断中调用 */
        if (OSTCBCur != OSTCBHighRdy)
        {
                                            /* 进行任务调度 */
            OS_TASK_SW();
        }
    }
    OS_EXIT_CRITICAL();
    return OS_NO_ERR;
}

/*********************************************************************************************************
** 函数名称: OS_TimeDly
** 功能描述: 与OSTimeDly一样,不过不进行任务切换
** 输 入:  ticks : 等待超时时的系统嘀嗒数
** 输 出 : OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OS_TimeDly(uint16 Ticks)
{
    OS_TimeTick();
    OSTCBCur->OSTCBDly = Ticks;                 /* 设置超时时间         */
    OSTCBCur->OSTCBStat |= OS_STAT_DLY;         /* 任务进入等待延时状态     */

    _OS_TaskSuspend(OSTCBCur);                  /* 从优先级链表中删除 */
    OS_TimeTickAdd(OSTCBCur);                   /* 加到等待链表中 */
    if (OSTickThisCnt > Ticks)
    {
        OSTickThisCnt = Ticks;
        OSTickCnt = Ticks;
    }
    return OS_NO_ERR;
}

/*********************************************************************************************************
** 函数名称: OSTimeDly
** 功能描述: 系统等待函数,任务调用此函数可以等待一定时间
** 输 入:  ticks : 等待超时时的系统嘀嗒数
** 输 出 : OS_NO_ERR:成功
**          OS_ERR_PEND_ISR:在中断中延时
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSTimeDly(uint16 ticks)
{
    if (OSIntNesting != 0)
    {
        return OS_ERR_PEND_ISR;
    }
    if (ticks != 0)
    {
        OS_ENTER_CRITICAL();
        OS_TimeDly(ticks);
        OSSched();                                  /* 开始任务切换         */
        OS_EXIT_CRITICAL();
    }
    return OS_NO_ERR;
}

/*********************************************************************************************************
** 函数名称: OSTimeDlyResume
** 功能描述: 让处在延时期的任务结束延时
** 输 入:  TaskID : 任务ID
** 输 出 : OS_NO_ERR:成功
**          OS_TASKID_INVALID:目标任务不存在
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSTimeDlyResume(TASK_ID TaskID)
{
    OS_TCB *tcb;
    uint8 Rt;
    
    Rt = OS_TASKID_INVALID;
    if (TaskID < OS_MAX_TASKS)
    {
        tcb = &(OSTCBTbl[TaskID]);
        //Rt = OS_TASKID_INVALID;
        OS_ENTER_CRITICAL();
        if (tcb->OSTCBStat != OS_STAT_DEATH)
        {
            if ((tcb->OSTCBStat &  ~OS_STAT_SUSPEND) == OS_STAT_DLY)
            {
                tcb->OSTCBStat = 0;
                OS_TimeTickDel(tcb);                    /* 从等待延时队列中删除 */

                _OS_TaskResume(tcb);                    /* 加入优先级链表 */
                OSSched();                              /* 开始任务切换         */
            }
            Rt = OS_NO_ERR;
        }        
        OS_EXIT_CRITICAL();
    }
    return Rt;
}

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

⌨️ 快捷键说明

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