?? os_time.c
字號:
/*********************************************************************************************************
** Small RTOS
** The Real-Time Kernel
** (c) Copyright 2002-2003, chenmingji
** All Rights Reserved
** V1.50.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: OS_time.c
**創(chuàng) 建 人: 陳明計
**最后修改日期: 2005年6月10日
**描 述: Small RTOS時間服務處理程序
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創(chuàng)建人: 陳明計
** 版 本: 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; /* 當前計數(shù)初值 */
uint16 OSTickThisCnt; /* 當前計數(shù)剩余值*/
/*********************************************************************************************************
** 函數(shù)名稱: 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;
}
/*********************************************************************************************************
** 函數(shù)名稱: 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;
}
/*********************************************************************************************************
** 函數(shù)名稱: 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;
/* 減少任務的延時,同時收縮下次最小的執(zhí)行間隔 */
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; /* 任務進入運行狀態(tài) */
OS_TimeTickDel(tcb); /* 從等待延時隊列中刪除 */
_OS_TaskResume(tcb); /* 加入優(yōu)先級鏈表 */
}
}
tcb = NextTcb;
}
OSFindNextRunningTask();
/* 如果優(yōu)先級未變,則看是否需要輪詢 */
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;
}
}
/* 設置下次延時參數(shù) */
OSTickCnt = Min;
OSTickThisCnt = Min;
return OS_NO_ERR;
}
/*********************************************************************************************************
** 函數(shù)名稱: OSTimeTick
** 功能描述: 系統(tǒng)時鐘處理函數(shù),處理各個任務的延時
** 輸 入: 無
** 輸 出: OS_NO_ERR
** 作 者: 陳明計
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSTimeTick(void)
{
OS_ENTER_CRITICAL();
if (OSTickCnt != 0)
if (--OSTickCnt ==0)
{
OS_TimeTick();
if (OSIntNesting == 0) /* 是否是中斷中調(diào)用 */
if (OSTCBCur != OSTCBHighRdy)
{
/* 進行任務調(diào)度 */
OS_TASK_SW();
}
}
OS_EXIT_CRITICAL();
return OS_NO_ERR;
}
/*********************************************************************************************************
** 函數(shù)名稱: OS_TimeDly
** 功能描述: 與OSTimeDly一樣,不過不進行任務切換
** 輸 入: ticks : 等待超時時的系統(tǒng)嘀嗒數(shù)
** 輸 出 : OS_NO_ERR
** 作 者: 陳明計
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OS_TimeDly(uint16 Ticks)
{
OS_TimeTick();
OSTCBCur->OSTCBDly = Ticks; /* 設置超時時間 */
OSTCBCur->OSTCBStat |= OS_STAT_DLY; /* 任務進入等待延時狀態(tài) */
_OS_TaskSuspend(OSTCBCur); /* 從優(yōu)先級鏈表中刪除 */
OS_TimeTickAdd(OSTCBCur); /* 加到等待鏈表中 */
if (OSTickThisCnt > Ticks)
{
OSTickThisCnt = Ticks;
OSTickCnt = Ticks;
}
return OS_NO_ERR;
}
/*********************************************************************************************************
** 函數(shù)名稱: OSTimeDly
** 功能描述: 系統(tǒng)等待函數(shù),任務調(diào)用此函數(shù)可以等待一定時間
** 輸 入: ticks : 等待超時時的系統(tǒng)嘀嗒數(shù)
** 輸 出 : 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;
}
/*********************************************************************************************************
** 函數(shù)名稱: 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); /* 加入優(yōu)先級鏈表 */
OSSched(); /* 開始任務切換 */
}
Rt = OS_NO_ERR;
}
OS_EXIT_CRITICAL();
}
return Rt;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -