?? softtimer.c
字號(hào):
/*********************************************************************************************************
** Small RTOS(51)
** The Real-Time Kernel(For Keil c51)
**
** (c) Copyright 2002-2002, chenmingji
** All Rights Reserved
**
** V1.12.1
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: SoftTimer.C
**創(chuàng) 建 人: 陳明計(jì)
**最后修改日期: 2003年3月30日
**描 述: 軟定時(shí)器源程序
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創(chuàng)建人: 陳明計(jì)
** 版 本: V1.00
** 日 期: 2003年2月16日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
**--------------當(dāng)前版本修訂------------------------------------------------------------------------------
** 修改人: 陳明計(jì)
** 日 期: 2003年3月30日
** 描 述: 增加注釋
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_SOFT_TIMER
#include "config.h"
/* 軟定時(shí)器的數(shù)據(jù)結(jié)構(gòu) */
typedef SOFT_TIMER_MEM_SEL struct _TySoftTimerData
{
uint8 Falg; /* 軟定時(shí)器狀態(tài) */
uint16 DelayTime; /* 軟定時(shí)器運(yùn)行時(shí)間 */
void (const * Fuction)(void); /* 軟定時(shí)器溢出調(diào)用的函數(shù) */
};
#if MAX_SOFT_TIMER > 0
uint16 SoftTimerCnt; /* 輔助定時(shí)器 */
uint16 SoftTimerThisDelay; /* 輔助定時(shí)器初始值 */
struct _TySoftTimerData SOFT_TIMER_MEM_SEL SoftTimerData[MAX_SOFT_TIMER];
/*********************************************************************************************************
** 函數(shù)名稱: SoftTimerSum
** 功能描述: 每次系統(tǒng)節(jié)拍處理時(shí)調(diào)用的函數(shù),一個(gè)輔助定時(shí)器
** 輸 入: 無(wú)
** 輸 出: 無(wú)
** 全局變量: SoftTimerCnt
** 調(diào)用模塊: OSIntSendSignal()
**
** 作 者: 陳明計(jì)
** 日 期: 2003年2月16日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SoftTimerSum(void)
{
if( --SoftTimerCnt == 0)
{
OSIntSendSignal(SOFT_TIMER_TASK_ID);
}
}
/*********************************************************************************************************
** 函數(shù)名稱: InitSoftTimer
** 功能描述: 初始化軟定時(shí)器模塊
** 輸 入: 無(wú)
** 輸 出: 無(wú)
** 全局變量: SoftTimerData
** 調(diào)用模塊: OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()
**
** 作 者: 陳明計(jì)
** 日 期: 2003年2月16日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void InitSoftTimer(void)
{
uint8 i;
OS_ENTER_CRITICAL();
for (i = 0; i < MAX_SOFT_TIMER; i++)
{
SoftTimerData[i].Falg = 0;
SoftTimerData[i].DelayTime = 0;
SoftTimerData[i].Fuction = NULL;
}
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
** 函數(shù)名稱: SoftTimerRun
** 功能描述: 運(yùn)行一個(gè)軟定時(shí)器
** 輸 入: Index:軟定時(shí)器的索引
** Delay:延時(shí)時(shí)間
** Fuction:定時(shí)器溢出執(zhí)行的函數(shù)
** 輸 出: NOT_OK:參數(shù)錯(cuò)誤
** SOFT_TIMER_OK:操作正確
** 全局變量: SoftTimerData
** 調(diào)用模塊: OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()
**
** 作 者: 陳明計(jì)
** 日 期: 2003年2月16日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 SoftTimerRun(uint8 Index, uint16 Delay, void (const * Fuction)(void))
{
#if EN_SOFT_TIMER_CHK > 0
if (Index >= MAX_SOFT_TIMER)
{
return NOT_OK;
}
#endif
if (Delay != 0 && Fuction != NULL)
{
OS_ENTER_CRITICAL();
SoftTimerData[Index].Fuction = Fuction;
SoftTimerThisDelay -= SoftTimerCnt;
SoftTimerCnt = 0;
SoftTimerData[Index].DelayTime = Delay + SoftTimerThisDelay;
SoftTimerData[Index].Falg &= ~SOFT_TIMER_TIMER_OUT;
SoftTimerData[Index].Falg |= SOFT_TIMER_TIMER_RUN;
OS_EXIT_CRITICAL();
OSSendSignal(SOFT_TIMER_TASK_ID);
return SOFT_TIMER_OK;
}
else
{
return NOT_OK;
}
}
/*********************************************************************************************************
** 函數(shù)名稱: SoftTimerStop
** 功能描述: 停止一個(gè)正在運(yùn)行的軟定時(shí)器
** 輸 入: Index:軟定時(shí)器的索引
** 輸 出: NOT_OK:軟定時(shí)器不存在
** SOFT_TIMER_OK:操作成功
** 全局變量: SoftTimerData
** 調(diào)用模塊: OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()
**
** 作 者: 陳明計(jì)
** 日 期: 2003年2月16日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 SoftTimerStop(uint8 Index)
{
#if EN_SOFT_TIMER_CHK > 0
if (Index >= MAX_SOFT_TIMER)
{
return NOT_OK;
}
#endif
OS_ENTER_CRITICAL();
SoftTimerData[Index].DelayTime = 0;
SoftTimerData[Index].Fuction = NULL;
SoftTimerData[Index].Falg &= ~(SOFT_TIMER_TIMER_OUT | SOFT_TIMER_TIMER_RUN);
OS_EXIT_CRITICAL();
return SOFT_TIMER_OK;
}
/***************軟定時(shí)器任務(wù)***************************************/
/*********************************************************************************************************
** 函數(shù)名稱: SoftTimer
** 功能描述: 軟定時(shí)器管理任務(wù)
** 輸 入: 無(wú)
** 輸 出: 無(wú)
** 全局變量: SoftTimerCnt,SoftTimerData,SoftTimerThisDelay
** 調(diào)用模塊: OSWait(),OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()
**
** 作 者: 陳明計(jì)
** 日 期: 2003年2月16日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SoftTimer(void)
{
uint16 ThisDelay;
uint8 i;
SoftTimerCnt = 0;
while (1)
{
OS_ENTER_CRITICAL();
// 找到定時(shí)最短的定時(shí)器
ThisDelay = -1;
for (i = 0; i< MAX_SOFT_TIMER; i++)
{
if (SoftTimerData[i].DelayTime != 0 &&
SoftTimerData[i].DelayTime < ThisDelay)
{
ThisDelay = SoftTimerData[i].DelayTime;
}
}
// 計(jì)算等待時(shí)間
if (ThisDelay > -SoftTimerCnt)
{
SoftTimerCnt += ThisDelay;
}
else
{
SoftTimerCnt = 1;
}
SoftTimerThisDelay = ThisDelay;
OSWait(K_SIG,0);
ThisDelay = SoftTimerThisDelay;
// 查詢定時(shí)到的軟定時(shí)器
for (i = 0; i < MAX_SOFT_TIMER; i++)
{
SoftTimerData[i].Falg &= ~SOFT_TIMER_TIMER_OUT;
if (SoftTimerData[i].DelayTime != 0)
{
if (SoftTimerData[i].DelayTime <= ThisDelay)
{
SoftTimerData[i].DelayTime = 0;
if (SoftTimerData[i].Fuction != NULL)
{
SoftTimerData[i].Falg |= SOFT_TIMER_TIMER_OUT;
}
}
else
{
SoftTimerData[i].DelayTime -= ThisDelay;
}
}
}
SoftTimerThisDelay = 0;
OS_EXIT_CRITICAL();
// 執(zhí)行軟定時(shí)器指定的任務(wù)
for (i = 0; i < MAX_SOFT_TIMER; i++)
{
if (((SoftTimerData[i].Falg & SOFT_TIMER_TIMER_OUT) != 0) &&
(SoftTimerData[i].Fuction != NULL))
{
SoftTimerData[i].Falg &= ~SOFT_TIMER_TIMER_OUT;
SoftTimerData[i].Fuction();
}
}
}
}
#endif
/**********************end****************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -