引言
VxWorks是目前应用最多的嵌入式实时 *** 作系统之一,广泛应用于工业控制、医疗器械、通信、航空航天以及武器装备等领域。VxWorks是32位实时嵌入式 *** 作系统,自20世纪80年代由风河公司推出以来,其良好的实时性、对多任务的支持、体积精简、可剪裁等优点得到众多公司、开发者及用户的喜爱。
在实时性要求高的应用系统中,定时器是经常被用到的重要器件。而对于VxWorks *** 作系统本身来说,并未提供一个通用、高效的定时器组件。文章所提出的共享看门狗定时机制就是针对这种情况实现的一种通用型定时器组件。
1 VxWorks定时的方法
1.1 使用taskDely函数
函数原型为:STATUS taskDelay(int TIcks)该函数提供一种简单的任务休眠机制,常用于需要不精确定时或延时的应用中,其定时的单位为TIck,默认情况下60(TIcks)为1s (利用sysClkRateSet函数可以修改系统默认的时钟速率)。在任务中调用taskDelay函数可以在指定的TIcks期间空出CPU的使用权,同时改变该任务的状态为DELAY.由于经常受到任务调度的影响,该定时机制并不精确。
1.2 看门狗watchDog
VxWorks提供了一个看门狗定时器(watchDog timer),它由以下四个函数维护:
wdCreate( ) 创建并初始化一个看门狗定时器;wdDelete( ) 终止并删除一个看门狗定时器;wdStart( ) 启动看门狗定时器;wdCancel( ) 暂停当前看门狗定时器运行。
利用wdCreate函数,在任何任务中都可以创建一个看门狗定时器,经过设置的时间段后,实现指定的C函数。
watchDog定时器作为系统时钟中断服务程序的一部分来维护。因此看门狗所定时执行的程序工作在系统中断级别具有很高的优先级,该程序必须遵守一般ISR程序的规定,不能使用任何可能被阻塞的程序。文章所介绍的高效定时器就是在看门狗定时器的基础上设计的。
1.3 POSIX标准的timer
VxWorks同时也提供IEEE的POSIX 1003.1b标准定时器接口。POSIX标准保证了应用程序与 *** 作系统之间接口的简易性,利用这些接口编程,可以使得应用程序很轻松地从一个 *** 作系统移植到另外的 *** 作系统。使用该定时机制,在指定时间段后,任务将向自身发送SIGNAL,该定时器是建立在时钟和信号之上。POSIX标准的timer定时器常常用来编写跨平台、需要在多个 *** 作系统下运行、易移植的程序。
2 基于看门狗定的高效定时机制
2.1 共享看门狗高效定时器
在一些基于嵌入式实时系统的项目中,经常使用定时器来实现某一时间段后执行某一段程序或函数,而往往计时长度都存在差异,定时器的使用也往往来自不同任务,既要求实时性,又要保证资源竟争的有序性。鉴于这些特点,经常采用的一个定时任务使用一个看门狗定时器的模式已不再适用,如果按照这种模式构建定时器机制,在定时任务较多的情况下,由于看门狗定时器运行在中断级别,资源消耗就会变得很大,从而对系统的实时性产生影响。
共享看门狗定时器的定时机制可以解决这种资源严重浪费的现象。共享看门狗定时机制,顾名思义,就是多个定时任务通过共享同一个看门狗定时器来实现定时 *** 作,其优点是资源消耗小、实时性好、无须产生额外的定时任务。
2.2 定时算法
共享看门狗高效定时器的基本原理是动态改变看门狗的定时任务。
如图1所示,系统中存在A、B、C三个定时任务。首先A任务提交一个500ms的定时任务,200ms后B提交一个200ms的定时任务,再100ms后C提交一个150ms的定时任务。除此之外再无其他计时,A、B、C运行情况如图1所示。
图1 共享看门狗定时器计时机制
图1 共享看门狗定时器计时机制(参见下页)定时器A在时间轴50ms处向共享定时器发起定时申请,共享定时器在其维护的定时列表中加入A的时延与执行程序的函数指针,并计算出定时器下一执行时刻TA(系统运行时间加上A的定时时延),此时由于还没有其他定时器申请定时任务,该列表中只存在A的定时信息。当时间轴到达250ms时,定时器B发起定时申请,由于定时器A的时延为500ms,B的时延为200ms,也就是说B将在时间轴450ms处执行,比A提前了100ms(550ms减去450ms),此时定时列表将完成两件事情,一是修改下一执行时刻TB为系统运行时间加上B的时延,二是针对执行时刻TA、TB对列表进行从小到大的顺序排序。此时列表中B为表头,A在B之后。同样的道理当时间轴到达350ms时,定时器C发起定时申请,定时任务C被加入到定时列表,计算得出TC为系统运行时刻加上C的时延,然后依据TA、TB、TC重新进行排序,此时列表顺序为B、C、A.当时间轴执行到450ms时,定时器B的ISR将被执行,同时B定时任务将从定时列表中删除;同理,500ms、550ms时C任务与A任务将分别从列表中删除。
此时所有定时任务执行结束,定时列表为空,共享看门狗定时器进入休眠状态。
2.3 定时器实现
2.3.1 定时器软件结构
共享定时器软件结构如图2所示:
图2 共享看门狗定时器计时机制
CWatchDogTimer类完成了对看门狗定时器的封装,它由一些通用的函数来维护一个看门狗定时器。其中Create()函数用来创建一个看门狗定时器;Delete()用来删除该定时器;Start()用来启动定时任务;Cancel()用来暂停定时器工作,此时再使用Start()函数可以恢复定时器的运行。
TimerInfo数据结构由tExe与tInterval两个属性构成,tExe记录定时器的执行时间,tInterval表示定时器的时间间隔。
TimerList用来维护多个TimerInfo结构的变量,每个TimerInfo变量记录一个定时器参数信息。
CEfficientTimer类完成对多个定时任务的管理,包括RegistTimer()函数实现注册一个定时器;UnRegistTimer()用来注销一个定时器;ClearTimerList()用来清空定时器列表中所有定时器任务;IsEmpty()用来判断定时器列表是否为空。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)