基于SDL的通信协议开发平台
扫描二维码
随时随地手机看文章
l 引 言
SDL是一种用来说明和描述系统的国际通用的标准化语言。它将直观的图形和固定的格式结合起来,使开发人员可以简洁高效地将规范和协议描述出来,SDL的应用,可以缩短开发周期,降低系统的差错率,提高软件质量。现在越来越多的电信设备开发商开始使用SDL进行协议软件开发。
但SDL并非编程语言,用SDL描述系统以后最终需要将SDL系统映射成实际程序才有意义,而目前一般是借助于国外的一些开发工具如SDT提供的SDL和C语言的转换工具来完成,开发人员通过编写SDL系统和环境的接口函数来实现所生成的代码和RTOS的集成。这种方法提高了协议开发的效率,但也有一些缺点:设计依赖于工具,脱离工具则代码难以维护、SDL生成的代码非常复杂,不便于修改和阅读,所以在实际应用中这些工具往往用于协议验证。
为了提高协议开发效率,我们在无线通信系统开发中建立一套自主的基于SDL的通信协议开发平台,通过这个平台可以实现SDL基本元素进程以及进程之间的通信和RTOS任务之间的通信,并集成了协议中常用的定时器管理功能、内存管理功能。
2 SDL介绍
SDL(Specification and Description Language)是1976年至1992年由ITU—T发展和标准化的一种描述系统行为的语言,SDL的数学模型是扩展有限状态机(EFSM),是一种高层泛用型的用于事件驱动、实时和通信系统的描述语言,电信系统和协议是它主要应用领域之一。SDL有图形和文本两种表示形式,SDL/GR和SDL/PR。它既可以用来对系统的功能进行说明,也可以描述系统的内部结构和行为,因而应用范围很广,可以用于协议工程的各个阶段。SDL采用一种层次结构来对系统进行描述和说明,结构和功能被清楚地划分。系统可以分为多个功能块,功能块表示系统内部功能相对独立的几个模块,它们之间通过信道相连。根据系统规模的大小,每个功能块还可以分为子功能块或进程。与传统FSM类似,SDL进程具有有限数量的被有限数量跃迁连接着的宏控制状态。通过一个输入信号(也可称使能条件)的接收、事先设置的定时器的定时或当前状态变量(连续信号)值所指定条件的确认,跃迁能够被触发。在SDL中,定义了一些基本的数据类型和操作,以及构造新类型的机制,使得SDL拥有和C/C++语言一样的数据操作能力,因此它可以用于系统的设计和实现。
3 SDL通信协议开发平台构成和实现
SDL通信协议开发平台建立在嵌入式实时操作系统上,主要包括4个模块:进程管理、消息管理、定时器管理、缓存管理,如图1所示。其中进程管理模块提供了SDL进程的创建、删除等库函数,并提供了SDL功能块和进程的描述表,通过这张表格可以确定任务块和进程的从属关系。在消息管理模块提供了进程间、进程和功能块间、进程和外部任务间的消息通信函数;定时器管理和缓冲管理模块则提供了定时器的创建、删除函数以及缓冲的创建和释放函数。
3.1 功能块和进程的实现
3.1.1 功能块实现
采用SDL描述的系统包含若干个功能块(block),每个功能块内至少有一个进程(process),功能块是用RTOS的任务直接实现的不需要开发者单独创建,只需在功能块中预先定义包含哪些进程,SDL系统在初始化时直接可以创建功能块。每个功能块内进程的并发调度是由功能块的一个调度函数实现,而功能块之间的调度则由操作系统完成。功能块任务内除了完成个进程状态机的轮询调度外,还负责接收外部环境的消息并分发消息到各个进程状态机中;除此外功能块任务还负责本功能块内所有进程的定时器管理工作。功能块内部工作流程图如图2所示。
3.1.2 进程状态机的实现
进程是并行执行的扩展的有限状态机,它规定一个系统的动态行为,进程基本上是处于等待信号的状态,收到信号则立刻进行状态之间的转移,进程的这一概念非常类似于操作系统中进程或者任务的概念。进程之间,进程与系统环境之间通过异步信号进行通信,这些信号可携带不同类型的参数。虽然进程的特点和RTOS中任务有点相似,但实际开发中一个SDL的进程会同时存在上百个甚至上千个,这显然不能用任务去直接实现SDL进程。
在SDL平台上采用一个C函数对应一个SDL的进程,该进程所在的功能块负责调度该进程的运行。在SDL语言中进程可以看作是一个有限状态机,状态机的状态跃迁是由一系列信号触发的,在进程的入口函数采用swicht—case架构的实现状态机。在平台规定了一个标准的进程状态机函数模板,协议开发中每个进程按照这个模板编写SDL进程的代码。
3.1.3 进程并发性的实现
进程并发性是通过在功能块任务内的进程调度函数实现的,在调度函数内按照消息的触发次序轮流调用进程的状态机函数。在实际应用中还会碰到一个状态机函数,需要并发调用的情况,比如在WiMAX系统中每个用户站入网过程都是一样的,包含下行同步参数获取、上行参数获取、初始测距、能力协商、注册等状态跃迁过程,所以对基站来说只要一个进程状态机就可以完成一个用户站的入网接入过程,但对基站来说又需要同时接人多个用户,这就需要进程状态机函数允许被重用,就像面向对象就是类和对象的关系,我们把这种需要被重用的进程称做进程类型,而每个实际使用的进程称作进程实例,在协议开发过程中开发者调用平台提供接口函数就可以创建一个或者多个进程实例。在程序中要实现状态机函数的重用就需要解决函数的重入问题,我们采用在每个状态机函数中保留一个私有存储区方法解决函数重人过程中私有变量的保存问题,如图3所示。
3.2 通信机制的实现
在SDL中系统通过信道与环境连接。系统由许多用信道连接起来的功能块组成,每个功能块相对于其他功能块而言是独立的。在两个不同功能块中的进程之间,通信的惟一手段是靠发送信号,信号通过信道来传递。信号是系统的不同功能块之间或功能块和环境之间进行通信的手段。
根据信号发送的目的采用两种不同方式实现SDL的通信:
(1)同一功能块内部的进程通讯,这种情况下进程之间的通信是由功能块内部的消息分发机制实现的;
(2)不同功能块之间进程的通信,在这种情况下先通过调用操作系统的消息发送机制将消息发送给目标进程所在功能块,由功能块再分发给进程。
这种两种方式不管是哪种方式都使用了统一消息发送接口函数,对开发者来说是透明的。
3.3 定时器管理
定时器是SDL语言中一个重要元素在通信协议开发中被大量应用,比如在WiMAX系统开发中周期测距需要一个定时器周期触发周期测距进程进行信号质量的检测,在网口地址过滤中需要周期进行地址老化。在SDL协议开发平台中,我们将定时器绑定在进程状态机上,通过静态分配的方法将在平台初始化时分配定时器给每个进程,定时器的定时功能由进程所在的功能块任务维护,这种方法避免了采用一个任务管理所有定时器带来任务负荷过大的问题。另外为了降低功能块的任务负荷,在功能任务内没有采用传统的在一个固定tick周期内检查是否有定时器超时的方法,而是利用功能块任务已经有的等待外部任务消息超时来实现定时器的定时检查。具体说就是在SDL的功能任务内采用差值定时的方法维护定时器,在每个功能块任务内维护一个定时器链表,当定时器启动时就插入到这个定时器链表中并根据时间进行排序。在功能块任务等待外部消息超时后就检查是否链表中有定时器超时,如果有则向相应的进程发送超时消息_并删除该定时器,然后更新下一个定时器超时周期并把这个周期设置成等待外部消息超时的时间。采用这种定时器管理机制的好处是定时器管理任务只在下一个定时器超时的时候被激活,而不需要每隔一个固定周期就需要激活去检查定时器链表,大大节省了任务的切换时间。
4 结 语
基于SDL协议开发平台提供一套将SDL语言直接映射成协议代码的高效方法,使通信协议软件开发人员在协议开发过程中将主要精力集中在前期的SDL对系统的描述阶段,而无需关心系统底层的实现,较好地提高了协议开发的效率和代码的可维护性、可移植性,这些优点已经在基于IEEE802.16d的固定宽带无线接入系统的开发中得到了充分的体现。目前SDL协议开发平台还只是实现了基本的SDL进程、功能块、定时器等元素,对SDL中通信只实现了消息的交互,没有实现远端过程(Remote Pro—eedure)调用和远端变量(Remote Variable),这会限制SDL平台在一些复杂通信协议开发中的使用,针对这些问题我们将在后续的工作逐步完善。