新闻  |   论坛  |   博客  |   在线研讨会
走进嵌入式Linux的世界(3)
tongxin | 2009-04-13 15:12:52    阅读:830   发布文章


%A 交叉调试(Cross Debug)又常常被称为远程调试(Remote Debug),是一种允许调试器以
%A 某种方式控制目标机上被调试进程的运行方式,并具有查看和修改目标机上内存单元、寄
%A 存器以及被调试进程中变量值等各种调试功能的调试方式。一般而言,远程调试过程的结
%A 构如图4所示。
%A
%A
%A 图4远程调试结构
%A
%A 嵌入式系统的交叉调试有多种方法,可以被细分成不同的层次,但一般都具有如下一些典
%A 型特点:
%A
%A 调试器和被调试进程运行在不同的机器上,调试器运行在PC或者工作站上(宿主机),而
%A 被调试的进程则运行在各种专业调试板上(目标机)。
%A 调试器通过某种通信方式与被调试进程建立联系,如串口、并口、网络、DBM、JTAG或者专
%A 用的通信方式。
%A 在目标机上一般会具备某种形式的调试代理,它负责与调试器共同配合完成对目标机上运
%A 行着的进程的调试。这种调试代理可能是某些支持调试功能的硬件设备(如DBI 2000),
%A 也可能是某些专门的调试软件(如gdbserver)。
%A 目标机可能是某种形式的系统仿真器,通过在宿主机上运行目标机的仿真软件,整个调试
%A 过程可以在一台计算机上运行。此时物理上虽然只有一台计算机,但逻辑上仍然存在着宿
%A 主机和目标机的区别。
%A 在嵌入式软件开发过程中的调试方式有很多种,应根据实际的开发要求和条件进行选择。
%A 就调试方法而言,嵌入式系统的交叉调试可以分为硬件调试和软件调试两种,前者使用仿
%A 真调试器协助调试过程,而后者则使用软件调试器完成调试过程。
%A
%A 硬件调试
%A
%A 相对于软件调试而言,使用硬件调试器可以获得更强大的调试功能和更优秀的调试性能。
%A 硬件调试器的基本原理是通过仿真硬件的执行过程,让开发者在调试时可以随时了解到系
%A 统的当前执行情况。目前嵌入式系统开发中最常用到的硬件调试器是ROM Monitor、ROM
%A Emulator、In-Circuit Emulator和In-Circuit Debugger。
%A
%A 采用ROM Monitor方式进行交叉调试需要在宿主机上运行调试器,在目标机上运行ROM监视
%A 器(ROM Monitor)和被调试程序,宿主机通过调试器与目标机上的ROM监视器建立通信连
%A 接,它们之间的通信遵循远程调试协议。ROM监视器可以是一段运行在目标机ROM上的可执
%A 行程序,也可以是一个专门的硬件调试设备,它负责监控目标机上被调试程序的运行情况
%A ,能够与宿主机端的调试器一同完成对应用程序的调试。在使用这种调试方式时,被调试
%A 程序首先通过ROM监视器下载到目标机,然后在ROM监视器的监控下完成调试,目前使用的
%A 绝大部分ROM监视器能够完成设置断点、单步执行、查看寄存器、修改内存空间等各项调试
%A 功能。
%A
%A 采用ROM Emulator方式进行交叉调试时需要使用ROM仿真器,它通常被插入到目标机上的RO
%A M插槽中,专门用于仿真目标机上的ROM芯片。在使用这种调试方式时,被调试程序首先下
%A 载到ROM仿真器中,它等效于下载到目标机的ROM芯片上,然后在ROM仿真器中完成对目标程
%A 序的调试。ROM Emulator调试方式通过使用一个ROM仿真器,虽然避免了每次修改程序后都
%A 必须重新烧写到目标机ROM中这一费时费力的操作,但由于ROM仿真器本身比较昂贵,功能
%A 相对来讲又比较单一,因此只适应于某些特定场合。
%A
%A 采用In-Circuit Emulator(ICE)方式进行交叉调试时需要使用在线仿真器,它是仿照目
%A 标机上的CPU而专门设计的硬件,可以完全仿真处理器芯片的行为,并且提供了非常丰富的
%A 调试功能。在使用在线仿真器进行调试的过程中,可以按顺序单步执行,也可以倒退执行
%A ,还可以实时查看所有需要的数据,从而给调试过程带来了很多的便利。嵌入式系统应用
%A 的一个显著特点是与现实世界中的硬件直接相关,存在各种异变和事先未知的变化,从而
%A 给微处理器的指令执行带来各种不确定因素,这种不确定性在目前情况下只有通过在线仿
%A 真器才有可能发现,因此尽管在线仿真器的价格非常昂贵,但仍然得到了非常广泛的应用
%A 。
%A
%A 采用In-Circuit Debugger(ICD)方式进行交叉调试时需要使用在线调试器。由于ICE的价
%A 格非常昂贵,并且每种CPU都需要一种与之对应的ICE,使得开发成本非常高,一个比较好
%A 的解决办法是让CPU直接在其内部实现调试功能,并通过在开发板上引出的调试端口,发送
%A 调试命令和接收调试信息,完成调试过程。目前Motorola公司提供的开发板上使用的是DBM
%A 调试端口,而ARM公司提供的开发板上使用的则是JTAG调试端口,使用合适的软件工具与这
%A 些调试端口进行连接,可以获得与ICE类似的调试效果。
%A
%A 软件调试
%A
%A 软件调试通常要在不同的层次上进行,有时可能需要对嵌入式操作系统的内核进行调试,
%A 而有时可能仅仅只需要调试嵌入式应用程序就可以了。在嵌入式系统的整个开发过程中,
%A 不同层次上的软件调试需要使用不同的调试方法。
%A
%A 嵌入式操作系统的内核调试相对来讲比较困难,这是因为在内核中不便于增加一个调试器
%A 程序,而只能通过远程调试的方法,通过串口和操作系统内置的"调试桩"(debug stub)
%A 进行通信,共同完成调试过程。调试桩可以看成是一个调试服务器,它通过操作系统获得
%A 一些必要的调试信息,并且负责处理宿主机发送来的调试命令。具体到嵌入式Linux系统内
%A 核,调试时可以先在Linux内核中设置一个调试桩,用作调试过程中和宿主机之间的通信服
%A 务器,然后就可以在宿主机中通过调试器的串口与调试桩进行通信,并通过调试器控制目
%A 标机上Linux内核的运行。
%A
%A 嵌入式应用软件的调试可以使用本地调试和远程调试两种方法,相对于操作系统的调试而
%A 言,这两种方式都比较简单。如果采用的是本地调试,首先要将所需的调试器移植到目标
%A 系统中,然后就可以直接在目标机上运行调试器来调试应用程序了;如果采用的是远程调
%A 试,则需要移植一个调试服务器到目标系统中,并通过它与宿主机上的调试器共同完成应
%A 用程序的调试。在嵌入式Linux系统的开发中,远程调试时目标机上使用的调试服务器通常
%A 是gdbserver,而宿主机上使用的调试器则是gdb,两者相互配合共同完成调试过程。
%A
%A 3.4 系统测试
%A
%A 嵌入式系统的硬件一般采用专门的测试仪器进行测试,而软件则需要有相关的测试技术和
%A 测试工具的支持,并要采用特定的测试策略。测试技术指的是软件测试的专门途径,以及
%A 能够更加有效地运用这些途径的特定方法。在嵌入式软件测试中,常常要在基于目标机的
%A 测试和基于宿主机的测试之间做出折衷,基于目标机的测试需要消耗较多的时间和经费,
%A 而基于宿主机的测试虽然代价较小,但毕竟是在仿真环境中进行的,因此难以完全反映软
%A 件运行时的实际情况。这两种环境下的测试可以发现不同的软件缺陷,关键是要对目标机
%A 环境和宿主机环境下的测试内容进行合理取舍。
%A
%A 测试工具指的是那些能够用来辅助测试的工具,测试工具主要用来支持测试人员的测试工
%A 作,本身不能直接用来进行测试,测试工具一般都是通用工具,测试人员应该根据实际情
%A 况对它们进行适当的调整。嵌入式软件测试中经常用到测试工具主要有内存分析工具、性
%A 能分析工具、覆盖分析工具、缺陷跟踪工具等。
%A
%A 内存分析工具
%A
%A 嵌入式系统的内存资源通常是受限的,内存分析工具可以用来处理在进行动态内存分配时
%A 产生的缺陷。当动态分配的内存被错误地引用时,产生的错误通常难以再现,可出现的失
%A 效难以追踪,使用内存分析工具可以很好地检测出这类缺陷。目前常用的内存分析工具有
%A 软件和硬件两种,基于软件的内存分析工具可能会对代码的执行性能带来很大影响,从而
%A 影响系统的实时性;基于硬件的内存分析工具价格昂贵,并且只能在特定的环境中使用。
%A
%A 性能分析工具
%A
%A 嵌入式系统的性能通常是一个非常关键的因素,开发人员一般需要对系统的某些关键代码
%A 进行优化来改进性能,而首先遇到的问题自然就是确定需要对哪些代码进行优化。性能分
%A 析工具可以为开发人员提供有关的数据,说明执行时间是如何消耗的,是什么时候消耗的
%A ,以及每个进程所使用的时间。这些数据可以帮助确定哪些进程消耗了过多的执行时间,
%A 从而可以决定如何优化软件,以获得更好的时间性能。此外,性能分析工具还可以引导开
%A 发人员发现在系统调用中存在的错误以及程序结构上的缺陷。
%A
%A 覆盖分析工具
%A
%A 在进行白盒测试时,可以使用代码覆盖分析工具追踪哪些代码被执行过,分析过程一般通
%A 过插桩来完成,插桩可以是在测试环境中嵌入硬件,也可以是在可执行代码中加入软件,
%A 或者是两者的结合。开发人员通过对分析结果进行总结,可以确定哪些代码被执行过,哪
%A 些代码被遗漏了。目前常用的覆盖分析工具一般都会提供有关功能覆盖、分支覆盖、条件
%A 覆盖等信息。
%A
%A 四、小结
%A
%A 现今的嵌入式系统在网络化潮流的推动下,已经逐渐摆脱过去那种小巧而简单的模式,开
%A 始进入复杂度高、功能强大的阶段,吸引了许多程序设计人员和硬件开发人员的视线。本
%A 文讨论了嵌入式Linux系统的基本知识、开发流程、开发工具、调试工具、测试工具等,并
%A 指出了嵌入式系统的开发与一般通用计算机软件开发的不同点及应该注意的事项,这些都
%A 是今后在进行嵌入式Linux系统开发时必须具备的基础知识。
%A%A
%A

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
最近文章
寂寞如雪
2009-05-19 19:01:18
夜色花
2009-05-19 18:56:22
没有爱可以重来
2009-05-19 18:54:59
推荐文章
最近访客