新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于VxWorks操作系统的通用定时器设计

基于VxWorks操作系统的通用定时器设计

作者:时间:2014-05-13来源:网络收藏

摘要 操作系统以其强实时性、可剪裁性等特点得到了广泛应用,但其并未提供通用的模块。为解决某机载发射装置控制盒中系统的精确定时问题,文中在分析多种定时方式的基础上,利用辅助时钟中断,通过创建定时节点,构造节点链表,设计了基于辅助时钟的通用模块。经测试表明,该模块实现了毫秒级定时,满足了某发射装置的定时需求,并为今后类似系统的精确定时需求提供了方便。

本文引用地址:http://www.eepw.com.cn/article/246739.htm

当前,无人机技术发展迅猛。为满足我国察打一体无人机的装备需求,基于现有小型制导武器和无人机平台进行集成,填补该领域空白。在某型空地制导武器和某型无人机的集成中,由于二者具有不同的数字通讯方式和电气接口等,需在机载发射装置中加装控制盒,以满足飞机与武器的交联需求。该控制盒采用操作系统设计软件,具有实时性强、稳定性高等特点。

VxWorks操作系统自1987年由美国风河公司成功推出以来,已被广泛应用于通信、军事、航空、航天等高精尖及实时性要求较高领域。

1 VxWorks几种常用的定时方式

在实时性要求高的应用系统中,经常会被用到。VxWorks提供了多样的定时器接口函数,但没有通用定时器。在VxWorks提供的定时器接口函数中,taskDelay()、WatchDog和sleep/nanosleep都以tick为基准,定时误差较大,无法满足高精度的定时要求,若把系统cloc krate(默认为60)提高,系统会被频繁的时钟中断打断,效率降低。另外,时间戳sysTimeStamp()虽可实现高精度定时,但该定时方式较占用系统资源,只适合短时间定时。

辅助时钟是利用目标板CPU内除系统时钟外的另一个定时器中断实现,VxWorks提供了一系列与系统时钟相同的操作接口,可以通过挂接用户自己中断服务程序的方式实现精确延时,当辅助时钟的定时周期到时,即触发中断服务程序。本文针对多任务长时间工作的高精度定时需求提出了基于辅助时钟的通用定时器机制。

2 基于辅助时钟的定时机制设计

2.1 辅助时钟的使用

在VxWorks下要利用辅助时钟,首先要对辅助时钟的使用进行配置,以确保辅助时钟可以被正常使用,然后分别调sysAuxClkConnect()函数将中断服务程序与辅助时钟中断挂接、sysAuxClkRate()函数设置辅助时钟中断周期、sysAuxClkEnable()/sysAuxClkDisable()函数允许和禁止辅助时钟。

通过对辅助时钟的使用方式进行研究发现,如果能在与辅助时钟中断挂接的中断服务程序中对定时节点的剩余时间进行更新,当节点剩余时间变为0则说明该节点定时时间到,此时进行相应的操作,从而达到精确定时的目的。可通过同步信号量来调用定时节点处理任务来处理已经定时到的节点。以下是辅助时钟使用的基本原理

 

 

由此可看出,通过中断服务程序,将辅助时钟与定时任务联系起来,为精确定时提供了可能。

2.2 定时节点链表的创建

根据上述特点,可将所有的定时任务通过一个定时任务链表与基于辅助时钟设置的定时器关联起来,每当程序应用层添加一个定时任务,就往该定时任务链表添加一个定时任务节点。通常的添加方法是,插入时从链表头节点开始遍历,根据各个节点的剩余时间来确定插入位置,即将所要插入的定时任务节点按照相对其前一节点剩余时间的差由小到大排列。这样,当辅助时钟中断到来时只需对定时任务链表中的第一个节点剩余时间进行修改即可,而不必对整个链表进行遍历,从而减小了对实时性的影响。

假设系统中存在A、B、C三个定时任务,分别提交了定时周期为20 ms、40 ms和25 ms的定时任务,任务间提交的时间间隔为2 ms,则定时任务链表节点的插入和排列情况如图1所示。其中,第一步插入后,链表中为A任务的20 ms定时节点;第二步插入为第一步操作2 ms后,此时链表中A节点的剩余时间变为18 ms,而新插入B任务的定时周期为4 0ms,大于A节点剩余时间,故插入链表后B任务剩余时间变为22 ms;同理,2 ms后第三步新插入C任务的25 ms定时节点剩余时间变为9 ms,B任务剩余时间变为13 ms。

 

 

2.3 定时器实现

定时任务链表中的每个节点都对应一个定时任务,其结构如下

 

 

通用定时器的实现主要提供了以下4个函数接口供应用层使用,以及一个系统中断程序和一个自动加载并启动的任务。

未找到引用源。定时模块初始化函数ComTimerInit(int precision)定时模块初始化函数主要用来初始化定时节点链表、创建信号量、设置辅助时钟、创建定时中断处理任务,其中参数precision为定时器的分辨率,最小为1 ms。

定时节点添加函数int TimerIncrease(int val,void*pFunc,void*arg,SEM_ID sem)主要用于设置定时器。该函数首先从定时节点链表中获取一个空闲节点,然后根据要添加的定时节点参数初始化该节点,最后将该节点重新添加到链表中。其中,函数参数val为所要定时的时间,pFunc为定时到之后要执行的函数,arg为pFunc的参数,sem为定时时间到后要释放的信号量,函数返回值为定时节点的ID号。需要注意的是,当节点链表不为空时要开启辅助时钟。

定时节点删除函数TimerCanele(int ID)主要用于取消一个激活的定时节点,该函数的传输参数为要取消的定时节点ID。

定时模块销毁函数ComTimerDes()主要用于从系统中销毁定时模块,包括删除信号量、释放链表内存。

辅助时钟中断服务程序AuxClkSvr()是实现精确定时的基础,其通过函数sysAuxClkConnect()连接到辅助时钟中断上。为保证定时精确性,应使此中断程序最短执行。为此建立有序的定时节点链表,每次中断时只需从链表节点首开始遍历找到第一个未休眠的节点,然后将该节点的timeLeft减1,若此时timeLeft为0,则释放中断处理任务的同步信号量;另外,为使得辅助时钟的中断次数最小,可将辅助时钟的分辨率precision设为所需定时任务定时时间的最大公约数,从而函数TimerIncrease()的参数val为所需定时时间与precision的倍数。此函数的执行过程如图2。


上一页 1 2 下一页

关键词: VxWorks 定时器

评论


相关推荐

技术专区

关闭