刘 芳,臧 威
(中国航空工业飞行自动控制研究所软件工程中心,陕西西安 710065)
随着嵌入式软件规模及复杂性的不断增加,开发时间和费用也不断增长,如何快速有效地开发一款高效完善的嵌入式软件集成开发平台,成为目前亟待解决的问题。由于嵌入式是一个资源受限系统,自身不具备开发能力,直接在嵌入式系统的硬件平台上编写、调试软件较为困难[1]。目前一般采用的解决办法是首先在通用计算机上编写程序,然后通过交叉编译生成目标平台上可运行的二进制代码格式,最后再烧写到目标平台的特定位置上运行,或生成带调试信息的程序,由调试器提取相应的代码段下载到目标机中进行源码级或机器码级调试。基于上述事实,在嵌入式系统开发过程中,出于安全性、可靠性及性能上的考虑,完善的调试解决方案成为关键。
Eclipse平台目前作为一种编译器、编辑器、调试器以及其他软件开发工具的插件,正在嵌入式领域获得发展动力[2]。风河系统公司已将其从专有用户接口和平台转移到 Eclipse。Accelerated科技、Altera、TI和Xilinx等公司也将Eclipse平台作为自身工具的基础。由于Eclipse平台只是用于开发者工具的一个框架,不直接支持C/C++;其使用外部插件来提供支持。CDT项目则致力于为Eclipse平台提供功能完全的C/C++集成开发环境。
文中嵌入式集成开发环境MRTOS以开源软件Eclipse CDT为基础进行开发,其上构建了 Zylin Embedded CDT作为Eclipse CDT的插件实现了主机端与PowerPC755目标机端的嵌入式交叉调试开发功能。总体上,MRTOS实现的功能包括项目系统、编辑环境、构建环境、配置环境和目标机管理等基本功能和目标机调试等扩展功能,可完成从工程建立和管理、编译、链接及目标代码的生成,到软件仿真、硬件仿真等完整的开发流程。
交叉开发环境在嵌入式应用开发过程中占有重要地位。当前交叉开发环境主要由文本编辑器、交叉编译器、仿真器、远程调试器、连接器、目标对象查看器、Shell和下载器等工具组成。交叉开发环境需占有大量资源,通常运行在宿主机上,而开发出的嵌入式应用则运行在嵌入式计算机上,称之为目标机。在嵌入式应用开发前期,程序员开发自身的嵌入式应用,经过交叉编译、链接,可使用仿真器模拟目标机环境进行初步调试运行。嵌入式硬件系统区别较大,嵌入式开发的中后期,需要将嵌入式应用转移到目标机继续进行开发、调试;同时软件开发者要对目标系统,例如硬件的各种寄存器、内存空间,操作系统的信号量、消息队列、任务和堆栈等,具有完全的观察、控制和调试能力。这样的主机-目标机系统就构成一个交叉开发环境[3]。主机系统是用与开发嵌入式软件系统,目标机系统是被开发的嵌入式系统,二者通过网络、串口等通信方式连接,共同完成嵌入式软件的开发[4]。一般在目标机上有调试器的某种代理Agent,该代理能与调试器一同配合完成对目标机上运行程序的调试操作[5]。
基于交叉开发环境的系统结构如图1所示,这是一个基于Eclipse平台的集成开发环境,简称MRTOS。主机端的交叉编译器提供对嵌入式应用的交叉编译,同时链接了应用支持库和操作系统核心代码,并生成可在目标系统中运行的可执行代码。远程调试器、Shell和目标对象查看器统称为运行时工具,发送请求信息到目标系统并显示返回的结果或信息。仿真器提供模拟的硬件环境仿真,使得开发初期可在宿主机上运行可执行代码。而工具接口和目标机服务器管理所有主机端工具和在仿真器或目标机中运行的嵌入式应用通信及信息的交互。
图1 MRTOS系统结构
嵌入式系统的调试通常需使用交叉调试(Cross Debug)也称为远程调试(Remote Debug)技术,这是一种允许调试器以某种方式控制目标机上被调试进程的运行方式,并具有查看和修改目标机上内存单元、寄存器及被调试进程中变量值等基本功能的调试方式[6]。
MRTOS采用的是基于Eclipse平台上的CDT交叉调试技术。CDT是完全用Java实现的开放源码项目,其作为Eclipse SDK平台的一组插件,将C/C++透视图添加到Eclipse工作台Workbench中,则Workbench可用多数视图、向导、高级编辑和调试来支持C/C++开发。
MRTOS主要通过对CDT调试UI、CDT调试MI和CDT调试启动等部分插件进行扩展,使扩展后的CDT能够调用GDB可远程连接到目标机的调试模块,并且可在调试透视图下对程序进行插入、删除断点、单步执行、查询变量值及检查内存等基本调试操作,使之具有嵌入式远程调试的功能。调试前端流程如图2所示。主要部分的扩展如下:(1)调试器远程连接部分。当用户选择进行远程连接时,负责收集用户关于远程调试的配置信息,例如:连接方式、端口号等,并利用这些信息使调试器与远程模拟器进行连接,连接成功则建立调试会话,若遇异常则退出。(2)调试信息处理部分。该部分实现图形界面中相关视图的扩展点,接收解析后的调试信息,并将结果显示在UI中。(3)调试管理部分。负责创立或中止命令输入输出队列和事件队列,与GDB MI的接口调用等,负责控制与调试器信息的交互。
图2 调试前端流程图
在MRTOS嵌入式系统实例中,开发的交叉调试环境以Eclipse平台和CDT项目为依托,通过运行于主机端的远程调试器GDB来调试运行在PowerPC755之上的针对PowerPC体系结构编译的应用程序或系统程序。其调试目标是运行PowerPC755上的程序,本地GDB调试器和目标机间的通信基于串口进行,以扩展的RSP协议作为调试器和目标机之间的通信协议。
交叉调试环境主要分为两个部分:MRTOS嵌入式CDT GUI插件和MRTOS嵌入式CDT内核插件,分别实现了宿主机调试前端GUI和目标机端调试内核的功能。两部分通过扩展的GDB串行通信协议(RSP)进行通信。宿主机一般为通用PC机,以Eclipse和扩展的CDT插件为调试前端,在Eclipse所提供的图形化界面中用户可方便地向被调试目标发送命令。整个系统的开发架构如图3所示。
图3 MRTOS嵌入式交叉调试环境开发架构
MRTOS嵌入式CDT GUI插件主要实现了宿主机调试前端GUI,基于Eclipse平台实现。在具体的工程实践中,zylincdt4.0.zip包是 MRTOS嵌入式 CDT的GUI实现,对应的源码工程是embeddedcdt4_0,该工程主要在CDT插件的基础上进行扩展,使之具有嵌入式交叉调试的GUI功能,具体实现了交叉调试时的启动配置选项,用于GDB相关信息的配置,并最终生成gdbinit文件。MRTOS嵌入式交叉调试系统在启动Debug透视图时,主要调用了工程的gdbinit文件。其中,gdbinit文件示例源码如下(远程速率为38 400 bit·s-1,端口号为com9):
图4 启动配置选项GUI界面
MRTOS嵌入式CDT GUI插件还可实现利用Wizard页面创建新工程的功能。具体实现包括以下步骤:
(1)根据Eclipse CDT创建新工程的Wizard各页面的实现过程,构建适用于某系统软件开发的新工程Wizard框架,包括MSL项目、OS项目和应用项目。具体每个Wizard页面的界面使用SWT/JFace界面编程技术进行实现。
(2)调研Eclipse CDT源码,在最后一个wizardPage中点击“Finish”按钮后将新创建的工程添加显示在左边Package Explorer的工程树形结构中。
(3)在步骤(2)的基础上,结合具体需求,实现自身Wizard显示工程树形结构的功能。具体实现工程的一个OS项目树形结构包括:“包含”文件夹,“calllib”文件夹(调用的库函数),“ppc755_le_soft_debug”文件夹(包括处理器配置和内存配置,分别采用 Master-Detail技术实现),“src”文件夹(包括 .h,.c,.S 文件)及“syscall”文件夹(系统调用)。
(4)结合ZylinCDT的调试配置选项的实现,使其实现自身的调试配置选项。
总之,MRTOS嵌入式交叉调试环境GUI实现的关键技术有以下方面:(1)工程树形结构的显示。(2)Master-Detail技术实现。(3)调试配置选项的实现,包括选择相应的调试器、生成相应的调试命令文件和GDB进行通信等。
MRTOS嵌入式CDT内核插件主要实现了目标机端调试内核,基于Eclipse平台实现。在具体的工程实践中,org.eclipse.cdt.zip包是MRTOS嵌入式 CDT的内核实现,对应的源码是最新 CDT插件源码,为MRTOS嵌入式CDT GUI插件提供了众多可调用的接口函数,其工程结构如表1所示。
表1 MRTOS嵌入式CDT内核插件工程结构
在表1中,CDT调试MI内核是嵌入式CDT内核插件的核心。其主要实现以下功能模块:
(1)调试类型判断模块。负责检测从调试器MI接口返回的调试信息,若检测到所进行的是交叉调试任务,则通知进行交叉调试的相关处理;若是本地调试任务,则通知进行CDT原来的调试机制。该部分同时负责收集调试命令发出后调试器的回馈信息。
(2)交叉调试信息解析模块。若在检测MI返回信息时发现是交叉调试信息,则信息由该模块接收,并根据交叉调试时各种返回的调试信息的格式进行信息解析、提取和存储,以提供给交叉调试的信息处理模块使用。
(3)调试信息处理模块。实现图形界面中相关视图的扩展点,根据视图刷新的要求从解析部分分离的信息当中取得有效数据,并根据数据实现视图的有效刷新。
(4)调试管理模块。该模块相当于调试管理者,负责创立或终止命令输入输出队列、事件队列及进程会话;启动或终止输入输出线程;初始化命令工厂、与MI的接口等,负责控制与调试器信息的交互。
综上所述,MRTOS嵌入式CDT GUI插件实现了交叉调试时的启动配置GUI,包括GDB信息配置、gdbinit文件生成等;MRTOS嵌入式CDT内核插件实现了交叉调试信息解析及处理等功能,包括后台GDB调用gdbinit文件并执行其中的GDB命令、进行目标板调试等。图5显示了MRTOS嵌入式交叉调试环境的开发流程。
图5 MRTOS嵌入式交叉调试环境开发流程
目前嵌入式交叉调试主要采用硬件调试器与调试程序相结合的方法,但硬件调试器的价格较高,增加了系统开发成本。文中给出了一种基于Eclipse平台的MRTOS嵌入式交叉调试环境的设计与实现,不仅为嵌入式软件的调试提供了方便,且有助于嵌入式系统的软硬协同设计开发。经验证,其可方便地编辑、编译代码并可进行图形化交叉调试,并在工作使用中取得了满意的效果。另外,在研究过程中,还有某些方面需要完善,如可根据需要,不断增加编辑器组件的功能;扩展调试系统,使其支持非相似环境下不同硬件平台和TCP/IP调试等多种调试方式等。
[1]ERICH G,KENTB.Contributing to eclipse:principles,patterns,and plugins[M].USA MI:Engineering Mechanics,2003.
[2]郭春霞,裘雪红.嵌入式系统安全的研究与设计[J].电子科技,2005(8):49-54.
[3]温利娜,谢彬,李连云.交叉开发环境中的目标机代理设计[J].计算机工程,2007,33(2):277 -279.
[4]陈小平,谢彬,李斌.嵌入式软件协同开发支撑技术[J].计算机工程,2007,33(18):90 -92.
[5]王立泽,刘斌,杨顺昆,等.面向VxWorks的嵌入式软件集成开发环境研究[J].计算机工程,2006,32(3):55-56.
[6]王兴杰,李允,江浩,等.基于Linux的嵌入式交叉开发技术[J].计算机应用研究,2008,25(1):206-208.