嵌入式实装软件虚拟运行环境研究
2014-12-23王源源贺红卫宋光照
王源源,贺红卫,刘 冰,宋光照
(1.中国航天科工集团第二研究院706所,北京100854;2.中国兵器工业计算机应用技术研究所,北京100089)
0 引 言
大型软件系统的研发是一项复杂的系统工程,现有大量大型系统软件基于嵌入式实时操作系统开发,许多工作的开展依赖于特定硬件,给开发和调试带来诸多不便。因此在通用平台上构建嵌入式软件虚拟运行环境的重要性不言而喻,在通用平台上开发调试嵌入式实装软件能充分地利用通用计算机的高配置、优秀的人机界面及开发编程资源,有效的使嵌入式实装软件的开发和调试过程脱离特定的硬件。现有的开发工具如VxSim 必须与Tornado环境配合使用且不开源,扩展性和安全性无法保障。该论文设计实现了一种虚拟运行环境,该环境使嵌入式实装软件能脱离对特定硬件的依赖运行在通用计算机上,因此开发人员可在通用计算机上开发嵌入式实装软件、搭建各子系统软件的联合调试环境,能够提高开发效率,缩短装备系统的软件研发周期。另外,该虚拟运行环境支持在单台计算机上配置运行多个实装软件,减少了联合调试需要的计算机结点数。
1 Win32平台+RTX简介
Windows是一个通用的操作系统平台,它以优秀的体系结构,广泛的硬件支持,丰富的应用程序接口以及人性化的图形界面占据着通用操作系统的大部分市场。但是在需要硬实时特性的领域,如医疗、通信、航空航天等,Windows不能满足要求。RTX 是美国的Ardence(已被IntervalZero收购)公司为了使Windows操作系统能满足硬实时系统严格的响应时间要求而在Windows上做的扩展,其原理是在Windows平台上提供一个实时子系统[1]。
通过实际的测评,Windows+RTX 能满足硬实时性,其实时性接近于VxWorks操作系统。原因如下[2]:
(1)RTX 为Windows添加了一个实时子系统RTSS,如图1 所示。RTSS 类似于Windows 的其它子系统 (如Win32,DOS),RTSS有独立的运行环境和API,有自己的线程调度器,采用抢占式调度策略。并且,当一个RTSS线程运行时,所有Windows管理的中断会被屏蔽掉,包括延迟过程调用。
(2)RTX 含有一个定制的实时扩展硬件抽象层(HAL)。这个扩展通过控制处理器级的中断来避免Windows屏蔽RTSS管理的中断。该实时扩展还支持着RTSS环境的定时器以及高精度时钟。
图1 RTX 整体结构
2 虚拟运行环境构建方案
根据以上分析及大量装备系统嵌入式实装软件基于VxWorks操作系统研发这个事实,本文针对VxWorks 5.5嵌入式实时操作系统,在安装有RTX 扩展的Windows XP环境下构建嵌入式实装软件的虚拟运行环境。
2.1 总体框架
VxWorks操作系统功能强大,其软件平台具备组件式结构[3],包括核心内核功能和依赖内核的外围功能,这些组件的功能以各种功能库的集合提供给应用程序,其库由400多个相对独立、短小的目标模块组成[4,5],我们只关注在实装软件中用到的基本组件,包括内核、I/O 系统、文件系统和网络通信。内核提供的功能按照功能库可分为任务管理模块、信号量模块、消息队列模块、时钟管理模块等。虚拟运行环境的构建即实现上述各功能模块的库函数接口。虚拟运行环境的结构如图2所示。
图2 虚拟运行环境总体框
2.2 内核组件的虚拟
由前面的分析可知,在RTSS环境中RTX 提供的函数为实时函数,因此内核的虚拟我们只需关注如何利用RTX提供的实时函数设计实现VxWorks 5.5内核提供的库函数接口。下面以图2中内核组件中的任务管理、信号量好消息队列为例分析内核的虚拟实现。
2.2.1 任务管理
任务的定义请参见文献 [6]。VxWorks 5.5 内核的任务管理通过taskSpawn等函数提供了任务创建、删除和控制任务等功能。
RTX 提供了大量线程管理的实时函数接口,与Vx-Works 5.5任务管理函数的部分接口对比见表1。
表1 两平台任务/线程接口函数对比
从表1中可以看出,RTX 提供了许多与VxWorks 5.5的任务管理函数类似的线程管理函数,但这些函数间又存在区别,下面是对这些区别及其解决方法的分析。
首先是参数的区别,包括参数的类型、个数和返回值。其次是部分RTX 线程函数接口提供的功能并不完全与Vx-Works 5.5相应的函数相同,如taskspawn函数的功能包括创建任务、设置任务优先级,任务在创建后立即开始执行,而RtCreateThread提供的功能是创建线程,没有提供设置任务优先级的功能。另外,两者任务支持的优先级数存在差异,VxWorks共256 个优先级,编号从0 到255,数值越小优先级越高,而RTX 支持的优先级数值为0 到127,数值越大优先级越高。前两个问题可利用RTX 提供的丰富的库函数编码实现,最后一个问题利用转换算法将Vx-Works的优先级数转换为RTSS下的优先级数即可。
2.2.2 信号量
VxWorks信号量用于解决任务间的互斥和同步,是一种快速的任务间通信机制。VxWorks主要提供了二进制信号量、互斥信号量以及计数信号量共3种信号量。提供的信号量管理函数请参考文献 [7,8]。
信号量的虚拟比较简单,使用RTX 下的RtCreateMutex模拟创建互斥信号量,使用RtCreateSemaphore函数模拟创建二值信号量和计数信号量,其中二值信号量的模拟需限定级数量最大值为1。将创建信号量函数返回的句柄存入哈希数组semMap数组中,semTake和semGive函数的实现根据其传入参数semID,在semMap中找到相应的句柄, 调 用 RtWaitForSingleObject 和 ReleaseSemaphore函数。
2.2.3 消息队列
Windows系统和RTX 提供文件映射、共享内存、管道等进程间通信方式,但不提供VxWorks的消息队列机制进行进程间通信,因此需要建立模型设计和实现消息队列功能。VxWorks消息队列管理共提供5个函数接口:
①msgQCreate:创建一个消息队列
②msgQDelete:删除消息队列
③msgQSend:往消息队列中发送消息
④msgQReceive:从消息队列中接收消息
⑤msgQNumMsgs:获取消息队列中的消息数
(1)消息队列的整体结构设计
使用带表头节点的双向循环链表来实现消息队列,示意图如图3所示。
图3 消息队列结构
queue_t结构属于每个消息队列的公有部分,包括如下数据:
Qin:写入位置指针,指向队尾;Qout:读取位置指针,指向队列头;length:队列中已有的消息数;
maxMsgNum:队列允许消息个数的最大值;msgLock:互斥锁;ReceiveSem:接收信号量;SendSem:发送信号量。
链表节点数据结构如下:
(2)接口实现简述
msgQCreate函数创建一个新的消息队列。主要完成3个任务:为双向循环链表分配空间;初始化互斥锁;初始化发送和接收信号量。msgQSend函数发送消息到消息队列,即往链表中添加消息,根据其超时参数和优先级参数来决定添加时的超时时间和添加的位置。msgQReceive函数从消息队列中接收消息,即从链表中删除相应的节点,注意其超时参数。msgQDelete函数删除链表中所有节点,删除互斥锁以及各信号量。
2.3 网络通信模块
2.3.1 设计思想及所用技术
网络通信模块是虚拟运行环境最重要的组成部分之一。它为在一台计算机上运行多个实装软件提供核心支持。该模块实现了一套通信函数接口接管实装软件的套接字函数以控制实装软件的通信。将在本机运行的实装软件的网络地址等信息存储在配置文件中,实装软件通信时通过配置文件中的信息来判断该数据是否需要发送给其它机器,如果仅是发送给本机器其它实装软件的数据,则只需简单的将数据转发到对应实装软件的接收共享内存中,否则才通过网口往外发送。
该模块采用了配置文件驱动技术。实装软件的名称、IP地址、子网掩码、超时时间等信息均存储在配置文件中。根据该配置文件来驱动数据的流向,将配置文件在中间件初始化时一次性读入存入各数据结构中,提高了数据分发时的运行效率。
采用了共享内存技术,对配置表中的每个实装软件生成一个发送和接收共享内存、并为这两个共享内存建立守护线程,借鉴了经典内存管理算法buddy算法[9,10]高效管理共享内存。采用消息队列和大结构技术实现进程间的通信和数据共享,缓解通信压力,提高通信可靠性。
2.3.2 网络通信模块结构
网络通信模块的数据流如图4所示。系统的所有通信数据都进入网络通信模块。由网络通信模块负责分发或丢弃。
2.3.3 网络通信模块设计与实现
图5展示了实装软件通信模块的设计图。实装软件的套接字函数被网络通信模块实现的通信函数接口替代。该设计定义了socket结构体及其可以动态增长的sockArray数组,socket结构体的成员包括与其绑定的IP 地址、子网、存储队列等。当实装软件调用socket函数创建套接字时,从sockArray数组中选择一个socket对象并将其激活,将其地址加入到actQueHeeader链表中。
图4 网络通信模块数据流
图5 实装软件通信模块设计
图5中粗箭头线表示的是数据流向。实装软件调用send或sendto函数将数据发送到共享内存,然后由守护线程发送到外机器或者本机器其它实装软件的接收共享内存。调用recv或者recvfrom 函数从套接字的subQue中读取需要的数据。下面简要分析下该设计中最重要的InVokeRecvMsg函数和SendThread、DisposeThread两个守护线程。
中间件初始化时已经将所有实装软件的重要信息从配置文件中读入内存,InVokeRecvMsg函数根据这些信息中的IP 地址和子网掩码判断应该将数据发送给哪些实装软件。这其中必须考虑数据的通信类型是单播、组播还是广播。单播只需要将数据返给对应实装软件即可,若是组播,则需要根据组播地址将数据发给所有加入该组的实装软件,若是广播,则根据子网掩码将数据发给所有有该网段IP地址的实装软件。该函数设置了标志以判断是否需要将数据发给其它机器。
发送共享内存的守护线程SendThread在共享内存中有消息时调用InVokeRecvMsg函数判断该消息的具体流向。DisposeThread线程是接收共享内存的守护线程,该线程从共享内存中取出数据包,解析包头找出目的地址和端口,遍历激活的socket链表,找到与目的地址符合的socket,然后将该消息拷贝到符合条件的套接字的subQue中。
2.3.4 配置表说明
单台计算机上通信相关的重要信息都存储在配置表中,配置表如图6 所示,该表以XML 形式组织。Mainworker为根节点,timeout属性为共享内存读取的超时值,machineFlag为机器编号,Mainworker节点包含一个或多个Agentworker节点。一个实装软件对应一个AgentWorker节点,其hostname属性为实装软件的名字,timeout为消息队列的存取超时时间,它包含一个或多个网络地址信息。一个网络地址对应一个HostAddress节点,其属性address为IP地址,netmark为子网掩码。
图6 配置表
3 应用验证
该虚拟运行环境已经成功地应用在系统软件的开发和调试中。使用该虚拟运行环境,部门间只协调软件,在计算机硬件条件足够高时仅使用了少量几台计算机便搭建起了联合调试环境。实际应用结果表明,实装软件在该虚拟运行环境上运行稳定,且满足实装软件要求的硬实时性,为该装备系统软件的开发节约了成本,提高了开发效率。
4 结束语
本文提出了一种构建嵌入式实装软件虚拟运行环境的方法,以基于VxWorks5.5实时操作系统为例,分析了虚拟运行环境的实现思想和具体实现。并通过实现网络通信模块接管实装软件通信的方式实现了在单台计算机上运行多个实装软件。最后以该虚拟运行环境在某大型系统开发过程中的实际应用表明了该方法的可行性。下一步的研究工作是完善该虚拟运行环境并扩展其应用范围。
[1]HUANG Jian,SONG Xiao,XUE Shunhu,et al.Design method of real-time simulation system based on RTX platform[J].Computer Applications and Software,2009,26 (4):167-169 (in Chinese). [黄 键,宋 晓,薛 顺 虎,等.RTX 平台下实时仿真系统的设计方法 [J].计算机应用与软件,2009,26 (4):167-169.]
[2]LIU Xiaochuan,FAN Ziming.Real-time analysis and tests for Windows 2000 (XP)+RTX [J].Ship Electronic Engineering,2007,27 (6):135-138 (in Chinese). [刘晓川,樊子明.Windows 2000 (XP)+RTX 的实时性分析与测试 [J].舰船电子工程,2007,27 (6):135-138.]
[3]WANG Jinhui.Theory and realization of VxWorks OS [J].Radio Engineering of China,2007,37 (1):62-64. (in Chinese).[王金辉.VxWorks嵌入式实时操作系统的原理和实现 [J].无线电工程,2007,37 (1):62-64.]
[4]YU Kang,NING Hong,DENG Shenglan,et al.Module automatically loading mechanism based on VxWorks [J].Computer Engineering,2010,36 (18):264-266 (in Chinese).
[于康,宁洪,邓胜兰,等.基于VxWorks的模块自动加载机制 [J].计算机工程,2010,36 (18):264-266.]
[5]ZHOU Junjie,HE Panfeng.Design of VxWorks real-time muti-task software frame [J].Foreign Electronic Measurement Technology,2012,31 (4):80-82 (in Chinese). [周俊杰,何攀峰.基于VxWorks的实时多任务软件框架设计 [J].国外电子测量技术,2012,31 (4):80-82.]
[6]ZHANG Minyan.Research on platform based on RTOS [D].Nanjing:Nanjing University of Technology,2007 (in Chinese).[张敏燕.基于嵌入式实时操作系统VxWorks平台的分析与研究 [D].南京:南京理工大学,2007.]
[7]WANG Peng,ZHANG Yougen,LI Yonggang,et al.Research on the improved modules unloading method of VxWorks[J].Journal of the Academy of Equipment Command &Technology,2010,21 (5):83-87 (in Chinese). [王鹏,张友根,李永刚,等.一种改进的VxWorks模块卸载方法研究[J].装备指挥技术学院学报,2010,21 (5):83-87.]
[8]HAO Xiaohui.Research and development of VxWorks based AT91RM200 [D].Xi'an:Xidian University,2007 (in Chinese).[郝晓辉.基于AT91RM9200的VxWorks实时系统的研究和开发 [D].西安:西安电子科技大学,2007.]
[9]GUO Qingbo,GUO Bing,SHEN Yan.Strategy of higher reliability memory management in μC/OS-Ⅱwith buddy algorithm [J].Microcontrollers &Embedded Systems,2011,11(7):30-33 (in Chinese). [国庆波,郭兵,沈艳.Buddy算法的μC/OS-Ⅱ高可靠内存管理方案 [J].单片机与嵌入式系统应用,2011,11 (7):30-33.]
[10]Masmano M,Ripoll I,Real J,et al.Implementation of a constant time dynamic storage allocator[J].Software:Practice and Experience,2008,38 (10):1000-1025.