单片机中的ms级软定时器

来源:本站
导读:目前正在解读《单片机中的ms级软定时器》的相关信息,《单片机中的ms级软定时器》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《单片机中的ms级软定时器》的详细说明。
简介:因单片机中常有一些控制与延时关联,这些操作并不需要特别高的精度,为了少敲点字,故做了这个单片机软定时器,不足之处,欢迎指正。

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 }

提醒:《单片机中的ms级软定时器》最后刷新时间 2024-03-14 01:08:21,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《单片机中的ms级软定时器》该内容的真实性请自行鉴别。