📄 timers.c
字号:
/****************************************Copyright (c)**************************************************
** 深圳博威科技有限公司
** 软 件 部
** 产品一部
**
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: timers.c
**创 建 人: 黄城
**最后修改日期: 2008年5月22日
**描 述: 计时器
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 黄城
** 版 本: v01.01
** 日 期: 2008年5月22日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define TIMERS_GLOBE
#include "config.h"
#include "timers.h"
#include "glob.h"
/*********************************************************************************************************
** 函数名称: Timer0Init
** 功能描述: 定时器0初始化
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年2月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Timer1Init(void)
{
extern void Timer1_Handler(void);
T1IR = 0xffffffff;
T1TC = 0; //计时器清零
T1TCR = 0x01; //计时器使能
T1MCR = 0x03; //
T1MR0 = (Fpclk / OS_TICKS_PER_SEC);//5ms一次中断
/* 设置timer1中断允许 */
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl14 = 0x25; // timer1通道分配到IRQ slot 14;
VICVectAddr14 = (int)Timer1_Handler; // 设置I2C中断向量地址
VICIntEnable |= 0x0020; // 使能I2C中断
}
/*********************************************************************************************************
** 函数名称: IRQ_Timer1
** 功能描述: 时间中断1的中断服务函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
**
** 作 者: 黄城
** 日 期: 2008年5月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Timer1_Exception(void)
{
static TIMERS *p = NULL;
//OSIntEnter();
OS_ENTER_CRITICAL();
T1IR = 0x01;
VICVectAddr = 0; // 通知中断控制器中断结束
if(EnTimersHead.nextT != NULL)
{
p = EnTimersHead.nextT;//到达第一个计时器
if((uint32)p < 0x80000000)
{
while(1);
}
}
else//系统没有启动计时器
{
return;
}
do//遍历计时器
{
if(OFF == p->u8_state)
{
(p->u32_RealTtimer)++;
}
if(p->u32_RealTtimer >= p->u32_ONTime)//ON 计时到达
{
p->u8_state = ON;
}
if(p->nextT != NULL)
{
if((uint32)(p->nextT) < 0x80000000)
{
while(1);
}
p = p->nextT; //下一个
}
else
{
break;
}
}while(NULL != p);
//OSIntExit();
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
** 函数名称: InitTimerList()
** 功能描述: 初始化时间链表
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
**
** 作 者: 黄城
** 日 期: 2008年5月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void InitTimerList(void)
{
uint8 err = 0;
EnTimersHead.u8_nob = 0;//
EnTimersHead.u8_state = OFF;
EnTimersHead.u32_ONTime = 0xffffffff;
EnTimersHead.u32_RealTtimer = ZERO;
EnTimersHead.nextT = NULL;
g_TimersGroup.u8_Sum = G_TMIER_NUM;
g_TimersGroup.u8_SumFree = G_TMIER_NUM;
//初始化计时器分区
g_pTimersBlock = OSMemCreate(g_u16_dynSpaceTimer, (G_TMIER_NUM+S_TMIER_NUM), sizeof(TIMERS),&err);
}
/*********************************************************************************************************
** 函数名称: EnableTimer()
** 功能描述: 使能一个计时器
** 输 入:
TimerHead------计时器的指针头
u8_no----------要使能的计时器序号
u32_ONTime-----计时到达极限
TimerPool------新计时器的空间
** 输 出: 新计时器的指针
** 全局变量: g_TimersGroup
** 调用模块:
** u8_no == 0XFF//表示是静态计时器
** 作 者: 黄城
** 日 期: 2008年5月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
TIMERS *EnableTimer(TIMERS *TimerHead, uint8 u8_no, uint32 u32_ONTime, OS_MEM *TimerPool)
{
uint8 err = 0;
TIMERS *pNewTimer = NULL;
OS_ENTER_CRITICAL();
if(((u8_no > G_TMIER_NUM)||(u8_no == 0XFF))||
(TimerPool == NULL)||(u32_ONTime < 1))
{
//return (TIMERS)NULL;
DETECT_ERROR;
}
pNewTimer = (TIMERS*)OSMemGet(TimerPool, &err);//申请新计数器
if( NULL == pNewTimer)//申请失败
{
DETECT_ERROR;
}
else//申请成功
{
pNewTimer->u8_nob = u8_no;
pNewTimer->u8_state = OFF;
pNewTimer->u32_ONTime = u32_ONTime;
pNewTimer->u32_RealTtimer = ZERO;
pNewTimer->nextT = NULL;
while(NULL != TimerHead->nextT)//查找计时器链表尾巴
{
TimerHead = TimerHead->nextT;
}
TimerHead->nextT = pNewTimer;
g_TimersGroup.u8_SumFree--; //空闲计时器减一
OS_EXIT_CRITICAL();
return pNewTimer;
}
}
/*********************************************************************************************************
** 函数名称: DisableTimer()
** 功能描述: 禁能一个计时器
** 输 入:
TimerHead------计时器的指针头
pp_TimerDised----------要删除的指针的指针
u32_ONTime-----计时到达极限
TimerPool------新计时器的空间
** 输 出: 新计时器的指针
** 全局变量: g_TimersGroup
** 调用模块:
**
** 作 者: 黄城
** 日 期: 2008年5月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 DisableTimer(TIMERS *TimerHead, TIMERS **pp_TimerDised, OS_MEM *TimerPool)
{
uint8 err = 0;
err = err; //避免编译告警
OS_ENTER_CRITICAL();
if((NULL == TimerHead)||(TimerPool == NULL)
||(pp_TimerDised == NULL)||(*pp_TimerDised == NULL))
{
//return FALSE;
DETECT_ERROR;
}
while(NULL != TimerHead->nextT)//查找要删除的计时器
{
if(TimerHead->nextT == *pp_TimerDised)//找到
{
if((*pp_TimerDised)->nextT != NULL)
{
TimerHead->nextT = (*pp_TimerDised)->nextT;//删除节点
if((uint32)((*pp_TimerDised)->nextT) < 0x80000000)
{
while(1);
}
}
else
{
TimerHead->nextT = NULL;
}
err = OSMemPut(TimerPool, (*pp_TimerDised));//释放内存
if(err == ZERO)
{
*pp_TimerDised = NULL;
g_TimersGroup.u8_SumFree++; //空闲计时器加一
OS_EXIT_CRITICAL();
return TRUE;
}
else
{
OS_EXIT_CRITICAL();
return FALSE;
}
}
TimerHead = TimerHead->nextT;
}
OS_EXIT_CRITICAL();
return FALSE;
}
/*********************************************************************************************************
** 函数名称: RsetTimer()
** 功能描述: 复位一个计时器
** 输 入:
TimerHead------计时器的指针头
p_TimerRset----要复位的指针的指针
u8_type--------复位类型 (1:只复位状态 2:只复位实时计时器 3:都复位)
** 输 出: 新计时器的指针
** 全局变量: g_TimersGroup
** 调用模块:
**
** 作 者: 黄城
** 日 期: 2008年5月29日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 RsetTimeruint8(TIMERS *TimerHead, TIMERS const *p_TimerRset, uint8 const u8_type)
{
if((NULL == TimerHead)||(NULL ==p_TimerRset)
||(u8_type > 4)||(u8_type < 1))
{
DETECT_ERROR;
}
while(NULL != TimerHead->nextT)
{
if(TimerHead->nextT == p_TimerRset)//找到
{
switch(u8_type)
{
case RESET_STATE:
TimerHead->nextT->u8_state = OFF;
return TRUE;
case RESET_REAL:
TimerHead->nextT->u32_RealTtimer = ZERO;
return TRUE;
case RESET_ALL:
TimerHead->nextT->u8_state = OFF;
TimerHead->nextT->u32_RealTtimer = ZERO;
default:
return FALSE;
}
}
else//
{
TimerHead = TimerHead->nextT;
}
}
return FALSE;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -