一类在线调试技术在嵌入式系统软件中的应用

2012-09-19 10:29黄小波
电子设计工程 2012年1期
关键词:控制指令测控串口

黄小波,邵 威

(中国电子科技集团公司第三十八研究所 安徽 合肥 230013)

在嵌入式技术飞速发展的今天,嵌入式产品已出现在社会的各个领域,包括通信、军事、仪表、航空、航天、工业控制及家庭消费等。从嵌入式系统的外观上看,嵌入式系统像是一个“可编程”的电子“器件”;从构成上看,嵌入式系统是集软硬件于一体的、可独立工作的计算机系统;从功能上看,它是对宿主对象进行控制,使其具有“智能”的控制器。从应用的角度看,嵌入式系统与通用计算机系统相比,有如下一些特点:

1)专用性。由于嵌入式系统通常是面向某个特定应用的,所以嵌入式系统的硬件和软件,尤其是软件,都是为特定用户群来设计的,它通常都具有某种专用性的特点。

2)实时性。目前,嵌入式系统广泛应用于生产过程控制、数据采集、传输通信等场合,主要用来对宿主对象进行控制。例如,对嵌入在武器装各中的嵌入式系统、在火箭中的嵌入式系统等应用中的实时性要求就极高。实时性是对嵌入式系统的普遍要求,是设计者和用户重点考虑的一个重要指标。

嵌入式系统软件的调试技术一直是一项困难而富有挑战性的技术。嵌入式系统中的软件调试与桌面软件的调试有很大的不同[1]。调试嵌入式系统时,调试器和被调试程序往往是物理上分离的。调试器运行在宿主机上,而被调试程序运行在目标机上,宿主机与目标机之间通过某种媒介进行通信。同时,还要在目标机上运行一个称为调试代理(Debug Agent)的监控程序,由它来负责与运行在宿主机上的调试器进行通信,控制被调试程序的执行,并将被调试程序的执行情况及时反馈给调试器。对一些响应时间要求在毫秒或微妙的系统软件中,在调试过程中,还要考虑设计的调试程序是否会导致系统延时、是否会破坏系统软件的高实时性要求。本文针对工程实际应用背景,提出了一种基于数组动态保存、文件记录和后期数据处理的在线调试技术,在满足系统软件高实时性要求的前提下,有效地解决了通讯数据丢包排查、数据误码率验证和运行过程中关键变量的可持续跟踪问题,对解决系统联调中出现的问题有很强的现实价值。

1 动态调试技术

程序的动态调试就是实际上机调试。根据程序编译、连接和运行时计算机给出的错误信息进行程序调试,这是程序调试中最常用的方法,也是最初步的动态调试。在此基础上,通过分段隔离、设置断点、跟踪打印等对程序进一步调试。目前常用的动态调试方法包括:

1)使用在线仿真器

随着低成本的在线调试能力的增强,如ARM的ICE[2-3](在线仿真器),通过指令单步调试变得更容易。这种方式可以查看和修改变量值,显示寄存器的内容,查看内存块。

2)使用远端调试器

通过远端调试器[4-5],登录或接管目标系统操作权限,实现读/写内存与寄存器、设置断点、单步执行和继续执行功能。

3)在IDE(集成编辑环境)中使用动态调试

很多IDE都带有动态调试功能[6],诸如:单步运行、变量监视等,有的甚至给出了寄存器、反汇编、函数调用堆栈。但上述方法通常只有在目标系统停止运行时候才可以实现。然而,很多实时系统是不能停止的,由此引出如下动态调试方法。

4)使用 assert(断言)

目前一般嵌入式操作系统都支持C或C++语言。C或C++语言有一个很实用的系统函数:assert()。一旦计算发生错误,程序就会立即终止,并提醒程序员有错误发生,在哪一行。使用断言最根本的好处是自动发现许多运行时产生的错误,但断言不能发现所有错误。

5)使用 printf()函数

对于用C或C++语言编写的嵌入式软件,可以将printf()函数来插入到代码中的关键位置来查看或输出对象的动态行为。但过度使用 printf()函数将导致程序臃肿,且会造成系统延时。当通过串口传递信息时,这个延时会更长。

6)使用文件实时保存

将变量实时写入本地文件中,通过对保存的文件进行后续分析,查看系统在整个运行过程中行为的变化情况。由于文件实时读写过程中会强制占用系统时间,所以对于一些高实时性运行环境,使用文件实时读取方式会破坏系统工作环境的完整性。

2 具体设计

基于数组动态保存、文件记录和后期数据处理的在线调试技术的具体设计流程如图1所示。

图1 在线调试技术处理流程图Fig.1 Flow chart of online debugging technique process

对上述流程图中的执行条件,可以在程序设计时预先定义好触发条件,也可以通过外部发送控制命令(如通过网络、串口或1553B总线等发送命令)来产生触发事件。为考虑程序通用性,设计如下函数:void WriteDataToBuf(unsiged char*pch,unigned short len);用于将需保存的单个数据或一串数据写入到数组buf中。

函数WriteDataToBuf使用如下:

1)存放char或unsiged char类型数据,如:unsiged char m_value=0x11; WriteDataToBuf(&m_value,1);

2)存放short或unsiged short类型数据,如 unsiged short m_value=0x1111; WriteDataToBuf(&m_value,2);

3)存放占用4个字节长度的类型数据 (long,float等),如 float m_value=12.345; WriteDataToBuf(&m_value,4);

4)存放长度为len的数组,如 unsiged char m_value[20],WriteDataToBuf(m_value,20);

为便于直观查看文件pData中数据,一般将文件pData生成后缀名为txt文件,生成的文件pData.txt一般采用16进制保存 (用户可自行定义存储方式)。对生成的pData.txt文件,依据实际应用需求,可进行后续加工处理。通常的处理方式包括:

①将变量存储的类型转换为10进制数据;

②通过其它数据分析工具进行分析,如origin,excel,matlab等,以查看数据或一串数组的变化情况;

③编写特制应用软件进行数据分析处理。

3 工程应用

某SAR(Synthetic Aperture Radar,合成孔径雷达)系统组成示意图如图2所示。

图2 SAR系统组成示意图Fig.2 Schematic diagram of the SAR system components

图中虚线框内为与SAR连接的外部设备。其中测控处理软件固化在监控分系统板载PC104中,采用QNX操作系统,编写语言为C++。测控处理软件接收的控制指令由一体化显控发送,发送的方式为非周期形式。由于为无线链路通讯方式,存在数据指令丢失的可能,为增加指令通讯的可靠性,每一控制指令连续发送3次。设一体化显控发送的指令包记为A={A1,A2,A3,A4…An},n=16。 指令包经过机载数据终端重新打包后形成指令包 B,记为 B={A,B1,B2,…Bm},m=44。 指令包A成为指令包B的子包。测控处理软件通过异步串口接收机载数据终端发送的指令包B。

为减少人工操作,一体化显控界面设计了多种一键操作模式,点击一个控制按钮,会自动发送若干条控制指令,最多会一次发出10条以上控制命令,每条控制指令重复发送3次,两条指令间隔时间在20 ms内,也即意味测控处理软件在1秒内会收到近50条控制指令。

在实际联调过程中,发现测控处理软件收到的指令包A存在丢包现象。丢包的原因可以通过链路组成形成如下猜测(如下猜测之一或其组合):

①一体化显控发送出来的指令包A已经丢包;

②指令包A经过无线链路传输到机载数据终端前已经丢包;

③机载终端接收指令包A,在处理过程及重新对数据打包形成指令包B过程中丢包;

④测控处理软件通过串口接收到完整指令包,但在处理过程中丢包。

由于虚线部分为外部设备,且已经过联调(当然没有和SAR联调过),如上猜测2)和3)暂时排除在外。而一体化显控采用VC编程,可方便验证猜测1)的情况。

为便于测试,一体化显控发送控制指令时,将某个字节定义为帧编号,每发送出一条指令时,帧编号加1。假设一体化显控发送出去的控制指令都正确的话,如果测控处理软件通过串口收到的控制指令丢包,正常的排查措施如下:

① 在测控处理软件中使用printf函数将接收到的数据通过屏幕输出的方式实时打印出来。带来的问题是,屏幕刷新速度太快,无法确认数据实际接收情况;同时频繁使用printf函数会造成系统延时,影响串口接收中断,破坏了系统实际工作环境。

②累计1 s统计接收到的正确数据包,然后通过printf()函数输出到屏幕上。带来的问题是,无法确认是哪组指令出现丢包,每组指令丢包多少;

③在测控处理软件中将从串口接收到的原始数据实时保存到文件中。带来的问题是,采用实时文件读写方式会造成系统延时,影响串口接收中断,破坏了系统实际工作环境。

④在机载数据终端送出数据时采用串口调试工具。带来的问题是,由于现场条件约束,无法使用串口调试工具。

针对上述调试手段的不足,现采用基于数组动态保存、文件记录和后期数据处理的在线调试技术来查看数据丢包率及数据丢包可能的源头。具体解决过程如下:

① 申请一个较大空间的数组,如可存字节长度为100 000个;

② 通过调试工具(一般可用网络调试工具)向测控处理软件发送数据存数组指令;

③一段时间后发送数据存文件指令,生成pData.txt文件;

④将生成的pData.txt文件用ftp工具下载到本地计算机;

⑤ 使用VC编写一个自动分析数据的软件,将文件pData.txt中的数据按照数据包B的长度进行抽取,以查看数据包B中数据是否存在数据错位;

⑥在抽取出数据包B的基础上,通过软件再抽取出数据包A。并可以根据实际情况,自动分析数据中校验和错误率、有效控制命令数、相邻数据帧编号之差等。

通过上述方法,就可以分析出数据的丢包数、丢包率、数据传输错位情况,同时可判断是由于机载数据终端送出时已丢包还是由于测控处理软件在处理过程中产生了数据丢包。最终将问题定位在猜测2)上。

4 结束语

相比较一般常用调试方法,基于数组动态保存、文件记录和后期数据处理的在线调试技术具有如下优点:1)不中断当前程序执行过程;2)对程序动态实时性能影响较小,特别是对高实时性要求的系统软件,此优点尤其突出;3)可根据实际需求保存任意时间段、任意变量的数据值,便于后续分析;4)可查看变量在毫秒或微秒级内的动态变化过程。

[1]陈云川,罗克露.嵌入式软件调试技术[M].北京,电子工业出版社,2009.

[2]张春燕.嵌入式系统调试技术初探[J].电脑知识与技术,2010,6(30):8627-8629.

ZHANG Chun-yan.Research of debugging technique to embedded system[J].Journal of Computer Knowledge and Technology,2010,6(30):8627-8629.

[3]张楷,汤志忠.一种新的高速嵌入式系统软件调试技术[J].计算机工程与应用,2003(29):59-62.

ZHANG Kai,TANG Zhi-zhong.A new high speed embedded system software debug technology[J].Journal of Computer Engineering and Applictiaon,2003(29):59-62.

[4]李红卫.嵌入式远程调试工具的研究与实现[J].微计算机信息,2009,25(2):87-89.

LI Wei-hong.Study and realization of embedded remote debugging tool[J].Journal of Control&Automation,2009,25(2):87-89.

[5]黄光红,李钢,张仁斌.通用嵌入式系统远程调试器的研究与设计[J].计算机测量与控制,2008,16(6):853-855.

HUANG Guang-hong,LI Gang,ZHANG Ren-bin.Research and design of universal embedded system remote debugger[J].Journal of Comouter Measurement&Control,2008,16(6):853-855.

[6]鲁爱国,万曦.基于vxWorks的嵌入式软件远程调试[J].舰船电子工程,2007,27(6):151-154.

LU Ai-guo,WAN Xi.Deep discourse about remote debugging of embeded software based on vxWorks[J].Journal of Ship Electronic Engineering,2007,27(6):151-154.

猜你喜欢
控制指令测控串口
城轨车辆控制指令试验装置研制
浅谈AB PLC串口跟RFID传感器的通讯应用
宏指令控制的多轴系统研究及实现
基于LabWindows/CVI与TekVISA的Tek示波器远程测控软件设计
基于现代测控技术及其应用分析
向着新航程进发——远望7号测控船首航记录
高速公路隧道通风、照明联动控制方案探讨
数字电源内部数据传输的串口通信方法实现
USB接口的多串口数据并行接收方法探索
基于蓝牙串口适配器的GPS接收机与AutoCAD的实时无线通信