文献标识码:A
文章编号: 0258-7998(2013)12-0022-03
在传统的嵌入式系统中,嵌入式应用软件往往是与嵌入式处理器及嵌入式操作系统紧密绑定,其功能也是为某种特定的应用而定制,缺乏灵活性和可扩展性,软硬件耦合紧密。随着信息技术的发展,嵌入式处理器及嵌入式操作系统的能力越来越强大,嵌入式应用软件的功能也愈加复杂,以往定制开发的方法已逐渐难以满足行业发展的需求。硬件平台通用化、应用软件组件化开发,以及通过动态重构的方法实现应用软件的功能多样化是嵌入式软件技术发展的趋势[1],这种方法既能实现良好的技术继承,又能快速实现应用软件功能定制,体现软件无线电的特征[2]。本文提出了一种基于VxWorks嵌入式操作系统的软件框架设计和实现方法,该框架通过实现资源自动管理(分配与回收)、应用组件动态加卸载等功能,配合一定的软件组件开发规范,从而实现了嵌入式软件基于组件的功能可重构。
1 VxWorks嵌入式操作系统的特点
VxWorks嵌入式操作系统是由美国WindRiver公司开发的一款优秀的商用操作系统,目前广泛应用在航空、航天、军工、工业控制等领域,是业界最流行的嵌入式操作系统之一[3],其特点如下:
(1)高性能的Wind内核:Wind微内核性能卓越,具备多任务实时调度能力,包括时间片轮转调度和优先级抢占调度。同时提供了诸如消息队列、信号量、锁等一系列任务间通信或同步机制,可以方便地实现多任务协同处理。
(2)良好的可裁减性:支持系统高度可裁剪,可以针对特定应用裁剪某些不使用的模块,使系统达到资源占用最少,而性能达到最优。
(3)应用程序动态加卸载、动态链接:支持应用程序模块分别编译、在线加卸载,以及系统动态对多个加载的应用程序模块进行链接,实现互相调用。本文设计的嵌入式软件框架正是利用了此特性。
(4)其他特点:VxWorks嵌入式操作系统支持几乎所有的主流嵌入式处理器类型,如PowerPC、ARM等。另外系统API除了提供特有的Wind接口外,也同时支持标准POSIX接口,使应用软件跨平台移植变得非常容易。
2 嵌入式软件框架设计与实现
2.1 设计目标
嵌入式软件框架的设计目标主要包括以下几个方面:
(1)动态加卸载:系统上电后,能进行应用组件的在线加载和卸载。
(2)运行控制:当应用组件被加载到内存后,能控制其启动运行或停止运行。
(3)系统资源管理:在操作系统不重新启动的情况下,可以对任意应用组件进行运行期间的资源管理,保证系统运行期间无论经过多少次的重构,系统资源都不会泄漏。
(4)多组件支持:在一个处理器上可以同时运行多个应用组件,而不互相干扰。
2.2 架构设计
基于上述设计目标,整个系统可以分为4个层次:处理器层、驱动及BSP层、操作系统层以及应用层。其中应用层由嵌入式软件框架和各个应用组件构成,在不同时刻加载不同应用组件时,应用层功能将可以随之发生变化而无需重新加电或复位操作系统,从而实现了嵌入式软件的功能可重构。
嵌入式软件框架是作为一个中间层的形式运行在操作系统与应用组件之间。一方面它通过对应用组件的动态加卸载、系统资源管理、多组件管理等功能实现了嵌入式软件功能可重构;另一方面它为应用组件屏蔽了底层细节,使之与硬件及操作系统隔离,从而可以实现组件二进制级复用,对于一些通用功能组件,完全无需重新修改和编译,直接通过多组件动态重构即可完成应用软件功能的重新定义,大大降低了开发成本,同时缩短了研发周期。
2.3 框架设计与实现
基于设计目标,本软件框架实现的硬件平台为基于PowerPC8640D高性能处理器的信号处理板,操作系统为VxWorks6.6,开发环境为WorkBench3.0。框架采用模块化设计,主要包括系统接口模块、系统资源管理模块、重构控制模块。嵌入式软件框架顶层结构及接口框图如图1所示。
重构控制模块通过重构控制接口与外部的重构管理软件进行通信,在外部重构管理软件的控制下实现对指定应用组件的加载、运行、停止、卸载等功能。在没有重构管理软件的情况下,还可以以配置文件的方式通过配置文件接口实现重构控制。应用组件通过重构API接口与软件框架进行交互,其中每个应用组件必须实现两个重构控制接口Run()和Stop()以被软件框架调用,其中Run()是框架启动组件运行的接口,Stop()是框架停止组件运行的接口。而框架实现了应用组件注册和注销两个接口:RCFGS_Module_Register()和RCFGS_Module_LogOut(),其中RCFGS_Module_Register()是组件开始运行时向框架注册的接口函数,该接口将返回一个该组件运行期间唯一的ID号;而RCFGS_Module_LogOut()是组件停止运行后向框架注销的接口函数,该函数的输入参数就是组件ID号,框架正是通过该ID实现了组件运行时的系统资源管理。一个应用组件将按图2所示流程完成重构过程。
系统资源管理模块主要实现每个应用组件资源管理表资源的分配与回收。系统刚上电时,系统资源管理模块将对所有的组件注册总表和组件资源管理表进行清零和初始化工作。一旦应用组件通过调用Run()接口被启动时,将向框架注册,成功后,系统资源管理模块将根据组件ID向该组件分配其唯一使用的组件资源管理表,并在组件注册总表中进行记录,以确保组件资源管理表不会被重复分配,进而确保其唯一性。应用组件运行期间将系统申请的各种资源(如任务、消息队列、信号量等)一一记录在其组件资源管理表中,在需要将应用组件卸载前,执行调用组件的Stop()接口,应用组件将向框架进行注销,注销时系统资源管理模块将组件资源管理表中记录的应用组件运行期间申请的系统资源一一释放,再将该组件资源管理表初始化,以备下一个应用组件注册时分配。通过此过程,实现了系统资源的自动管理,而不会导致资源泄漏。组件注册总表和组件资源管理表的实现代码片段如图3所示。
系统接口模块是将涉及系统资源分配与回收的操作系统的API进行二次封装,封装的操作系统函数库包括ioLib、taskLib、kernelLib、msgQLib、rngLib、semBLib、semCLib、semLib、semMLib、semSmLib、sockLib、sysLib、tickLib、hashLib[1,2]等,二次封装的函数具备与原API相似的接口,具备很强的规律性,为应用组件快速开发或移植提供了便利。其封装规则如下:
原API:type FuncName(a,b…)
封装后的API格式:type RCFGS_FuncName(i_id,a,b…),其中,输入变量i_id是每个组件注册成功后获得的唯一的组件ID。
在系统接口模块中所有原操作系统API均可分为资源申请、资源使用、资源释放三类,每类的处理流程相似。本文以消息队列API为例进行说明,其中msgQCreate[4-5]为资源申请类型,msgQSend[4-5]为资源使用类型,msgQ-Delete[4-5]为资源释放类型。封装为RCFGS_msgQCreate、RCFGS_msgQSend、RCFGS_msgQDelete后这三类API对应的处理流程如图4所示。
本文分析了嵌入式软件发展的趋势,以嵌入式软件可重构需求为出发点,介绍了一种基于应用组件加卸载来实现嵌入式应用功能可重构架构和方法。该架构中以嵌入式软件框架为核心,通过介绍嵌入式软件框架的设计和实现,阐明了进行应用组件重构的过程和方法。目前该框架已基于PowerPC8640D硬件平台和Vxworks6.6操作系统进行了实现,其各项设计功能均得到实现,并可稳定运行。该框架的实现解决了传统的嵌入式应用定制开发中效率低、周期长、维护困难的问题,大大提高了开发和维护效率,同时大幅度提高了嵌入式应用功能的灵活性。
参考文献
[1] 石炜,邓伟.基于VxWorks的星载控制计算机动态可重构研究[J].电子设计工程,2009,21(6):30-33.
[2] 肖朝晖.计算机体系结构的发展及技术问题探讨[J].微型机与应用,2009,32(12):1-3.
[3] 周俊杰,何攀峰.基于Vxworks的实时多任务软件框架设计[J].国外电子测量技术,2012,31(4):80-82.
[4] Wind River,Inc..VxWorks programmer′s guide5.5[Z].Wind River Systems,Inc.,2003.
[5] Wind River,Inc..VxWorks application programmer′s guide 6.6[Z]. Wind River Systems,Inc.,2007.