日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]前段時(shí)間把自己以前用的單片機(jī)定時(shí)器整理出來(lái),我稱之為簡(jiǎn)單定時(shí)器,這種簡(jiǎn)單定時(shí)器比較適合定時(shí)器使用量少的程序中,如果定時(shí)器數(shù)量要求多,精度要求高,效率就會(huì)有問(wèn)題,為此,俺就實(shí)現(xiàn)了一個(gè)時(shí)間輪定時(shí)器,簡(jiǎn)單測(cè)

前段時(shí)間把自己以前用的單片機(jī)定時(shí)器整理出來(lái),我稱之為簡(jiǎn)單定時(shí)器,這種簡(jiǎn)單定時(shí)器比較適合定時(shí)器使用量少的程序中,如果定時(shí)器數(shù)量要求多,精度要求高,效率就會(huì)有問(wèn)題,為此,俺就實(shí)現(xiàn)了一個(gè)時(shí)間輪定時(shí)器,簡(jiǎn)單測(cè)試下來(lái)效果非常不錯(cuò)。

1 #ifndef __SOFT_TIMER_H__

2 #define __SOFT_TIMER_H__

3

4 #define EVENT_TYPE_ONESHOT 0

5 #define EVENT_TYPE_PERIODIC 1

6

7 #define TMR_POOL_SIZE 20 // 定時(shí)器池,即可用定時(shí)器個(gè)數(shù)

8 #define TMR_WHEEL_SIZE 8 // 時(shí)間輪的粒度

9

10 #define HANDLE int

11

12 typedef void (*pTimerProc)(void*);

13

14 void TimerInit(void);

15 HANDLE SetTimer(unsigned long uElapse,pTimerProc pFunc,void *para,unsigned int Tmr_type);

16 void KillTimer(HANDLE hTmr);

17 void TimerServer(void); // call in main loop

18 void TimerSignal(void); // call it in timer isr

19 unsigned long TmrGetTime(void);

20

21 #endif

簡(jiǎn)單介紹一下:

SetTimer():參數(shù)uElapse:定時(shí)器超時(shí)時(shí)間.參數(shù)pFunc:定時(shí)器超時(shí)回調(diào)函數(shù).參數(shù)para:定時(shí)器超時(shí)回調(diào)函數(shù)參數(shù).參數(shù)Tmr_type:定時(shí)器類型,EVENT_TYPE_ONESHOT為單次定時(shí)器,定時(shí)器超時(shí)后,會(huì)被自動(dòng)刪除.EVENT_TYPE_PERIODIC表示周期性定時(shí)器,使用完后需主動(dòng)刪除。返回值:返回定時(shí)器id,用于刪除定時(shí)器。KillTimer():刪除由SetTimer()創(chuàng)建的定時(shí)器。
TimerServer():定時(shí)器管理函數(shù),需在主循環(huán)中調(diào)用。
TimerSignal():定時(shí)器信號(hào)函數(shù),提供定時(shí)器運(yùn)行所需節(jié)拍數(shù),需在硬件定時(shí)器中斷中調(diào)用,例如,硬件定時(shí)器10ms中斷一次,在中斷中調(diào)用TimerSignal(),則時(shí)間輪定時(shí)器的節(jié)拍時(shí)間為10ms.
TmrGetTime():記錄定時(shí)器的節(jié)拍數(shù)

1 #include "timer.h"

2

3 typedef struct _tagTimer{

4 unsigned int elapse;

5 unsigned int interval;

6 void *prev;

7 void *next;

8 TimerProc pFunc;

9 void *para;

10 unsigned char state;

11 unsigned char event_type;

12 unsigned char timeout;

13 }Timer_Typedef;

14

15 typedef struct _tagTimerWheel{

16 Timer_Typedef *pFirst;

17 unsigned int entries;

18 }TimerWheel_Typedef;

19

20 #define TMR_STATE_FREE 0

21 #define TMR_STATE_STOP 1

22 #define TMR_STATE_RUNNING 3

23

24 static Timer_Typedef _timerArray[TMR_POOL_SIZE]={0};

25 static TimerWheel_Typedef TmrWheel[TMR_WHEEL_SIZE]={0};

26 static Timer_Typedef* tmr_free_list;

27 static unsigned tmr_free_slot = 0;

28 static unsigned _tmr_tick = 0;

29

30

31 static Timer_Typedef* Tmr_alloc(void);

32 static void Tmr_free(Timer_Typedef* pTmr);

33 static void Tmr_link(Timer_Typedef* pTmr);

34 static void Tmr_unlink(Timer_Typedef* pTmr);

35

36

37 void TimerInit(void)

38 {

39 int i = 0;

40 for(i=0;i

41 {

42 _timerArray[i].next = (void*)(&_timerArray[i+1]);

43 }

44 _timerArray[TMR_POOL_SIZE-1].next = (void*)0;

45 tmr_free_list = _timerArray;

46 tmr_free_slot = TMR_POOL_SIZE;

47

48 for(i=0;i

49 {

50 TmrWheel[i].pFirst = (void*)0;

51 TmrWheel[i].entries = 0;

52 }

53 }

54

55 HANDLE SetTimer(unsigned long uElapse,TimerProc pFunc,void *para,unsigned int Tmr_type)

56 {

57 int unused_slot = -1;

58 Timer_Typedef *pTmr = (Timer_Typedef *)0;

59

60 pTmr = Tmr_alloc();

61 if(pTmr) unused_slot = pTmr - _timerArray;

62

63 if(unused_slot != -1)

64 {

65 _timerArray[unused_slot].pFunc = pFunc;

66 _timerArray[unused_slot].para = para;

67 _timerArray[unused_slot].interval = uElapse;

68 _timerArray[unused_slot].event_type = Tmr_type;

69 _timerArray[unused_slot].state = 1;

70 Tmr_link(pTmr);

71 }

72 return unused_slot;

73 }

74

75 void KillTimer(HANDLE hTmr)

76 {

77 if((hTmr >= 0)&&(hTmr < TMR_POOL_SIZE))

78 {

79 switch(_timerArray[hTmr].state)

80 {

81 case TMR_STATE_STOP:

82 Tmr_free(&_timerArray[hTmr]);

83 break;

84 case TMR_STATE_RUNNING:

85 Tmr_unlink(&_timerArray[hTmr]);

86 Tmr_free(&_timerArray[hTmr]);

87 break;

88 default:

89 break;

90 }

91 _timerArray[hTmr].timeout = 0;

92 }

93 }

94

95 void TimerServer(void)

96 {

97 int i = 0;

98 Timer_Typedef* pTmr = _timerArray;

99 for(i = 0;i

100 {

101 if((pTmr->timeout)&&(pTmr->pFunc))

102 {

103 (*(pTmr->pFunc))(pTmr->para);

104 pTmr->timeout = 0;

105 }

106 pTmr++;

107 }

108 }

109

110

111 void TimerSignal(void)

112 {

113 int spoke = 0;

114 Timer_Typedef* pTmr,*pNext;

115

116 ++_tmr_tick;

117 spoke = _tmr_tick%TMR_WHEEL_SIZE;

118 pTmr = TmrWheel[spoke].pFirst;

119 while(pTmr)

120 {

121 pNext = pTmr->next;

122 if(pTmr->elapse == _tmr_tick)

123 {

124 Tmr_unlink(pTmr);

125 if(pTmr->event_type == EVENT_TYPE_PERIODIC)

126 {

127 Tmr_link(pTmr);

128 }

129 else

130 {

131 Tmr_free(pTmr);

132 }

133 pTmr->timeout = 1;

134 }

135 pTmr = pNext;

136 }

137 }

138

139 static void Tmr_link(Timer_Typedef* pTmr)

140 {

141 int spoke;

142 TimerWheel_Typedef *pWhl;

143 pTmr->state = TMR_STATE_RUNNING;

144 pTmr->elapse = pTmr->interval + _tmr_tick;

145 spoke = pTmr->elapse%TMR_WHEEL_SIZE;

146 pWhl = &TmrWheel[spoke];

147

148 if(pWhl->pFirst) pWhl->pFirst->prev = pTmr;

149

150 pTmr->next = pWhl->pFirst;

151 pWhl->pFirst = pTmr;

152 pWhl->entries++;

153 }

154

155 static void Tmr_unlink(Timer_Typedef* pTmr)

156 {

157 int spoke;

158 TimerWheel_Typedef *pWhl;

159 pTmr->state = TMR_STATE_STOP;

160 spoke = pTmr->elapse%TMR_WHEEL_SIZE;

161 pWhl = &TmrWheel[spoke];

162

163 if(pWhl->pFirst == pTmr)

164 {

165 pWhl->pFirst = pTmr->next;

166 if(pTmr->next) ((Timer_Typedef*)pTmr->next)->prev = (void*)0;

167 }

168 else

169 {

170 ((Timer_Typedef*)pTmr->prev)->next = pTmr->next;

171 if(pTmr->next) ((Timer_Typedef*)pTmr->next)->prev = pTmr->prev;

172 }

173 pWhl->entries--;

174 }

175

176

177 static Timer_Typedef* Tmr_alloc(void)

178 {

179 Timer_Typedef *pTmr = (Timer_Typedef*)0;

180 if(tmr_free_list)

181 {

182 pTmr = tmr_free_list;

183 tmr_free_list = tmr_free_list->next;

184 tmr_free_slot--;

185 }

186 return pTmr;

187 }

188

189

190

191 static void Tmr_free(Timer_Typedef* pTmr)

192 {

193 pTmr->state = TMR_STATE_FREE;

194 pTmr->prev = (Timer_Typedef*)0;

195 pTmr->next = tmr_free_list;

196 tmr_free_list = pTmr;

197 tmr_free_slot++;

198 }

199

200 unsigned long TmrGetTime(void)

201 {

202 ret

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉