VxWorks下基于看门狗的通用定时器设计
C被加入到定时列表,计算得出TC为系统运行时刻加上C的时延,然后依据TA、TB、TC重新进行排序,此时列表顺序为B、C、A。当时间轴执行到450ms时,定时器B的ISR将被执行,同时B定时任务将从定时列表中删除;同理,500ms、550m时C任务与A任务将分别从列表中删除。此时所有定时任务执行结束,定时列表为空,共享看门狗定时器进入休眠状态。
2.3 定时器实现
2.3.1 定时器软件结构
共享定时器软件结构如图2所示:
CWatchDogTimer类完成了对看门狗定时器的封装,它由一些通用的函数来维护一个看门狗定时器。其中Create()函数用来创建一个看门狗定时器;Delete()用来删除该定时器;Start()用来启动定时任务;Cancel()用来暂停定时器工作,此时再使用Start()函数可以恢复定时器的运行。
TimerInfo数据结构由tExe与tInterval两个属性构成,tExe记录定时器的执行时间,tInterval表示定时器的时间间隔。
TimerList用来维护多个TimerInfo结构的变量,每个 TiraerInfo变量记录一个定时器参数信息。
CEffieientTimer类完成对多个定时任务的管理,包括RegistTimer()函数实现注册一个定时器;UnRegistTimer()用来注销一个定时器;ClearTimerList()用来清空定时器列表中所有定时器任务;IsEmpty()用来判断定时器列表是否为空。
2.3.2 看门狗定时模块实现
看门狗定时模块处理流程如图3所示。
看门狗定时器模块是共享定时器的基础,它实现了单一定时器的建立、启动、删除、取消等功能。首先通过Create()函数建立一个看门狗定时器,同时设定定时器时延、定时次数等参数;然后通过Start()函数启动定时器;看门狗程序判断是否到达时间间隔,如果到达则开始执行ISR程序,如果没有到达则继续等待;当执行完ISR程序后,定时器将判断当前执行次数是否到达执行总次数,如果是则结束该次定时任务,若不是程序将跳转到重新启动定时器后依次执行。
2.3.3 定时器管理模块实现
定时器管理模块是共享定时机制的核心,用来维护定时器的注册、注销以及定时器链表的排序、删除、清空等操作。
定时器的注册流程如图4所示,首先使用RegistTimer()函数注册一个新的定时器任务,并将该定时器的TimerInfo结构插入链表中维护,然后针对该结构中的tExe变量对链表按照升序排列,执行时间最小的将置于表头;若在插入该定时器任务之前链表中为空,则定时器处于休眠状态,此时置定时器状态为运行;若插入前链表中己存在其他定时器任务,则无须重启定时器。
定时器的注销流程如图5所示,首先使用UnRegistTimer()函数注销一个己注册的定时器任务,并将该定时器的Timerlnfo结构从链表中删除,然后针对该结构中的tExe变量对链表按照升序排列,执行时间最小的将置于表头;若在删除该定时器任务之前链表中除了该定时任务没有其他定时任务时,则置定时器为休眠状态;反之,则无须重置定时器状态。
3 结束语
共享定时器提供了简单、高效、通用的定时方法,使用者可以抛开管理诸多看门狗定时器的烦恼,从而专心于系统其他方面的设计。作为一个通用的系统组件,开发人员不仅可以直接使用,缩短开发时间,也可以继承此定时器类,实现更多丰富的功能,提供了良好的扩展性与灵活性。
该机制在VxWorks的网络报文应答、设备状态监控等方面得到了广泛应用,在有效节省系统资源的同时提高了系统定时机制的灵活性。
VxWroks:ISR 看门狗定时器 共享看门狗定时器 相关文章:
- S5PC100看门狗定时器源码解读(11-19)
- Cortex-M3 (NXP LPC1788)之看门狗定时器对Flash编程的影响(11-19)
- MSP430看门狗定时器的寄存器定义(11-13)
- 内窥镜清消机的自动控制系统(08-02)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)