📄 timer.c
字号:
/****************************************************************************/
/* */
/* Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD */
/* */
/* FILE NAME: Timer.h */
/* MODULE NAME: 定时器管理模块 */
/* DESCRIPTION: 本程序的主要功能是管理系统中的定时器 */
/* */
/* FUNCTIONS: */
/* TimerInitialize 定时器管理模块初始化 */
/* TimerCreateTimer 创建定时器 */
/* TimerDestroyTimer 销毁定时时钟 */
/* TimerResetTimer 重新设置定时时钟 */
/* TimerStopTimer 停止定时时钟 */
/* TimerScan 扫描定时器是否有定时存在 */
/* */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-23 创建 */
/****************************************************************************/
// 包含相关的头文件
#include "Base.h"
#include "Timer.h"
#define _TIMER_EVENT_USE_QUEUE 1
extern NU_QUEUE g_quEventQueue; // 事件队列
/* 定义时钟管理数据结构 */
typedef struct tagMTIMER_CTRL_BLK
{
NU_TIMER ntBaseTimer; /* Nucleus Timer struct */
UINT16 wTimerID; /* timer ID */
UINT16 wTimerFlag; /* timer flag */
} MTIMER_CTRL_BLK;
#define TIMER_INTERIOR_FLAG 0x55AA
#define TIMER_MAX_COUNT 6
static MTIMER_CTRL_BLK g_aTimerBuffer[TIMER_MAX_COUNT];
#ifndef _TIMER_EVENT_USE_QUEUE
static UINT16 g_wTimerID[TIMER_MAX_COUNT][2];
#endif
/****************************************************************************/
/* FUNCTION: BOOL TimerInitialize(VOID) */
/* DESCRIPTION:定时器管理模块初始化 */
/* INPUTS: NONE */
/* OUTPUTS: NONE */
/* RETURN: 初始化成功返回TRUE,否则返回FALSE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-23 创建 */
/****************************************************************************/
BOOL TimerInitialize( VOID )
{
#ifndef _TIMER_EVENT_USE_QUEUE
int i;
for ( i = 0; i < TIMER_MAX_COUNT; i++ )
{
g_aTimerBuffer[i].wTimerFlag = 0;
g_wTimerID[i][0] = 0;
}
#endif
return TRUE;
}
/****************************************************************************/
/* FUNCTION: VOID __KnlTimerCallbackFunc( UNSIGNED dwTimer ) */
/* DESCRIPTION:内部接收定时的回调函数 */
/* INPUTS: dwTimer - 定时器句柄 */
/* OUTPUTS: NONE */
/* RETURN: NONE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-23 创建 */
/****************************************************************************/
VOID __KnlTimerCallbackFunc(UNSIGNED dwTimer)
{
MTIMER_CTRL_BLK *pTmcb;
#ifndef _TIMER_EVENT_USE_QUEUE
int i;
#else
UINT aEvent[2];
#endif
pTmcb = (MTIMER_CTRL_BLK*)dwTimer;
#ifndef _TIMER_EVENT_USE_QUEUE
for ( i = 0; i < TIMER_MAX_COUNT; i++ )
{
if ( g_wTimerID[i][0] != TIMER_INTERIOR_FLAG )
{
g_wTimerID[i][0] = TIMER_INTERIOR_FLAG;
g_wTimerID[i][1] = pTmcb->wTimerID;
break;
}
}
#else
aEvent[0] = EVENT_TIMER;
aEvent[1] = (UINT)pTmcb->wTimerID;
NU_Send_To_Queue(&g_quEventQueue, aEvent, 2, NU_NO_SUSPEND);
#endif
}
/****************************************************************************/
/* FUNCTION: HTIMER TimerCreateTimer(UINT16 wTimerID, UINT32 dwTimeLen) */
/* DESCRIPTION:创建定时器(创建的同时即开始计时) */
/* INPUTS: wTimerID - 定时时钟的ID号 */
/* dwTimeLen - 定时时钟的时长(毫秒数) */
/* OUTPUTS: NONE */
/* RETURN: 创建成功则返回TIMER句柄,创建失败则返回NULL */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-23 创建 */
/****************************************************************************/
HTIMER TimerCreateTimer( UINT16 wTimerID, UINT32 dwTimeLen )
{
MTIMER_CTRL_BLK *pTmcb;
int i;
pTmcb = (MTIMER_CTRL_BLK*)g_aTimerBuffer;
for ( i = 0; i < TIMER_MAX_COUNT; i++ )
{
if ( pTmcb->wTimerFlag != TIMER_INTERIOR_FLAG )
break;
pTmcb++;
}
if ( i >= TIMER_MAX_COUNT )
return (HTIMER)NULL;
memset(pTmcb, 0, sizeof(MTIMER_CTRL_BLK));
#ifdef WIN32
dwTimeLen = ((dwTimeLen + (1000/18/2)) * 18 / 1000);
#else
dwTimeLen = ((dwTimeLen + (1000 /NU_PLUS_Ticks_Per_Second/2)) * NU_PLUS_Ticks_Per_Second / 1000);
#endif
if ( dwTimeLen < 1 )
dwTimeLen = 1;
if ( NU_Create_Timer( (NU_TIMER*)pTmcb, "Timer", __KnlTimerCallbackFunc,
(UINT32)pTmcb, dwTimeLen, dwTimeLen, NU_ENABLE_TIMER ) != NU_SUCCESS)
{
pTmcb->wTimerFlag = TIMER_INTERIOR_FLAG;
return (HTIMER)NULL;
}
pTmcb->wTimerID = wTimerID;
pTmcb->wTimerFlag = TIMER_INTERIOR_FLAG;
return (HTIMER)pTmcb;
}
/****************************************************************************/
/* FUNCTION: BOOL TimerDestroyTimer(HTIMER hTimer) */
/* DESCRIPTION:销毁定时时钟 */
/* INPUTS: hTimer - 定时时钟的句柄 */
/* OUTPUTS: NONE */
/* RETURN: 销毁成功则返回TRUE,否则返回NULL */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-23 创建 */
/****************************************************************************/
BOOL TimerDestroyTimer( HTIMER hTimer )
{
if ( hTimer == (HTIMER)NULL )
return FALSE;
if ( ((MTIMER_CTRL_BLK*)hTimer)->wTimerFlag != TIMER_INTERIOR_FLAG )
return FALSE; //非法的TIMER句柄
if ( NU_Control_Timer((NU_TIMER*)hTimer, NU_DISABLE_TIMER) != NU_SUCCESS )
return FALSE;
if ( NU_Delete_Timer((NU_TIMER*)hTimer) != NU_SUCCESS )
return FALSE;
((MTIMER_CTRL_BLK*)hTimer)->wTimerFlag = 0;
return TRUE;
}
/****************************************************************************/
/* FUNCTION: BOOL TimerResetTimer( HTIMER hTimer, UINT16 wTimerID, */
/* UINT32 dwTimeLen ) */
/* DESCRIPTION:重新设置定时时钟 */
/* INPUTS: hTimer - 定时时钟的句柄 */
/* wTimerID - 定时时钟的ID号 */
/* dwTimeLen - 定时时钟的时长(毫秒数) */
/* OUTPUTS: NONE */
/* RETURN: 重置成功则返回TRUE,否则返回NULL */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-23 创建 */
/****************************************************************************/
BOOL TimerResetTimer( HTIMER hTimer, UINT16 wTimerID, UINT32 dwTimeLen )
{
if ( hTimer == (HTIMER)NULL )
return FALSE;
if ( ((MTIMER_CTRL_BLK*)hTimer)->wTimerFlag != TIMER_INTERIOR_FLAG )
return FALSE; //非法的TIMER句柄
if ( NU_Control_Timer((NU_TIMER*)hTimer, NU_DISABLE_TIMER) != NU_SUCCESS )
return FALSE;
#ifdef WIN32
dwTimeLen = ((dwTimeLen + (1000/18/2)) * 18 / 1000);
#else
dwTimeLen = ((dwTimeLen + (1000 /NU_PLUS_Ticks_Per_Second/2)) * NU_PLUS_Ticks_Per_Second / 1000);
#endif
if ( dwTimeLen < 1 )
dwTimeLen = 1;
NU_Control_Timer((NU_TIMER*)hTimer, NU_DISABLE_TIMER);
if ( NU_Reset_Timer((NU_TIMER*)hTimer, __KnlTimerCallbackFunc,
dwTimeLen, dwTimeLen, NU_ENABLE_TIMER) != NU_SUCCESS )
return FALSE;
((MTIMER_CTRL_BLK*)hTimer)->wTimerID = wTimerID;
return TRUE;
}
/****************************************************************************/
/* FUNCTION: BOOL TimerStopTimer( HTIMER hTimer ) */
/* DESCRIPTION:停止定时时钟 */
/* INPUTS: hTimer - 定时时钟的句柄 */
/* OUTPUTS: NONE */
/* RETURN: 成功停止则返回TRUE,失败则返回FALSE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-23 创建 */
/****************************************************************************/
BOOL TimerStopTimer(HTIMER hTimer)
{
if ( hTimer == (HTIMER)NULL )
return FALSE;
if ( ((MTIMER_CTRL_BLK*)hTimer)->wTimerFlag != TIMER_INTERIOR_FLAG )
return FALSE; //非法的TIMER句柄
if ( NU_Control_Timer((NU_TIMER*)hTimer, NU_DISABLE_TIMER) != NU_SUCCESS )
return FALSE;
return TRUE;
}
#ifndef _TIMER_EVENT_USE_QUEUE
/****************************************************************************/
/* FUNCTION: UINT16 TimerScan( VOID ) */
/* DESCRIPTION:扫描定时器是否有定时存在 */
/* INPUTS: NONE */
/* OUTPUTS: NONE */
/* RETURN: 有定时时,返回定时时间到的定时的ID号,否则返回NULL */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-30 创建 */
/****************************************************************************/
UINT16 TimerScan(VOID)
{
int i;
UINT16 wTimer;
wTimer = 0;
for ( i = 0; i < TIMER_MAX_COUNT; i++ )
{
if ( g_wTimerID[i][0] == TIMER_INTERIOR_FLAG )
{
wTimer = g_wTimerID[i][1];
g_wTimerID[i][0] = 0;
break;
}
}
return wTimer;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -