📄 os_time.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 + -