李光中国电子科技集团公司第54研究所石家庄050081
摘要:定时器对于正确实现有限状态机功能有着很重要的作用。在大型系统中,实时操作系统本身提供的定时器功能有一定局限性,一般需要建立独立的定时器任务来为其他任务管理定时器申请。定时器管理包括定时器处理任务和为应用程序提供的编程接口两部分。应用程序通过函数调用操作定时器,通过消息、由卜件等方式接收时超通知。定时器处理任务的优先级比较高,而且与编程接口同时操作定时器数据。所以在定时器管理的设计实现中要着重考虑算法和代码效率、可重入性等因素。
关键词有限状态机定时器实时操作系统系统设计
中图分类号T内16.2文献标识码A
1引言
有限自动机(FiNIteAutonlataMachine)是计算机科学的重要基石,它在软件开发领域内通常被称作有限状态机(FiniteStateMachine),是一种应用非常广泛的软件设计模式。有限状态机的作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。
有限状态机最基本的概念是事件(Event)引起状态(State)的转换(Tlansition),并执行某些动作(Action)。在有限状态机模型的实现中,定时器有着相当重要的作用。许多状态的生存期是有时间限制的。例如,一个等待接受对端数据的状态如果在指定时间内没有收到有效数据必须作时超处理。
在系统负载容量很大的设备系统设计中常用到有限状态机。在这样的系统中,管理的用户端口数量可能在数千个以上,每个端口相对独立,各自接收外部输人并完成动作和状态转换。
2大系统对定时器需求的特点
大型系统通常选用实时操作系统,操作系统本身就提供了定时器功能调用。但是这些功能调用往往不能满足应用系统对定时器的要求。
·对于应用任务来说,时超(Timeout)事件应该与其他事件的输人方式,比如采用消息或邮件,以便与其他外部输人等同处理。而操作系统提供的定时器功能一般是在时超时设置一个信号(signal),执行挂接的程序,这样时超事件与其他事件处理流程有区别,不利于程序整体规划;
·为了保证系统的稳定性,每一个非稳定状态都要有时超处理,也就是如果在规定时间内收不到预期消息,状态将发生迁移。根据系统容量,所管理的数千个端口在都可能处于非稳定状态,在进入新状态时需要申请定时器,对定时器的需求相当大;
·定时器时间量级需求多种多样,可能是百毫秒级的,也可能是分钟级以上的,每个定时器需要的时长、精度也不同;
·时超消息通知需要附加信息。同一个任务所处理的端口不同,处在不同的状态,申请的定时器也不同。如果时超事件到来时状态已经发生转移,则时超事件无效。所以申请时必须要携带必要的附加参数,接收到时超事件时核对参数。针对这些特点,在大型系统设计时创建一个独立的定时器管理任务是非常必要的。
3.定时器任务的设计实现
3.1定时器任务的功能模块
如图1所示,定时器任务主要包括两部分:定时器处理任务和为其他任务提供的操作定时器的应用程序接口函数(API)。

Tick触发任务一般是挂接在Tick中断上的,通过信号或其他方式为定时器提供基准时钟。定时器处理任务在每次触发后,根据存储的数据,检查并发送时超通知。为了保证定时器的精度,免其他任务干扰,定时器任务的优先级应该是相当高的。这就要求它代码精简、算法优化,执行效率高,减少对系统处理能力的影响。
定时器API是其他任务进行定时器操作的统一接口,可以通过函数调用对定时器进行申请、释放、暂停、恢复和查询等操作。在某些系统的设计中,采用向定时器任务发送消息的方式来操作定时器。这种方法的缺点是应用任务无法立刻得到操作结果的反馈。而API方式带来的问题是对定时器数据区的保护。从图1中可以看出,定时器任务和定时器API同时操作同一块数据区。为了防止发生修改覆盖错误,需要加以保护。保护的方式可以利用互斥、临界区等操作系统提供的任务间同步对象,也可以对关键代码加以“禁止任务调度”保护。

3.2定时器任务流程
定时器处理任务的流程如图2所示。每当处理任务得到基本时钟信号的触发后,便开始检查每个定时器数组的索引。为了提高效率,定时处理任务并没有真正对每个索引数组进行逐个检查,而是通过另外的时间记录数组判断应该处理哪个定时器数组。对于应该进行处理的定时器数组,定时处理程序根据索引直接定位到该数组中适当的位置进行处理,检查当前应做处理的定时器的属性(是否循环定时,是否被暂停等)并做相应的处理,然后通知申请者。如果定时申请者申请单次有效的定时器,在定时到达后,定时器模块通知申请者并自动释放该定时器,该定时器不再有效。如果申请多次有效的定时器,定时器模块会在该定时到达后通知申请者,并保留该定时器,等待下一次定时到达然后继续通知申请者.

3.3主要数据结构
根据定时器任务的特点,采用双向链表来记录所有定时器申请。该数组为定时器模块存放定时器信息的最主要的定时器数组,保存所有已经分配的定时器信息,包括双向链表的前后向指针、定时器的ID号、申请者要求记录的时超通知中的参数、定时器的属性(是否循环、是否暂停)等。
数组的大小是固定的,即定时器管理任务所支持的定时器数鱿。不同精度的定时申请存储在不同数组中,在定时器任务中分别处理。
定时器管理信息中记录着各个定时器组的头尾指针,以便快速完成添加/删除定时器操作。
3.4定时器任务的API接口
通信系统中的各个模块通过API调用方式来设置定时器。在设计”I时需要考虑其可重人性和高效性。在多任务系统中调用的接日函数,可能同时被多个不同优先级的任务调用,所以函数必须是可重人的。定时器函数被频繁调用,所以在设计实现时也要考虑其时间效率。
API提供的函数包括:
(l)定时器的申请
该函数的功能是为指定任务申请一个指定时长的定时器。申请时的参数包括申请者(时超消息发送到什么地方)、定时器的时长和类型、时超消息中将携带的参数等。如果申请成功,定时器自动启动,并返回该定时器的m,作为对该定时器的其他操作(释放、查询等)的参数。如果申请失败,返回空值。
申请函数的处理流程:根据申请条件查找相应的定时器数组,检查是否可以满足申请;如果可以,在该定时器数组中某个位置记录申请者提供的信息及相应的参数,并在该数组对应的定时器索引数组的适当位置加人该申请的索引,以方便定时处理任务的处理。如果不能满足中清者的,扫请,则给申请者返回错误报告,申请失败。
(2)定时器的释放
如果有限状态机在时超之前已经得到某种输人,需要转换到其他状态,则此前申请的定时器就没有意义了,即使时超通知事件到来,也会因为状态不符被丢弃。为了减少处理这个废弃定时器的开销,一般在状态转移前释放它。释放函数可以使申请者在定时到达之前主动释放定时器,这个定时器的时超事件将不再发生。
(3)暂停/恢复定时器
通过设置定时器的属性,该函数可以使申请到的定时器暂停/恢复。暂停的定时器将不再发出时超通知,而一旦恢复后将继续计时。
(4)查询定时器
该函数可以查询指定定时器的申请者、定时时间、剩余时间、暂停状态等数据。
4定时器的应用分析
定时器任务可以提供10ms、100ms、15、105、1niln等多种精度(基本时长)的定时器,每种定时器的数量可以到数千个。最高精度为10Ins级是考虑到在通信系统和网络协议中的定时器一般在百毫秒级别以上。根据不同的时长和精度要求,选择不同的基本时长。例如,申请30。的定时器可以选择3000个10rns精度的定时器(误差不超过rolns),或者30个15精度的定时器(误差不超过15)。
定时器的最高精度取决于实时系统中的系统时钟节拍(tick)。两次系统定时中断之间的时间间隔为一个节拍。对于支持抢占式调度和时间片轮转调度的实时操作系统来说,对tick的设置将会影响到任务调度。如果要实现更高精度的定时
5结束语
实时操作系统提供的功能调用考虑到各种应用情况,其通用性很强,但是功能不够丰富。在实际系统设计中,在定时器管理、内存管理、消息/邮件收发、调试输人输出等方面都可以根据需要需进行功能扩展。
用独立的定时器任务来给其他任务提供统一的定时器,必然要占用处理器、内存等资源。本文讨论的是大型系统。对于复杂程度低、负载容量小、资源相对紧张的小系统,是否要增加独立的定时器管理任务,则要根据具体情况分析。小
参考文献
[l]董荣胜,古天龙.计算机科学与技术方法论【MJ.北京:人民邮电出版社,2加2.
[2]DOUGLASE.COMER,DAviDL.盯EVE.用代P/IP进行网际互连〔M].北京:电子工业出版社,1998.
[3]孔样营,柏桂枝.嵌人式实时操作系统vxworkS及其开发环境【M〕.北京:中国电力出版社,2仪犯.
作者简介
李光男,(1973一),1993年毕业于桂林电子工业学院。从事程控交换方面的研究。




