?? 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 + -