新闻中心

EEPW首页 > EDA/PCB > 调试你的嵌入式软件

调试你的嵌入式软件

——
作者:时间:2006-12-19来源:收藏
软件调试工具的目的就是尽可能的揭露CPU内部工作情况和软件的执行状态。软件开发者用不同的专业化工具来调试固件(具有软件功能的硬件),而用来描述它们的术语却容易引起混淆。下面就是这些工具的概述。
内部电路仿真器(in-circuit emulator, ICE)

ICE是用来仿真CPU核心的设备,它可以在不干扰运算器的正常运行情况下,实时的检测CPU的内部工作情况。像桌面调试软件所提供的:复杂的条件断点、先进的实时跟踪、性能分析和端口分析这些功能,它也都能提供。

ICE一般都有一个比较特殊的CPU,称为外合(bond-out)CPU。这是一种被打开了封装的CPU,并且通过特殊的连接,可以访问到CPU的内部信号,而这些信号,在CPU被封装时,是没法“看到”的。

当和工作站上强大的调试软件联合使用时,ICE就能提供你所能找到的最全面的调试功能。但ICE同样有一些缺点:昂贵;不能全速工作;同样,并不是所有的CPU都可以作为外合CPU的,从另一个角度说,这些外合CPU也不大可能及时的被新出的CPU所更换。

ROM监控器(ROM monitor)

ROM监控器是一小程序,驻留在嵌入系统ROM中,通过串行的或网络的连接和运行在工作站上的调试软件通信。这是一种便宜的方式,当然也是最低端的技术。

它除了要求一个通信端口和少量的内存空间外,不需要其它任何专门的硬件。并提供了如下功能:下载代码、运行控制、断点、单步步进、以及观察、修改寄存器和内存。

因为ROM监控器是操作软件的一部分,只有当你的应用程序运行时,它才会工作。如果你想检查CPU和应用程序的状态,你就必须停下应用程序,再次进入ROM监控器。

在线调试(on-chip debugging, OCD)或在线仿真(on-chip emulator)

特别的硅基材料以及定制和CPU管脚的串行连接,在这种特殊的CPU芯片上使用OCD,才能发挥出OCD的特点。用低端适配器就可以把OCD端口和主工作站以及前端调试软件连接起来。从OCD的基本形式看来,它的特点和单一的ROM监测器是一致的,但是不像后者需要专门的程序以及额外的通信端口。

有两种普遍的OCD接口:

摩托罗拉的背景调试监测(Motorola’s Background Debug Monitor,BDM)

Joint Test Action Group(JTAG):虽然它最初开发出来是为了监测IC和电路连接,但是这种串行接口扩展了用途,包括对调试的支持。

这些接口在底层方面的操作差异较大,但是BDM和JTAG仿真器给终端用户提供同样的便利。

近来,更多的加强型OCD接口提供额外的管脚来收集实时跟踪信息。显而易见,用狭窄的串行接口来捕获快速的实时跟踪信息是比较吃力的。但是,高端调试软件可以让加强型OCD接口模拟ICE的功能,而且,这样做的成本较低。

另有一些高端软件的调试包把通过逻辑分析器收集的实时跟踪信息和标准OCD端口的运行控制特征包含到一起了

除了调试系统的高级工具,许多的项目能够完美地使用诸如发光二极管(LED)、串口和示波器这样的简单设备调试。

串行口


许多嵌入式的主板都具有一个RS232串行口,它允许你将调试信息传送到PC工作站上标准的COM口上。如果你的嵌入式对象还有剩余的内存空间,你就可以使用标准的puts()、printf()或者相等同的函数来发送有用的调试信息。

如果你正在使用Windows工作站,你就只需要运行一个终端仿真器程序来显示来自的嵌入式对象的调试信息。一个比较好的程序是HyperTerminal,它是Windows操作系统自带的。我觉得一个更好的(免费)程序是Tera Term(Pro)

发光二极管

一个简单的状态LED在某些系统上可能被当作奢侈品,但是它能够极为有效地帮助调试。(至少我会认为没有什么别的东西能够提供类似的功能。)

除了看到LED在代码某个点处开始发光或者闪烁所带来的提示之外,你还可以使用长或者短闪烁来表示大量的错误和状态报告——这只需要一点点想象力。这不是艺术的表现,但是很多嵌入式系统的开发人员只有一两个或者稍多的LED来调试小型嵌入式系统。

示波器

示波器可能是基本调试辅助工具中最强大的一个,而且它不仅仅只能够用于调试硬件。

一个基本的模拟示波器就足够了,但是有数字示波器会更好。好的示波器会有两个或者更多的频道,再加上一个额外的外部触发脉冲输入频道,这个频道带有综合触发系统和延迟扫描。示波器能够让你看到你的程序对外部端口和外设的访问,并能够监测软件的活动。

下面是在你调试嵌入式软件的时候应用示波器的几种方法:

  • 对你需要观察的针对活动的事件使用一个空余的外部输出插脚,或者用这个插脚来显示活动的情况。
  • 在函数开始的时候设置插脚,再在结束的时候拿掉它,以测量函数的执行时间。你可以以类似的方式检测中断的潜伏时间。
  • 如果CPU卡在了循环里,那么就要检查地址总线的状态,以大概地查看CPU卡在哪个地方了(当然,这要假设你正在使用外部内存)。
  • 检测中断路,以查找阻塞的中断,或者检测外设未正常初始化而导致的中断缺失。
  • 大多数调试工具都无法在系统初始启动的时候提供任何帮助,但是你可以在系统周期性复位的时候使用示波器,用以观察地址和数据总线的活动,以追踪CPU在复位之后的活动进展。
不要节约

最后,不要在高质量的调试工具上节约。尽管这些基本的工具都是极其有用的,但是更加昂贵和综合的工具如果能够节省你数周昂贵的调试和工程努力,那么它们就总是物有所值的。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


关键词: 嵌入式

评论


相关推荐

技术专区

关闭