timer.h
#ifndef __SOFT_TIMER_H__
#define __SOFT_TIMER_H__
#define EVENT_TYPE_ONESHOT 0
#define EVENT_TYPE_PERIODIC 1
#define TMR_POOL_SIZE 20
#define HANDLE int
typedef void (*TimerProc)(void*);
void TimerInit(void);
//HANDLE : -1 means fail,
HANDLE SetTimer(unsigned long uElapse,TimerProc pFunc,void *para,unsigned int Tmr_type);
void KillTimer(HANDLE hTmr);
void TimerServer(void); // call in main loop
void TimerSignal(void); // call it in timer isr
unsigned long TmrGetTime(void);
#endif
timer.c
1 #include "timer.h"
2
3 typedef struct _tagTimer{
4 unsigned int elapse;
5 unsigned int interval;
6 TimerProc pFunc;
7 void *para;
8 unsigned char state;
9 unsigned char event_type;
10 unsigned char timeout;
11 }Timer_Typedef;
12
13 #define TMR_STATE_FREE 0
14 #define TMR_STATE_RUNNING 1
15
16 static Timer_Typedef _timerArray[TMR_POOL_SIZE]={0};
17 static unsigned _tmr_tick = 0;
18
19 void TimerInit(void)
20 {
21
22 }
23
24 HANDLE SetTimer(unsigned long uElapse,TimerProc pFunc,void *para,unsigned int Tmr_type)
25 {
26 int i, unused_slot = -1;
27 for(i=0;i<TMR_POOL_SIZE;++i)
28 {
29 if(_timerArray[i].state == TMR_STATE_FREE)
30 {
31 unused_slot = i;
32 break;
33 }
34 }
35 if(unused_slot != -1)
36 {
37 _timerArray[unused_slot].pFunc = pFunc;
38 _timerArray[unused_slot].para = para;
39 _timerArray[unused_slot].interval = uElapse;
40 _timerArray[unused_slot].elapse = uElapse + _tmr_tick;
41 _timerArray[unused_slot].event_type = Tmr_type;
42 _timerArray[unused_slot].state = TMR_STATE_RUNNING;
43 }
44 return unused_slot;
45 }
46
47 void KillTimer(HANDLE hTmr)
48 {
49 if((hTmr >= 0)&&(hTmr < TMR_POOL_SIZE))
50 {
51 _timerArray[hTmr].state = TMR_STATE_FREE;
52 _timerArray[hTmr].timeout = 0;
53 }
54 }
55
56 void TimerServer(void)
57 {
58 int i = 0;
59 Timer_Typedef* pTmr = _timerArray;
60
61 for(i = 0;i<TMR_POOL_SIZE;++i)
62 {
63 if((pTmr->timeout)&&(pTmr->pFunc))
64 {
65 (*(pTmr->pFunc))(pTmr->para);
66 pTmr->timeout = 0;
67 }
68 pTmr++;
69 }
70 }
71
72 void TimerSignal(void)
73 {
74 int i = 0;
75 Timer_Typedef* pTmr = _timerArray;
76
77 ++_tmr_tick;
78 for(i = 0;i<TMR_POOL_SIZE;++i)
79 {
80 if(pTmr->state == TMR_STATE_RUNNING)
81 {
82 if(pTmr->elapse == _tmr_tick)
83 {
84 if(pTmr->event_type == EVENT_TYPE_PERIODIC)
85 {
86 pTmr->elapse += pTmr->interval;
87 }
88 else
89 {
90 pTmr->state = TMR_STATE_FREE; // kill timer
91 }
92 pTmr->timeout = 1;
93 }
94 }
95 pTmr++;
96 }
97 }
98
99 unsigned long TmrGetTime(void)
100 {
101 return _tmr_tick;
102 }