APP下载

基于VxWorks操作系统下的延时方法比较

2016-04-01白晓慧

科技视界 2016年7期

白晓慧

【摘 要】比较了基于VxWorks操作系统的多种延时方法,编写了基于系统时钟定时器的延时方法的中断服务程序。该方法精确,可靠。已在工程实践中,证实了该方法的有效性以及精确性。

【关键词】VxWorks操作系统;延时方法;中断服务程序

0 引言

VxWorks操作系统是运行在目标机上的高性能、可裁剪的嵌入式实时多任务操作系统,其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天、航海等高精尖技术及实时性要求极高的领域中。

在实际的工程应用中,周期任务,需要有最大的延迟或称为等待时间。这类任务一般会为BIT检测任务,链路检测任务,点迹查询任务等。这段等待时间,在VxWorks操作系统中,可以通过多种延时方法实现。

1 taskDelay法

1.1 原理

taskDelay()是最简单的延时方法。延时操作提供了一个简单的任务休眠机制。当一个任务调用taskDelay()后,它将主动放弃CPU一段时间,进入Delay状态。超时后,这个任务会排到Ready队列中同优先级队列的队尾等待执行。它的单位是tick,tick是VxWorks下的时钟中断频率,可以通过sysClkRateSet()设置,一般在60-100之间。在体系架构、CPU频率等硬件条件允许的范围内,这个值可以随意设置。不过,设置的时候要根据实际需要,而不是每个时间片的间隔越短越好。时间片的数量影响着内核每秒钟调度的次数,而每次内核调度都需要消耗一定的CPU资源。如果每秒产生的时间片数量过大,内核调度所消耗的CPU资源就会过多,从而影响整机效率。在实际工程中,一般选取每秒tick数为100。可以通过调用taskDelay(0),将CPU交给同等优先级的任务。由于其延时的基本单位为tick,因此,最小延时单位为10ms,延时精度不高。

一般来说,当该任务通过taskDelay()进入睡眠状态时,若这段时间内被高优先级的任务占有资源时,则一直得等高优先级的任务放弃资源时,这个任务才会获得资源。

因此,taskDelay()延时很方便,却需要有一定的风险。实际的延时时间为预设延时时间与排队等候时间之和,这样将会导致延时不准确,也对任务的调度安排提出了一个挑战。这样看来,时间片延时并不是很准确,其准确程度需要根据任务调度的状况来决定。如果没有任务占用CPU,等待的误差不超过一个时间片的时间长短;如果有高优先级或同优先级的任务不释放CPU资源,那么等待将直到任务获取CPU资源才能结束。

1.2 具体实现

STATUS taskDelay(int ticks)

2 看门狗法

2.1 原理

实时系统任务的执行一般都有时限的约束。VxWorks提供了一种看门狗定时器机制,允许用户编写的函数与一个特定的时延相联系。这个时延,也是以tick来计量的。任何一个任务都可以创建Watchdog Timer并指定定时器超时后执行的例程。这个例程是在系统时钟ISR的上下文中执行,因此它具有与中断一样的优先级。Watchdog Timer并非一个周期性的定时器,在超时停止或是中途放弃计时之后,将一直处于静止状态。这一点与系统时钟不同。

看门狗定时器超时之后,指定的函数在中断级执行。可以模仿VxWorks中对异常处理的方法,采用分步处理的方法:在Watchdog Timer的ISR中所作的知识发送signal,或是释放信号量等一些简单的操作,而创建专用的task等待接收这类信号,依据信号的指示再去执行相应的复杂处理。这样既不会影响系统的实时性,也可以满足用户多样的需求。

这种计时方法可以提供比较精确的计时,其原因在于定时时间一到,所安排的任务会以中断级别或更高任务优先级执行。作为代价,看门狗定时器比taskDelay()消耗了更多的系统资源,包括存储空间和处理器时间。事实上,整个处理的过程可能还会增加中断处理时间。

2.2 具体实现

需要创建看门狗,并启动。所需函数如下:

int wdCreate()

STATUS wdStart(WDOG_ID wdId, int delay, FUNCPTR pRoutine, int parameter)

3 系统时钟定时器法

3.1 原理

定时器机制的实现是建立在时钟基础上的。VxWorks为支持精确实时控制,利用不同的硬件定时器提供了系统时钟和系统辅助时钟。由于这两个时钟都以周期时钟形式运行,因此相关的硬件定时器的运行方式也是周期形式。每经过一个固定的时间间隔,硬件定时器的ISR将通知VxWorks内核。系统时钟的周期称为tick,定时的时长只能是tick的整数倍。由于系统时钟,处理系统级任务,因而时钟频率一般不能很高。但是可以设置系统辅助时钟的tick数,使其达到精确地定时。

硬件中断处理是实时系统设计的最重要、最关键的问题。由于中断通常对应着外部事件,系统通过中断与外部事件交互。为了获得尽可能快的中断响应事件,VxWorks的中断处理程序运行在特定的上下文中。因此,中断处理不会涉及任务任务上下文的交换。

应用程序可以使用VxWorks未用的硬件中断。VxWorks提供函数intConnect(),它允许指定的C函数与任意中断相联系。intConnect()函数原型是:

STATUS intConnect

(VOIDFUNCPTR *vector, VOIDFUNCPTR routine, int parameter)

只要在工程中定义了INCLUDE_SYSCLK_INT,系统就会自动完成对系统时钟的初始化,也就是在文件usrConfig.c中的usrRoot()函数中实现。考虑到需要根据实际工程中的需求,需要对不同的周期任务设定不同的定时器,因而选择自己对系统时钟进行初始化。本文中设置了10个定时器,分别为定时10ms,20ms,50ms,100ms,200ms,500ms,1s,2s,5s,10s。

3.2 具体实现

bool timeInital()

初始化时,首先应该关中断;其次,调用sysClkConnect()挂接时间中断服务程序;然后再通过调用sysClkRateSet()来设置系统时钟每秒中断的次数;最后再通过调用sysClkEnable()使能对系统时钟中断的响应。

中断服务程序中,需要首先调用tickAnnounce(),来通知内核一个tick事件。本项目工程的中断服务程序完成的操作包括:(1)获取并保存系统时钟ISR要调用的例程;(2)关联系统时钟ISR;(3)对中断次数计数;(4)更新定时器使能标志。

需要说明的是,需要定义定时器的结构。若定义多个定时器,则定时器的结构中需包含编号,定时器的时间间隔数,定时器的时间毫秒数和定时标志。定时标志就是定时时刻到为true,否则为false。若定时时刻到,会通知另一个标志,并重新将定期器定时标志置为false。

4 小结

本文结合工程实践,比较了基于VxWorks操作系统下的多种延时方法。硬件方面,时钟芯片会在确定的时间内为系统产生一个中断。软件方面,中断响应的过程也就是计时的过程,不过系统不会为每一次中断都进行处理,而是经过一定计数之后才会产生一个时间片。计时控制的目的就是在一段时间之后开始特定的工作。taskDelay是延时结束后将任务置于就绪队列等候调度,直至CPU资源可用时执行被延迟的任务。看门狗法和系统时钟定时器法是基于硬件时钟的, 因而可靠性高。对系统时钟定时器的中断服务程序进行了修改,达到了定时的目的。

【参考文献】

[1]Vxworks Programmer Guide, WindRiver[Z]. 1999.

[2]罗国庆.Vxworks与嵌入式软件开发[M].机械工业出版社,2003,9.

[3]孔祥营,柏桂枝.嵌入式实时操作系统Vxworks及其开发环境Tornado[Z]. 2002, 1.

[责任编辑:杨玉洁]