嵌入式裸机通用定时器模块

通用定时器模块,简单移植即可使用。

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
*******************************************************************************/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值