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