一种高效定时器模块的设计与实现
mer_index=0;timer_index { if(RUNNING==TIMER[timer_index].timer_state) { TIMER[timer_index].duration++; if(TIMER[timer_index].duration>=TIMER[timer_index].timeout) { TIMER[timer_index].overflow_ag=1; if(TIMER[timer_index].cycle) { TimerReStart(timer_index); } else { TIMER[timer_index].cnt_times--; if(0==TIMER[timer_index].cnt_times) { TimerStall(timer_index); } else { TimerReStart(timer_index); }}}}} TimerTicked=0; } 软件定时器只有在有嘀嗒发生且自身状态为RUNNING的情况下才会运行,其计时时间-duration随嘀嗒而累加,如果duration达到超时值,则置overow_ag,然后判断该定时器是否周期定时器,是则重启定时-清零duration,否则判断是否多次定时,定时次数计数未满则重启定时,计数满后停止该定时器。 定时器应用 定时器模块在软件系统中是一个基本功能单元,它为其他模块或上层应用提供超时、计时服务[5]。以门锁的驱动为例讲述下定时器的应用。 在门锁闭锁时,BCM对门锁电机的闭锁驱动控制需要保持200ms的时间,在逻辑上便是输出一个200ms的控制脉冲,该部分代码如下: ... DrivePort(ALLDR_LK_OUT,DRIVEON); TimerStart(ALLDR_LOCK_200MS,200,0,1); if(1==TM[ALLDR_LOCK_200MS].overow_ag) { DrivePort(ALLDR_LK_OUT,DRIVEOFF); TM[ALLDR_LOCK_200MS].overow_ag=0; } ... 可见,在设计良好的定时器驱动以后,实现某种定时应用非常简单,其他应用示例在此不再赘述。 结语 本文设计的定时器模块,逻辑清晰,使用方便,做为一个稳定的底层驱动,在实际应用中得到了很好的应用。
- VxWorks实时操作系统下MPC8260ATM驱动的实现(11-11)
- Linux内核解读入门(11-09)
- Linux操作系统网络驱动程序编写(04-11)
- Linux系统对ISA总线DMA的实现(06-19)
- 基于MPEG-4的嵌入式多媒体监控系统中压缩/解压卡的设计与实现(10-15)
- Windows CE下驱动程序开发基础(04-10)