刘康丽1,谷 静,杜 影1,毕 硕1,朱元元
(1.北京航天测控技术有限公司,北京 100041; 2.北京航天长征飞行器研究所,北京 100076)
目前,我国的自主可控生态环境还处于初期阶段,国产龙芯 CPU的成功研发与应用承载着我国自主软件发展的希望。随着国产核心基础软硬件的性能与功能逐步完善,在国家政策支持和大力发展民族产业的背景下,“龙芯 +中标麒麟”的模式为国产软硬件的发展、推广和应用开辟出一条创新的道路。在测试控制领域,把开源的软件和PXI硬件结合在一起,打造基于开源软件的通用测试平台,建立基于国产龙芯计算平台的PXI模块仪器生态是实现国产化替代的必经之路。本文将详细讨论中标麒麟系统下基于QT的PXI仪器软件开发方法和步骤。
中标麒麟桌面操作系统软件(龙芯版)V5.0是国内首款支持龙芯64位平台并规模化应用部署的自主操作系统,兼容龙芯3A3000平台并实现系统内核及核心参数等优化适配,能够最大程度发挥中标麒麟操作系统和龙芯3A3000整机平台的整体性能。该系统提供全新经典的用户UI界面,兼顾用户使用习惯,跨平台部署提供统一用户体验;核心参数升级,性能有效提升并保障系统稳定性和安全性;提供完善的系统升级维护机制;软件中心提供丰富的桌面应用及工具,实现开机即用;系统兼容性好,支持主流国产软硬件[1]。
图1所示为龙芯平台搭载中标麒麟操作系统,可安装的应用开发环境有Eclipse、Qt、GCC和脚本语言[1],该平台上的应用软件发展现状正处于由可用到好用的过渡阶段,龙芯软件生态环境还处于缓慢发展阶段,这使得PXI仪器软件的迁移和二次开发存在一定难度,需要操作系统、应用软件以及硬件兼容的紧密配合。
图1 国产龙芯计算平台
Qt是由 TrollTech 公司出品的跨平台C++图形用户界面应用程序开发框架[2],它既可以开发GUI程序,也可用于开发非GUI程序,目前被广泛应用于嵌入式、电力系统、军工系统等要与硬件交互的界面系统中。Qt是面向对象的框架,良好的封装机制令Qt的模块化程度非常高并且可重用性好;另外,Qt具有丰富的API,在Qt中包括了至少250个的C++类,并且还提供了基于模板的 collections,serialization,file,I/O device,directory management,date/time 类,甚至还包括正则表达式的处理功能。选择Qt作为开发工具不仅因为其开发功能强大,更主要是因为它有开源版本且支持跨平台运行,Qt作为高质量的跨平台框架,具有支持平台广泛、功能完整、开源、执行效率高、界面开发简单、开发工具完备等特性,Qt官方已经提供了在windows,Android,ios,linux中运行的SDK,一次程序开发几乎不需要改动就能够在Windows操作系统和中标麒麟操作系统下编译运行,这为PXI设备的跨平台使用创造了条件[3]。
文中使用中标麒麟V5.0安装的Qt5.6,其集成开发环境(IDE)名为Qt Creator,能够提供智能代码完成、语法高亮,集成帮助系统、调试器和分析器。文中案例采用可视化编程模式,界面源码与用户源码隔离,用户源码使用QT提供的信号槽机制,可以很好的降低界面代码与功能代码的耦合性,提升代码的复用性。
龙芯版的中标麒麟操作系统是一种基于Linux内核的桌面操作系统,支持MIPS架构。因此,目前运行在 X86 架构的PXI仪器软件均无法在龙芯平台运行和使用[4]。因此,在中标麒麟操作系统下开发PXI仪器软件需要完成以下工作:
1)开发中标麒麟操作系统下PXI仪器设备驱动程序,将其加载到内核;
2)根据具体应用模块或仪器选择开发“.so”(shared object)文件,便于应用层软件调用;
3)在Qt Creator中编写界面和逻辑代码;
4)链接“.so”文件,编译生成可执行文件,并打包成安装程序。
软件程序功能采取自顶向下的模块化设计方案,根据需求分析,整个软件的功能体系架构如图2所示,软件设计过程充分运用了分层模块化的思想,将其分解为多个子功能模块。总体来说分为三个层次,第一层操作系统中接口驱动层(测试模块采用PXI总线),第二层是设备管理接口层,主要包含仪器的多种调用函数,为应用层实现功能调用提供接口,第三层是软件应用层,主要包含界面仪器操作、配置、与各个子系统测试任务处理等功能。
图2 软件功能体系架构
最终能够实现与底层功能函数的接口,形成功能独立的软件程序,并具有良好的人机界面,方便用户使用。
Linux下的PXI设备驱动主要包含以下几个部分:初始化设备模块、设备打开模块、数据读写和控制模块、中断处理模块、设备释放模块和设备卸载模块。
驱动源码(.c)文件可在任意文本编辑环境下编写,其主要内容是构造Linux操作系统下驱动函数的基本框架,包含Linux驱动程序的关键数据结构及关键功能模块。该文件能够按照两种方式进行编译,一种是直接静态编译成内核的一部分,另一种则是编译成可以动态加载的模块。如果编译进内核,则会增加内核的大小,还要改动内核的源文件,而且不能动态地卸载,不利于调试,所以推荐使用模块方式加载。
使用gcc编译.c文件后生成内核模块“.ko”(kernel object)文件,用命令insmod将其载入Linux内核,从而成为内核的一个组成部分,当不需要该模块时,可以使用rmmod命令进行卸载。为了方便使用,可将加载仪器驱动指令放入开机自启动选项中,这样,该驱动模块将在开机后自动加载至内核。开机自动加载模块驱动本文采用如下方法:
在加载成功后,通过在终端输入lspci指令,可在终端观察到已经识别的PCI模块。
“.so” (shared object)文件作为Linux下的共享链接库文件,类似于windows下的 .dll 文件,它在程序启动的时候加载到程序中,并且可以被不同的程序共享。每个共享函数库都有个特殊的名字,其命名必须以“lib”作为前缀,然后是函数库的名字,然后是“.so”,例如,本文中生成的共享库以libamc.so命名。一般情况下,共享函数库文件需要放在相应约定的目录里,这样通过系统的环境变量设置,应用程序才能正确的使用这些函数库。大部分的源码开发的程序都遵循GNU的一些标准, GNU标准建议所有的函数库文件都放在/usr/local/lib目录下,而且建议命令可执行程序都放在/usr/local/bin目录下。
“.so”文件可向应用层软件提供标准化库函数,方便跨平台软件的移植。在本文的开发案例中,已有的windows下PXI仪器软件调用了NI的VISA库函数。为了方便Linux下仪器软件开发,减少逻辑代码的修改,将Linux下的接口函数封装成同名函数,如图3所示。
图3 Linux下驱动接口函数定义
在应用层程序开发过程中调用“.so”文件,首先要将添加相应的头文件,例如amcio.h。然后在工程文件中引用库文件,例如libamc.so(对应amcio.h),代码如下:
LIBS += -L/lib64 -lamcio
Qt的集成开发环境Qt Creator在中标麒麟V5.0中已被默认集成,Qt Creator包含了项目生成向导、C++代码编辑器、浏览文件以及累的工具,还包括QtDesigner、图形化的GDB调试前端并且继承了qmake构建工具等[5-6]。在使用Qt Widgets Application创建Qt桌面应用的过程中,工程创建后除了工程文件本身还包含:头文件(.h)、源文件(.c)以及界面文件(.ui)。Qt与其他开发工具相比,信号槽机制是其一大特色。信号槽机制,简单来说,就是一个类可以定个多个Signal和Slot而且完全是独立和安全的,在需要建立二者相互通信时,通过connect函数将某个类中的Slot和另个类中的Signal连接起来,就可以实现事件的驱动。例如:
Connect(ui.Send_btn,SIGNAL(clicked),this,SLOT(SendData());
该函数就表示了单击Send_btn按钮,将会响应 SendData()这个函数。因此,利用Qt特有的信号槽(Signal-Slot)通信机制,可将界面文件与用户逻辑代码文件有效隔离。这样,在Windows和Linux下的界面文件能够跨平台使用,不需要更改界面源码。
在两种平台下我们只需重新配置工程环境就能轻松实现界面源码的移植,具体环境参数设置如图4所示。
Qt提供了可视化的开发工具设计器,可直接将各种控件拖拽至项目设计器中,其拥有丰富的设计组建并且支持自绘组件的加入。本文中,用户界面设计方面也采用了图形操作界面,对用户友好并具有如下特点:
1)软件界面保持一致性:界面规范遵循软件界面的规范;
2)设计完整的对话过程:系统的每一次对话都应该有明确的次序:开始、中间处理过程、结束;
3)提供简单的错误处理机制;
4)提供信息反馈:用多种信息提示用户当前软件运行状态,软件界面当前的功能;
5)软件具备测试数据保存功能,以方便用户随时调用、分析。
(a)Window下Qt环境配置
(b)Linux下Qt环境配置图4 环境参数设置图
6)软件集成.chml格式帮助文档,内部包含硬件以及软件的用户说明书。
为保证PXI仪器软件能够在其他龙芯平台上运行,需要将用户程序编译后与所依赖的动态链接库一起打包生成可安装程序。首先,在Qt Creator中使用release方式编译出可执行文件,将其拷贝至新建文件夹中,修改文件夹名称,例如AMC5214C。然后在AMC5214C文件夹中建立脚本文件pack.sh和AMC5214C.sh。
pack.sh文件中包括需要发布的程序名称和创建文件夹位置等信息。其内容如下:
!/bin/sh
exe="AMC5214C"
des="/home/QT/AMC5214C"
deplist=(ldd exe | awk '{if (match(3,"/")){ printf("%s "),3 } }')
cp deplist des
AMC5214C.sh文件内容如下:
appname=`basename 0 | sed s,。sh,,`
dirname=`dirname 0`
tmp="{dirname ?}"
if [ "{dirname%tmp}" != "/" ]; then
dirname=PWD/dirname
fi
LD_LIBRARY_PATH=dirname
export LD_LIBRARY_PATH
dirname/appname "@"
在终端中运行./pack.sh 指令,执行文件所依赖的链接库会自动拷贝至AMC5214C文件夹中。
在其他龙芯平台上运行AMC5214C.sh脚本文件即可启动AMC5214C模块仪器软件。
本文将采用龙芯3A3000 CPU搭建整机测试平台,操作系统为中标麒麟5.0版本,该版本中集成安装了QT 5.6.1开发工具。开发对象是北京航天测控公司自主生产的PXI通用测试平台下的PXI系列模块,分别为:
1)5.5位数字多用表(AMC4311),主要应用于PXI平台的信号高精度测量。模块提供自校准生产功能,通过软件模块可以在不使用特定人力情况下实现采集测量的自校准,纠正测量误差。
2)64通道控制开关(AMC4607),是一个基于PXI总线的64通道SPST开关,主要用于切换较大电流的控制信号。具有集成度高,附加功能丰富的优点。
3)多串口通讯模块(AMC5214C)是一种基于PXI总线的多协议通用异步串行通讯产品。该模块产品具有8个独立的RS-232/RS-422/RS-485的串口通讯端口,每个端口的最大数据通讯速率为921.6 Kbps,8个端口之间采用光电隔离,端口具有静电放电保护能力。该模块主要用于PXI系统中的通讯单元。
根据第2章节所述,首先要编写驱动程序并将其编译成可安装模块(module),本文中编译生成的驱动模块为AMCDEV.ko文件,使用insmod 命令将其动态加载到内核中,并加入到开机自动启动项。开机启动后可通过lspci命令查看驱动模块是否正常加载。
第二步,开发并编译“libamcio.so”文件,具体参见2.3节。
第三步,编写PXI硬件模块功能函数,以多串口通讯模块为例,其主要功能及流程如图5所示[7],功能函数在AMC5214C.cpp文件中实现:
图5 多串口通讯模块功能流程图
第四步,界面设计,以多串口通讯模块为例,该通讯模块共有8通道,各通道均可独立工作,每个通道均有参数设置、数据接收、数据显示等窗口,如图6所示。利用QT的槽机制,将界面与功能函数相关联起来。
图6 多串口通讯模块界面图
第五步,编译可执行程序并打包安装,参见2.5节。
经验证,三个PXI模块的Qt程序均可在龙芯平台下启动运行,并实现仪器资源查找、打开、测试测量、通讯、关闭等操作。
本文详细介绍了在中标麒麟操作系统和龙芯3A3000整机平台下利用开源的QT开发软件对自主研发的国产PXI模块仪器进行软件设计的的方法和步骤,完成了三款PXI仪器模块的软件开发工作,为中标麒麟下以Qt软件为核心创立PXI模块仪器生态开辟了全新思路,为未来国产硬件平台搭载国产操作系统下的PXI仪器软件开发提供了很好的案例。