陈发堂,庹 勤
(重庆邮电大学 重庆市移动通信技术重点实验室,重庆400065)
TD_LTE技术标准从确定至今发展十分迅速。根据TD产业联盟信息,TD_LTE产业链的发展得到了全球主流研发制造厂商的积极参与,而测试又是关系未来商用的关键点。其中测试仪表对测试结果的准确性和可信度影响很大,因此急需对测试仪在测试标准化、测试仪表的功能和性能等方面对测试仪进行改进[1]。
本文在对TD_LTE射频一致性测试仪表的开发中,需要建立多个承载来满足同时发起的业务,因此引入了多实例模式。而如何保证消息正确到达对应的实例,解决各实例消息和数据的内存区的分配和释放是关键。在本设计过程中,结合了Nucleus Plus操作系统提供的内存池、队列、任务等组件功能,有效地解决了测试仪表中多实例模式的实现问题。
TD_LTE射频一致性测试仪表是依据3GPP标准、TD_LTE国家行业标准开发的TD_LTE基站和终端的测试仪表。在TD_LTE终端协议栈中,无线承载用于接入层向上提供的服务,包括了用于承载控制面信令的信令无线承载(SRB)和用于承载用户面的数据业务的数据无线承载(DRB)。而默认承载和专用承载是非接入层向上提供的服务,以满足不同业务的QoS。在实际测试中,可能同时激活建立多个承载去满足不同的业务。非接入层与接入层承载的映射是根据承载建立情况动态配置的,并且是一一映射的关系。在设计过程中,建立的承载每个对应一个激活的实例,每个实例通过分配的唯一标识进行区分。根据LTE协议规范,在整个协议栈中同时存在多个实例的有ESM、RLC和PDCP三个子层[2]。
Nucleus Plus是美国源代码操作系统商ATI公司推出的嵌入式系统,以其实时响应、抢先、多任务以及源代码开放特性获得在通信、国防、自动化控制、智能家电等领域的广泛应用。同时Nucleus Plus初始化过程中提供的Application_Initialize是对用户开放的子程序,用户可以根据自己的需要在其中初始化Nucleus Plus提供的组件,如任务、内存池、队列等[3]。 系统为协议栈每个子层设置一个对应的任务,并为每个任务分配了一个优先级,数值范围从0~255对应由高到低的256个优先级别。同时也为每个任务分配一个队列,队列是Nucleus Plus中承载消息的载体之一。队列提供了传输多个消息的机制,消息以数值形式发送和接收。发送消息时要求将消息拷贝进队列;接收消息时要求将消息从队列拷贝出消息。而内存池组件又提供了分区内存池分配和动态内存池分配两大类,为用户提供了灵活的内存管理模块。
(1)在Application_Initialize中首先完成内存池组件的初始化。在系统设计时,共创建了5个分区内存池和2个动态内存池。动态内存池用于系统任务堆栈和队列的创建内存分配。分区内存池用于消息、各实例数据等存储区的内存分配,本文即着重介绍了对分区内存池的初始化进行。
Nucleus系统低级初始化中,由系统堆栈之后分配一个可用内存,用于分区内存池的第一个可用地址;然后把连续的大块内存按分区池进行管理,每个池中包含整数大小相同的小分区,但不同池之间的分区大小不同。根据实际需要,定义了不同密度的小分区,分别为52 B、140 B、352 B、2 000 B、60 000 B。 每 个 池 都 分 配 一 个PM_PCB(分区池控制块)和一个分区的内存区指针。PM_PCB中包含了每个分区池的详细信息包括:分区内存池的名称、起始池地址、总分区大小、分区大小、分区中第1个可用地址等。每个小分区都有一个占8 B的头,包含2个地址(下一个可用的分区地址和分区池地址)。分区池之间通过一个双向链表进行链接,而池中单个分区通过单向链表进行链接,如图1所示。在动态申请内存时,系统首先进行判断,根据申请内存的大小选择一个与其大小最接近的分区,然后在相应的分区池中划去第1个可用地址对应的小分区。将划分出的分区中的下一个可用分区地址置为NULL,同时更改PM_PCB中相应的消息,例如下一个可用分区地址、可用分区数等。释放内存时根据该小分区中保存的分区池地址,将其放回它以前所属的分区池,并作为第一个可用分区地址。采用这种方式能有效解决碎片问题,同时执行时间是固定的[4]。
(2)任务和队列的创建:与分区池的原理类似。系统为相应的任务和队列分别分配一个TCB(任务控制块)和QCB(队列控制块),并且各任务之间和各个队列之间都通过动态的双向链表进行链接。每个TCB中包含了任务优先级、任务状态、任务处理函数入口地址等相关信息。QCB包含了队列的最大消息数、消息起始地址、消息的结束地址等信息。接着对存在多实例模式的三个子层进行初始化,将三个子层分别定义为一个多实例进程,并为其分配一个唯一进程标识(processID),同时定义可能存在的最大实例数。每个进程和各实例的信息采用结构体数组的形式,初始信息包括每个进程的状态机入口函数、各实例的初始状态等。
至此,与多实例相关的初始化已完成,系统其他组件初始化这里不再叙述。初始化完成之后,就进入Nucleus操作系统的主控程序调度。
协议栈层间原语通信是通过Nucleus系统队列来实现的。一旦主控程序检测到某层任务被激活,系统将从任务栈中取出当前任务所包含的所有控制信息并跳转至任务处理函数。在任务处理函数中,处理函数将从相应的任务队列中取出消息。协议栈的开发也是基于有限状态机的思想,每收到一条消息,就要进行消息处理。对于多实例模式,要进行消息的处理,就必须知道该消息所属实例的状态、该状态下对应着这条消息的处理函数以及处理结束后跃迁到的状态[5-6]。因此,在前期开发中定义了每个子层的状态和接口原语,并为每条原语分配一个信令标识(signlingID),同时每个状态对应一个消息分组。为保证消息传递到对应的进程实例中,为三个多实例模式的子层设计了一个多实例管理模块,图2为该模块的处理流程。从队列取出消息后,先从消息头中获得实例号InstID,将其作为入口函数的参数之一;然后调用多实例处理函数。在函数内部,首先对入口函数中相应的InstID和processID进行有效性判断,对于错误的InstID和processID直接转入消息内存释放分支,并返回多实例处理不正常的标识。反之,通过有效的processID获得相应进程的状态入口函数,有效的InstID获得相应的实例状态地址,接着转入状态机处理函数分支;最后对调用函数返回的状态机处理标识进行判断,对于正常标志,返回多实例处理正常的标识,否则返回多实例处理不正常的标识。这样通过返回的处理流程标志,可容易地检测和定位出错的位置。
以PDCP子层为例说明状态机处理模块的实现流程。如图3所示,通过对入口函数中携带的状态进行有效性验证,如果没有找到匹配的状态就对该消息所占内存进行释放;反之,在匹配的状态下通过消息头指针获得消息的signalID。同样对signalID进行判断,如果是无效消息标识,则转入释放消息内存分支,并向多实例模块返回状态机处理不正常的标识;否则将消息转入相应的消息处理函数。在消息处理函数中,各实例所用的数据缓存都通过分区内存池进行申请,再由分区池对其内存进行统一分配和释放。消息处理完之后,返回当前实例的状态赋给入口函数中的状态指针,通过实例状态指针的地址对其状态进行更新。同样,正常流程处理完之后,对消息所占内存进行释放,以免发生内存泄露。最后向多实例模块返回状态机处理正常的标识。
在Nucleus操作系统完成所有与目标硬件相关的低级初始化和相关组件的高级初始化子程序后,调用对用户开放的子程序Application_Initialize模块。在其中完成分区内存池和动态内存池的分配、为每个子层创建队列和任务、三个多实例子层的相关信息的初始化以及其他系统组件的初始化。Application_Initialize完成后,Nucleus的初始化完毕,开始进入主控调度程序TCT_Schedule,图4所示为多实例模式实现流程。Nucleus主控程序采用等待检测机制,不断循环检测当前执行任务[7]。当向某个多实例子层的队列发送消息时,将激活挂起在此队列的任务。一旦主控程序检测到某个多实例子层任务被激活,则转入相应子层的任务处理函数。在任务处理函数中,处理函数将从相应的任务队列中取出消息,然后将消息递交给多实例管理模块,通过一些异常情况的检测后,调用相应多实例进程的状态机处理函数。在状态机处理函数中将消息递交给当前实例状态下的消息处理函数。在实现过程中,为了避免内存泄露,每次处理完消息之后都及时回收所占内存。同样如果要释放某个承载,对应的实例中所开辟的数据存储区也要进行释放,释放后的内存可被再次使用。处理完某个队列的消息后,又将此队列的任务挂起,并返回系统的循环检测控制块中。
本文给出了项目协议栈中基于Nucleus操作系统的多实例模式实现机制。Nucleus为用户提供了灵活的内存管理机制,通过自定义池的大小和不同密度的分区大小,以满足不同内存的需要。同时增加了一个判断模块,将申请任务指定到适应它的最小分区,从而有效地减小了分区内碎片问题。本文设计的多实例管理模块,能完成异常情况的处理,保证消息顺利到达相应进程的状态机处理函数。结合Nucleus提供的其他任务、队列等组件功能,该设计方案能实现多实例模式的功能。
[1]蒋远.移动通信新技术—LTE快速发展[J].电信工程技术与标准化,2011,24(9):1-4.
[2]沈嘉.3GPP长期演进(LTE)技术原理与系统设计[M].北京:人民邮电出版社,2008.
[3]管武.基于ARM的嵌入式测控平台的设计及实现[D].上海:上海大学,2008.
[4]左利云,吴良海.基于内存管理的多重查询调度算法[J].计算机研究与发展,2010,20(7):121-124.
[5]李小文,陈贤亮.TD-SCDMA第三代移动通信系统、信令及实现[M].北京:人民邮电出版社,2003.
[6]宋茂强.通信软件设计基础(第2版)[M].北京:北京邮电大学出版社,2008.
[7]魏振华.嵌入式实时操作系统Nucleus中线程控制部件的实现方法[J].计算机应用研究,2003,20(4):97-99.