通用定时器模块,简单移植即可使用。
tmr_func.c
/***********************************************************************
* 宏定义
***********************************************************************/
/***********************************************************************
* 文件包含
***********************************************************************/
#include "tmr_func.h"
/***********************************************************************
* 变量类型
***********************************************************************/
/* 0-31 为通用定时处理函数 */
TMR_FUNC g_paTmrFunc[TMR_FUNC_NUMBER];
volatile int g_laTmrFuncDly[TMR_FUNC_NUMBER]; /* 定时函数延时值 */
volatile int g_laTmrFuncDlyReload[TMR_FUNC_NUMBER]; /* 定时函数重装载值 */
volatile boolean g_baFuncTimeout[TMR_FUNC_NUMBER]; /* 定时函数超时标记 */
TMR_FUNC g_pCurTmrFunc;/* 当前定时函数指针 */
/***********************************************************************
* 函数声明
***********************************************************************/
/***********************************************************************
* 函数名: TmrFuncExec
* 功 能: 执行定时函数,后台调用。
* 参 数: 无
* 返 回: 无
*/
void TmrFuncExec(void)
{
int i = 0;
for (i=0; i<TMR_FUNC_NUMBER; i++)
{
if (g_baFuncTimeout[i] == TRUE)
{
if (g_paTmrFunc[i] != MY_NULL)
{
g_pCurTmrFunc = g_paTmrFunc[i];
g_baFuncTimeout[i] = g_paTmrFunc[i](); /* 调用周期运行函数,返回FALSE表示停止执行 */
}
else
{
g_baFuncTimeout[i] = FALSE;
}
}
}
}
/***********************************************************************
* 函数名: TmrFuncAdd
* 功 能: 添加定时函数
nDly 赋值 为 1 时, 0~10ms内定时器计时到0, 函数立即运行
* 参 数: fp -- 相关 函数 指针
nDly -- 延时
nRld -- 循环延时
* 返 回: TRUE -- 成功 FALSE -- 失败
*/
boolean TmrFuncAdd(TMR_FUNC fp, int nDly, int nRld)
{
int i = 0;
if (nDly < 0)
{
nDly = 0;
}
for (i=0; i<TMR_FUNC_NUMBER; i++)
{
/* 扫描是否存在 */
if (g_paTmrFunc[i] == fp)
{
/* 改变时间 */
g_baFuncTimeout[i] = FALSE;
g_laTmrFuncDlyReload[i] = nRld;
g_laTmrFuncDly[i] = nDly;
return TRUE;
}
}
for (i=0; i<TMR_FUNC_NUMBER; i++)
{
if (g_paTmrFunc[i] == MY_NULL)
{
g_paTmrFunc[i] = fp;
g_baFuncTimeout[i] = FALSE;
g_laTmrFuncDlyReload[i] = nRld;
g_laTmrFuncDly[i] = nDly;
return TRUE;
}
}
return FALSE;
}
/***********************************************************************
* 函数名: TmrFuncDelete
* 功 能: 移除定时函数
* 参 数: fp -- 相关 函数 指针
* 返 回: TRUE -- 成功 FALSE -- 失败
*/
boolean TmrFuncDelete(TMR_FUNC fp)
{
int i = 0;
if (fp == MY_NULL)
{
if(g_pCurTmrFunc == MY_NULL)
{
return FALSE;
}
else
{
for (i=0; i<TMR_FUNC_NUMBER; i++)
{
if (g_paTmrFunc[i] == g_pCurTmrFunc)
{
g_paTmrFunc[i] = MY_NULL;
g_laTmrFuncDly[i] = 0;
g_laTmrFuncDlyReload[i] = 0;
g_baFuncTimeout[i] = FALSE;
return TRUE;
}
}
return FALSE;
}
}
else
{
for (i=0; i<TMR_FUNC_NUMBER; i++)
{
if(g_paTmrFunc[i] == fp)
{
g_paTmrFunc[i] = MY_NULL;
g_laTmrFuncDly[i] = 0;
g_laTmrFuncDlyReload[i] = 0;
g_baFuncTimeout[i] = FALSE;
return TRUE;
}
}
return FALSE;
}
}
/***********************************************************************
* 函数名: TmrFuncScan
* 功 能: 定时函数时间扫描,默认间隔1ms调用
* 参 数: 无
* 返 回: 无
*/
void TmrFuncScan(void)
{
int i = 0;
for (i=0; i<TMR_FUNC_NUMBER; i++)
{
if(g_laTmrFuncDly[i] > 0)
{
g_laTmrFuncDly[i] -= TMR_FUNC_STEP;
}
if(g_laTmrFuncDly[i] <= 0)
{
g_laTmrFuncDly[i] = g_laTmrFuncDlyReload[i];
g_baFuncTimeout[i] = TRUE;
}
}
}
/***********************************************************************
* 函数名: TmrFuncNClear
* 功 能: 清除多个定时函数
* 参 数: n -- 清空的个数, 从 0 开始数
* 返 回: 无
*/
static void TmrFuncNClear(uint8_t n)
{
if(n > TMR_FUNC_NUMBER)
{
n = TMR_FUNC_NUMBER;
}
memset((void *)g_laTmrFuncDly, 0, (sizeof(uint32_t))*n);
memset((void *)g_laTmrFuncDlyReload, 0, (sizeof(uint32_t))*n);
}
/***********************************************************************
* 函数名: TmrFuncAllClear
* 功 能: 清除所有定时函数
* 参 数: 无
* 返 回: 无
*/
void TmrFuncAllClear(void)
{
TmrFuncNClear(TMR_FUNC_NUMBER);
memset(g_paTmrFunc, 0, (sizeof(TMR_FUNC))*(TMR_FUNC_NUMBER));
}
/***********************************************************************
* 函数名: TmrFuncNAdd
* 功 能: 添加指定编号的定时函数
* 参 数: fp -- 相关 函数 指针
nDly -- 延时
nRld -- 循环延时
n -- 位置
* 返 回: RUE -- 成功 FALSE -- 失败
*/
boolean TmrFuncNAdd(TMR_FUNC fp, int nDly, int nRld, int n)
{
if (nDly < 0)
{
nDly = 0;
}
if (n < TMR_FUNC_NUMBER)
{
g_paTmrFunc[n] = fp;
g_baFuncTimeout[n] = FALSE;
g_laTmrFuncDlyReload[n] = nRld;
g_laTmrFuncDly[n] = nDly;
return TRUE;
}
return FALSE;
}
/***********************************************************************
* 函数名: TmrFuncNDelete
* 功 能: 清除指定编号的定时函数
* 参 数: n -- 函数 编号
* 返 回: TRUE -- 成功 FALSE -- 失败
*/
boolean TmrFuncNDelete(int n)
{
if (n < TMR_FUNC_NUMBER)
{
g_paTmrFunc[n] = MY_NULL;
g_baFuncTimeout[n] = FALSE;
g_laTmrFuncDly[n] = 0;
g_laTmrFuncDlyReload[n] = 0;
return TRUE;
}
return FALSE;
}
/******************************************************************************
THE END OF FILE
*******************************************************************************/
tmr_func.h
#ifndef __TMR_FUNC_H_
#define __TMR_FUNC_H_
/***********************************************************************
* 宏定义
***********************************************************************/
#ifndef __MY_NULL
#define __MY_NULL
#define MY_NULL 0x00000000
#endif
#define TMR_FUNC_NUMBER ( 32 ) /* 最多32个通用定时器 */
#define TMR_FUNC_STEP ( 1 ) /* 步长,单位ms */
/***********************************************************************
* 文件包含
***********************************************************************/
#include <stdint.h>
#include <string.h>
/***********************************************************************
* 变量类型
***********************************************************************/
#ifndef __BOOLEAN
#define __BOOLEAN
typedef enum
{
FALSE = 0,
TRUE
}boolean;
#endif
typedef boolean (* TMR_FUNC) (void); /* 定时函数指针 */
/***********************************************************************
* 函数声明
***********************************************************************/
boolean TmrFuncAdd(TMR_FUNC fp, int nDly, int nRld); /* 添加定时函数 */
boolean TmrFuncDelete(TMR_FUNC fp); /* 移除定时函数 */
boolean TmrFuncNAdd(TMR_FUNC fp, int nDly, int nRld, int n); /* 添加指定编号的定时函数 */
boolean TmrFuncNDelete(int n); /* 清除指定编号的定时函数 */
void TmrFuncAllClear(void); /* 清除所有定时函数 */
void TmrFuncScan(void); /* 扫描定时函数(默认间隔1ms调用) */
void TmrFuncExec(void); /* 执行定时函数(后台调用) */
#endif
/******************************************************************************
THE END OF FILE
*******************************************************************************/