||
介绍
你可能感到奇怪,为什么说BDM的禅义。BDM(背景调试模式,background debug mode)与其它的调试在执行和步骤上都是不同的。一旦你完全明白了这种类型的调试是如何工作的,它背后的精神,有助于你将最大限度的发挥它的作用。
在我们进一步讲解之前,请注意BDM这个术语。BDM是motorola对一种调试方法的称谓。它也指微控制器上的BDM端口。其它的芯片和制造商用JTAG口(IBM),ONCE口(MOTOROLA),MPSD口(德州仪器),等等。这些将要讨论的端口,即使实际采用的是JTAG口,我们仍称为BDM调试。为了清楚起见,我在提到它的时候用“on chip debugging”或者OCD。这包含了各种各样的使用片内资源进行完全的软件调试和部分硬件调试的芯片,包括出自于IBM、TI、AD、MOTOROLA等等的处理器。
这篇文章是OCD调试的总体介绍,包括它是什么,如何充分的使用等。假定你对调试有一定的熟悉,无论是微处理器/微控制器的初学者还是行家,将会从这里获益很多。
整篇文章,我将尽可能详细介绍各种不同芯片是如何使用这种类型的调试。这些信息是来自于各种不同资源。Motorola免费发布了有关使用和实现它们的片上调试功能的相关的信息。这些信息,德州仪器收取了几千美元的费用。
第一章 过去 对于微控制器新手来说是一次回顾。
调试的历史 回顾嵌入式系统设计的各种各样的曾经流行的调试方法。
局限性 讨论上述方法的局限性。
第二章 OCD
什么是OCD 是硬件或软件? 描述各种不同的OCD实现方法,准确的知道OCD是什么。
OCD的类型 定义市场上不同的处理器
设计你的原型 给出设计原型的要点和建议
设计你的产品 给出如何在最终产品上使用OCD的要点和建议。
选择调试器 讨论选择调试器,发挥OCD的功效。
关于作者
作者是macraigor system公司的总裁。公司从事嵌入式系统调试工具的生产。
第一章
这章不是给行家,经验丰富的调试者,ICE的领袖等这样的人看的。这里只是单纯的回顾一下这些年来微处理器和微控制器调试艺术的历程。这些背景对我们理解片内调试有帮助。第二章是片内调试的详细信息。
调试的历史
首先是“擦和烧”的调试方法。我们都要这样做多次然后才得到正确的结果。如果你决定做一个纸飞机。你尽你的最大能力去叠好它,掷出去,它像车钥匙一样坠落。你会怎样做?A:用慢镜头观看它的飞行过程,研究它,修改你的设计。B:租用麻省理工学院的风洞。C:重新弄好,再掷一次试试。D:声称突然的俯冲也是一种功能。
你写你的代码,检查一次两次,烧写EPROM,运行。如果不工作,你再看看代码。我们所有的工具都是干这个的。这是不必要的不好的方法,非常的慢。
有几种方法可以提高擦写,如果你愿意可以进行更高一级的擦写。我们可以在代码的不同地方放一些输出信息。如果足够幸运,有显示器或者LCD设备,不同的任务或者子程序通过显示信息宣称它们执行了。简单的说,在代码某个地方LED会闪烁或者点亮。如果代码陷入死循环,错乱等,我们就会知道问题处在最后一次正确输出的附近。
过了一些时候,硬件单步执行的想法得到了实现。这使得你可以让处理器执行一条指令然后停下来。在这一点,不同的信号可以被检查,等等。你可以决定什么代码可以被执行。Intel8041是一个早期的控制器,它可以通过一个简单的外部硬件电路实现单步执行。
在历史的目某个时期,有人提出调试监视的想法。用一小块代码帮助调试。它通常通过串口和计算机或其它的终端进行通讯。一个基本的监视程序允许代码下载,读写存储器和寄存器,或许还可以设置断点,单步执行,实时执行。更复杂的监视允许代码压缩,复杂端点设置等等。
不久以后,一种新型的器件被引入。ROM仿真器插在目标板上代替ROM芯片。这个器件通过串口、并口或者最近的网口连接到主计算机。最简单的系统,ROM仿真器允许快速的代码下载(相对于编程器烧写ROM)和擦写。在比较好的系统中,你可以下载包含ROM监控的代码,可以通过仿真接口进行通讯监视。
与ROM仿真器相似,下一个在调试上的重要突破是使用友好的在电路仿真器(ICE)。这中芯片允许对处理器的程序源代码进行完全的访问,硬件端点,跟踪和其它的功能。ICE通常是使用特殊型号的称为“bond-out”的处理器。这种芯片有更多的脚,把典型的内部信号送到片外进行监视和利用。系统或者外部的存储器同样被支持,可以被映射到用户空间。这允许在目标系统没搭建好就进行调试。典型的ICE具有复杂的硬件和软件,当然比基于监视的调试器要贵得多。
最后一个加到调试器行列得是片内调试(OCD)。最早得OCD是写入到目标系统微码中去的基本的调试监视器。更先进的是同加入了一些其它的功能如实时读取PC,近乎实时的读取存储器的内容。基本的OCD允许代码下才,读写存储器和处理器资源,单步执行,处理器复位及其状态(运行或者停止)。典型的,片内外设在OCD期间休眠(相对与芯片执行用户代码的情况)。
一些芯片用其它的资源来增强它们的OCD,实现完全的片内调试。IBM4XX POWERPC系列有一个7芯的接口(RISCTRACE),作为OCD的补充,允许完全跟踪处理器执行的过程。简单的实时捕捉这些线,调试器就可以显示最后若干条执行过的指令。
局限性
擦烧这种调试方式耗费时间和金钱。它比花大量时间来捉虫更划不来。用这种方法调试就像在黑屋子里确定一个机械设备的位置。把灯打开,采用其它的调试方式。
ROM监视的调试能力是非常有力的。最早的碰到的是类似与鸡和蛋问题。如果你为一个新的处理器写一个监视程序,你如何调试它?通常,你通过擦写这完成基本的通讯功能。接着,你增加一些调试功能做一些修改,或者多次的擦写,使得调试监视器能够工作。如果比较好的话,你写了一个知名的监视程序,这不会花费你太多的时间。
另外一个ROM监视的缺点是目标处理器始终在运行。为什么这是一个问题。许多处理器(特别是一些小的控制器)有外设或这功能,它们不会停止。举个例子,motorola的68HC05的定时器连续运行,因此任何对定时器中断的调试都是困难的。这包括了实时的调度。
ROM监视,监视程序在ROM中。因此你必须留一些ROM给监视代码。有些处理器会将监视代码转移。比如motorola的68HC11,在启动的时候会将代码载入ram。总之,监视程序必须驻留,占用256到30K的空间。
通常ROM监视只能RAM中的代码。这意味着你的目标系统必须有足够的空间放下这些代码,最终产品中有同样多的ROM空间。把代码放在ram空间的主要是为了控制程序的执行。主端点是通过软件实现的(插入“trap”指令),因此必须在RAM中。单步执行是通过在适当的地方插入端点来实现的。
ROM监视使用了处理器资源或者要求外部的硬件。监视程序必须和外部的调试程序通讯,这要求一个UART。可能是一个片内UART,或者外部UART,这要求一些特定的外部资源。
最后,既然ROM调试在目标处理器中运行,在复位后它通常做一些初始化。可能包括初始化片选,设置堆栈指针,清存储器等。如果目标代码不恢复这些初始化,目标代码与调试时的环境就会不同。这是建立在系统复位后,产品不会进入到ROM监视中。这是非常重要的一点。再者,最终代码可能会和测试代码不可能运行在同一个环境中。
ROM仿真主要的限制是只能用于含有外部ROM的系统。这把单芯片模式的许多处理器排除在外。另外,它实质上是执行ROM监视,上面提到的缺点它也有。
在电路仿真也有一些缺点。……
另外,在电路仿真并不是有效的。许多新的微控制器实际是为了单个客户设计的。这个客户肯能买成百上千的芯片,但是只要三四个调试器。为三四个调试器进行开发显然是不值得的。惠普的解决方案是分布式仿真,基于OCD调试和逻辑分析仪给给单个客户创造一个个人ICE。
在电路仿真通常都是比较贵的。它们包括高速的存储器、ASIC、特定的适配器。
比较好的方面式,ICE可以进行典型的实时跟踪,不占用用户资源,允许在没有目标板的情况下调试。
对于OCD,没有缺点。
严格的讲,它也有一些缺点。目标调试的时候通常需要RAM代替ROM,但是不总是需要。通常不是实时的追踪,但不是总是这样。
第二章
OCD是什么?硬件、软件、……
一般说来,片内调试是硬件和软件的结合体,包括片内和片外。驻留在片内的这个东西可以通过不同的方法来实现。它可能是基于监视器的微码或者硬件资源。这些硬件资源可能是对最终用户同样有效的的断点寄存器或者是仅仅用于OCD的专门性的硬件,比如指令填充缓冲器。
片内调试不需要太多的外部硬件,尽量的少用。必须在调试主机和芯片之间通讯。大部分是通过双排的插头和处理器上的几个脚。IBM403使用的是几个JTAG脚,再加上RESET、电源和地,以及16脚的双排插头。Motorola的BDM通常情况下使用的是5个专门的脚(有时候和和实时执行功能复用),电源,地以及最少一个复位脚,终端都是10脚的双排插座。许多DSP芯片使用德州仪器的标准JTAG接口。Motorola增加了接口的内部定义以包括它的DSP上的BDM(OnCE)。
片内资源仅仅是故事的一半。一个拥有OCD处理器和双排插座的目标板是没有用处的,除非你调试主机和它通讯。主机运行你的调试软件和界面。调试软件在主机上执行用户界面显示你的代码,处理器资源,目标存储器灯。硬件接口可能是几种类型中的一种。最简单的是“wiggler”,将IBM PC机的并口连接到OCD接口。这是简单也是最慢的。其它的是串口(RS232)到OCD转换(Cygnus),高速并口到OCD(Macraigor Systems),网口到OCD(Cygnus,Macraigor Systems),ISA总线卡到OCD(Nohau),以及其它的。主机软件的价格从49美元到几千美元。硬件通常的价格是100美元到3000美元。
OCD的类型
BDM(Motorola CPU16,CPU32,ColdFire)
……
嵌入式的PowerPC BDM(Motorola MPC5xx,MPC8xx)
……
OnCE(On-Chip Emulation)
……
JTAG debugging(PPC6xx,IBM 4xx ,TI C90, Analon Debices ,SHARC)
……
设计你的原型
为耸褂?lt;/SPAN>OCD的优点,设计原型的时候,你有很多的事情要考虑。
1:使用它
这听起来很简单,但是很多设计人员习惯了ROM监视或者仿真器而不愿意使用片内调试功能。如果你不想使用这个功能,可能设计组的其它成员或者整个团队愿意。
2:在你的板子上放一个特定的接口
如果原型不和PC板一样,应该有空间放一个接口。如果没有空间,还有其它的选择。从制造商和你准备用的调试软件那看一下接口的定义。你将会发现有些不用的信号线。IBM的RISCWatch接口包含几个没有连接的信号线和关键的线。如果必要,你可以用一个小的接口去代替,做一个转换器。Motorola的16和32位CPU的BDM包含两根地线和数据探针线。通常,一根地线就足够了,大部分调试器不使用数据探针。接口不一定必须是双排插座。虽然有规定,为了方便可以修改以适应你的需要。但请注意布线,这对保持较高的速度是有帮助的。如果你使用wigger,这不是一个问题因为数度不超过100kbps。
3:观察这些线
最好保持OCD连接器与CPU之间比较近,通常它们之间没有缓冲。保证这些线长度基本相等,尤其是串行通讯线。对于motorola是DSI,DSO和DSCK。对于JTAG接口是TMS TDO TDI和TCK。我曾经在低速的wiggler上发现过问题,线从