微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > 数字信号处理(DSP )系统测试和调试

数字信号处理(DSP )系统测试和调试

时间:11-25 来源:互联网 点击:
在软件开发领域,最关键但也是最无法预料的阶段是调试阶段。在软件调试的过程中有很多要素都举足轻重,而其中最重要的则是时间。设置和调试软件所需的时间对于软件的上市时间以及是否满足客户期望都有着巨大的影响,同时还影响着一个在市场取得成功的优秀产品的销售业绩。一个应用的集成必须经过一个由构建、加载、调试/调谐到更改等多个阶段构成的过程,如图1 所示。



图1:集成和调试周期。我们的目的是要将这一周期的次数以及在每个部分花费

嵌入式实时系统的调试既是一门艺术,又是一门科学。用于调试和集成这些系统的工具和技术对于在调试、集成和测试阶段上所需时间的长度有着重要影响。对运行中的系统越了解,我们就能越快发现并修正缺陷。

要了解系统有一个最传统也是最简单的方法,即在软件中的某些点添加消息,以便输出有关系统状态的信息。这些消息可以是输出到显示器的“打印”指令,也可以通过LED 或者LED 组闪烁的形式来系统状态和健康度。每个功能或任务都可以通过输出一个状态信息来开始指示是系统将之安排到程序中的某个点。如果系统在某个点出现故障,对于这一输出信息的诊断就可以帮助工程师了解到系统最后一次正常状态点的所在,从而确认问题所在。当然,这种方式会导致系统过载,进而影响系统性能。因此,工程师必须在测试完系统后清除这些数据并在销售之前对系统重新验证,或者将系统和系统中测得的代码一起销售。他们必须确保所工程师可以利用更先进的调试方法来减少集成和测试阶段的时间。其中一个方法就是利用“调试监视器(debug monitor)”。调试监视器是一种嵌入到目标应用或集成到微控制器或DSP 内核的相对较小的代码,通过一个串行接口和主机进行通信。调试监视器可以下载代码、读写DSP 存储器和计数器、设置简单和复杂的断点、单步执行程序并绘制源代码概图。

另一种名为ROM 仿真器(ROM emulator)的调试监视器则常被用于带有基于ROM的软件程序的系统中。ROM 仿真器是一个用来代替目标系统ROM 设备的插件。这一插件和主机相连(通过串行、并行、以太网等连接方式),让工程师可以缩短调试过程的周期时间。工程师不需要在每次软件迭代时都通过ROM 编程程序对ROM 设备进行重新编程,而是可以将这个代码下载到ROM 仿真器的快速RAM 上。

接着,系统就会以代码脱离ROM 设备运行的状态运行。

调试监视器和ROM 监视器对嵌入式系统调试阶段无疑能带来很大的益处,但是,随着嵌入式处理器变得越来越快,而且系统不断转向单片系统方案,处理器的透明度就形成了更大的挑战,要求更加尖端的调试方案。

集成和调试复杂的数码系统也需要简短而复杂的调试工具,如逻辑分析仪等。系统集成商可以通过逻辑分析仪来捕捉数字信号,并以位、字节和文字格式显示出来,还能分析以下设备的活动:

数字计数器
复杂状态机
缓冲器和FIFO
系统总线

另外,逻辑分析仪还可以分析FPGA、ASIC 和标准单元执行等其它片上系统功能。它不需要太大的学习曲线,但要求较高的初始投资(取决于对于它的能力的要求以及需要什么样的时钟率)。系统集成商可以在逻辑分析仪中采取触发机制,来将数据捕捉到大型缓冲器中。这种数据可以是预触发数据或后触发数据,也可以是二者的结合体。数据轨道可以被保存并打印出来,数据也可以通过各种不同方式进行过滤。

应用逻辑分析仪的一个主要缺点在于,它虽然可以用来进行软件调试,本身却是复杂的硬件调试工具。对逻辑分析仪的运用是否成功,取决于系统集成商对于硬件的了解程度,因为这一工具是基于硬件调试的,而且需要通过复杂的设置和配置才能获得正确的信息以进行调试。

逻辑分析仪的另一个缺点,则是信号的可见性。逻辑分析仪需要连接到DSP 设备的管脚上,才能深入了解系统,而这会受到DSP 管脚的类型的限制。随着DSP设备被越来越多地集成到片上系统中,设备内部的运行情况的可视性也不断减弱。

日益降低的可视性
1988 年,由于设计时间压力的增大,而且嵌入式设备上有了用于片上仿真的新空间,嵌入式系统行业经历了一场从传统的在线仿真到扫描式仿真的变革。目前业界普遍认为扫描式仿真(即JTAG)要好于更古老而且更昂贵的“在线仿真”(即ICE 技术)。

DSP 在调试上的问题

有数个源自业界的因素在不断改变着DSP 系统的开发:

系统级集成;由于应用复杂性的增加和片上系统面积的缩小,系统元件的可视性也降低了。(图2)嵌入式系统总线会带来测量上的难题,而系统总线过宽则会导致系统带宽问题。在这些情况下要控制程序是很难的。



 图2:系统级集成导致系统可视性降低

为了保持可视性,DSP 厂商采取了多项措施:

片上测量( On-chip instrumentation):由于系统集成度越来越高,工程师无法了解到设备的工作情况(图3)。工程师于是把总线监视逻辑分析仪功能加到片上逻辑中,比如,通过触发逻辑来他们想要了解的事件、整理线索并导出逻辑,以便可以浏览事件,并使DSP 内核上每个管脚输出的带宽都最大化。调试控制则是通过1 个仿真器来进行的,可以进行信息抽取。



 图3 日益降低的可视性要求先进的片上调试逻辑

片外数据采集:一旦数据被从DSP 内核中导出,就必须被以适当的方式存储、处理、过滤并格式化,以使测试工程师能够准确地理解这些数据。

数据可视性:DSP 的集成能力包括能够很轻易以不同的配置浏览数据。图4 展示了整个关系链。其中逻辑分析仪的功能已经被集成到片上,控制和测量数据采集主要通过仿真控制器来进行,而数据则显示在主机上的一个可视容器中。这样一来,恰当地配置系统,在正确的时间采集正确的数据以恰当地发现问题,就成了主要挑战。



图4:DSP 工具被用来显示抽取自DSP 的调试数据

应用空间差异:DSP 应用越来越多,给DSP 测试和集成工程师带来了困难。应用不同,调试的成本就不同:DSP 基站应用要求高带宽高频率调试。

VoIP 应用要求较高的MIPS 密度,并需要每块板上有多个同类处理器。
手机和其它无线应用则需要不同类的多处理器以及极高的系统级集成。
汽车DSP 应用只需低成本的调试方案,其中DSP 芯片管脚非常重要。
用户开发环境;DSP 开发商的开发环境在改变,而DSP 调试技术也在改进,以适应这些新的开发环境。DSP 工程师正在将调试平台从台式电脑系统向笔记本电脑系统过渡,以便能带到现场在客户的场所下进行调试。便携式远程应用要求便携式DSP 调试环境。

时钟率不断升高:随着DSP 内核时钟速率的升高,调试所需的数据量也不断扩大。
实际上,这个数据量是直接和DSP 内核时钟率成比例的。工程师需要增加DSP管脚,并扩大每个管脚的数据量,以确保能够了解到设备的运行情况。

各种级别的DSP 调试在集成过程中提供了各种作用。用户的体验使之能够尽快地提高生产力。基本的调试让DSP 开发人员可以配置好应用并使之运行,实时捕捉高带宽数据等高端调试让开发人员能使应用实时运行,而基本调整则帮助开发人员调整代码大小和性能。

片上和片外仿真的结合则能带来很多好处。实时执行控制可以带来移动、运行、断点(程序计数器)和数据观察点等标准功能。更高端的事件触发可带来设备可视性,并控制程序员模式。实时数据采集可通过调节一个稳定的程序来提供算法的实时可视性。而追踪功能则让工程师可以在整个调试不稳定程序过程中实时了解程序装况。

本系列的第二章将讨论JTAG (IEEE 1149.1)边界扫描技术的工作原理,并详细说明了与JTAG 端口相关的10 个测试管脚和测试过程。

注:在线仿真技术以一种作用类似于或者说“仿真”原始设备的设备来取代目标处理器,但带有额外的管脚来使总线等设备上的内部结构可以被看到。ICE 模块可允许完全接入处理器的程序员模式。这些设备也允许硬件断点、执行控制、跟踪等调试功能。

JTAG 技术简介

收缩技术(shrinking technology)的一个劣势在于,测试小型器件的复杂程度急剧升高。当电路板面积较大时,板的测试是通过采用钉床等技术来进行的。这种技术采用小型弹簧式测试探针来和板底部的焊盘进行连接。这种测试方案是定制的,不仅成本太高,而且效率低下,而且在设计完成之前很多测试都无法进行。

随着电路板面积的缩小,以及表面贴装技术的改进,钉床测试的问题不断增多。

而且,如果一块电路板两面都安插了器件,根本无法留下任何可使电路板安放到测试器件上的依附点。

边界扫描(Boundary scan)

1985 年,一个欧洲电子公司组织联合起来,试图寻找能够解决这些问题的方案。该组织名为联合测试行动组,制定了一个用于在集成电路级别上进行边界扫描硬件测试的规范。1990 年,IEEE 将该规范制定为IEEE 1149.1 标准,在其中说明了通过一个JTAG 端口接入任何芯片的详情。

边界扫描技术可以通过少数的专用测试管脚在嵌入式系统上进行大量调试和诊断。信号被连续扫描进出器件的I/O 单元,以在各种情况下控制其输入并测试输出。如今,边界扫描技术几乎成为业界最为流行并通用的可测性设计技术。

测试管脚

系统中的器件是通过一组I/O 管脚来和外界通信的。如果只靠这些管脚本身,我们无法详细了解器件内部的情况。但是,支持边界扫描的器件中有一种位移寄存器,器件的每个信号管脚都有一个。如图5 所示,这些寄存器以一个特别的路径连接在器件的边界上(边界扫描因此而得名)。这样就将每个普通输入端口都包围起来,并直接控制器件及输出端上的可视性。



图5 一个采用了JTAG 边界扫描的标准集成电路

在测试中,器件的I/O 信号通过边界扫描单元进出芯片。经过配置,边界扫描单元可以支持外部测试,以测试芯片间的互联,也可以支持内部测试,测试芯片内部的逻辑。

为了提供边界扫描功能,IC 厂商必须在他们的器件上添加逻辑,包括每个信号管脚上的扫描寄存器、一个连接这些寄存器的专用扫描路径、4 个(需要时可添加5 个)额外的管脚以及额外的控制电路。

添加这个逻辑并不会产生太多的负载,而且为了实现板级的高效测试能力,这样的成本也是值得的。这些边界扫描控制信号被统称为测试接入端口(TAP),定义了一个用于扫描式器件的串行协议:

TCK/时钟- 同步内部状态机操作。
TMS/模式选择- 在TCK 的上升沿被采样,以决定下一个状态。
TDI/数据进入- 当内部状态机处于正确状态时,这个信号在TCK 的上升沿被采样,被转移到器件的测试或编程逻辑。
TDO/数据输出- 当内部状态机处于正确状态时,这个信号表示数据被从器件的测试或编程逻辑转移出去,并在TCK 的下降沿有效。
TRST/重置(可选功能)- 当TCK 下降至很低时,内部状态机会自动重置。
TCK、TMS 和TRST 输入管脚驱动着一个有16 种状态的TAP 控制器状态机。TAP控制器控制着数据和指令的交换。它根据每个TCK 上升沿的TMS 信号数值来进入下一个状态。只要接线方式无误,就可以对多个IC 或电路板进行同步测试。边界扫描描述语言文件定义了各个器件的边界扫描逻辑的功能。

测试过程

通过边界扫描技术验证一个器件(或电路板)的标准测试过程如下:

测试人员将测试或诊断数据加到器件的输入管脚上。
边界扫描单元在监控输入管脚的边界扫描寄存器中捕捉数据。
数据通过TDO 管脚扫描出器件,用于验证。
数据可通过TDI 管脚扫描进器件。
测试人员在器件的输出管脚上验证数据。

简单的测试可以发现一些制造缺陷,例如器件管脚断开、器件缺失、电路板上的器件位置不正确或者方向倒反等情况,甚至能检测到有故障的或者无法工作的器件。

边界扫描技术的主要优势在于它能够独立于应用逻辑来观察器件输入上的数据,并控制输出的数据。另一个关键优势是它可以降低接入设备所需测试点的总数量。有了边界扫描,就不再需要物理测试点,从而降低电路板制造成本,并提高封装密度。

边界扫描的诊断功能要好于其它测试方法。传统的技术是将测试矢量(测试模式)加到器件的输入,并监控输出。如果测试中发生问题,需要很长的时间才能隔离问题,并且需要进行重新测试。而在边界扫描技术中,边界扫描单元可以通过监控器件的输入管脚来观察器件响应,从而轻松隔离各种测试故障,比如管脚和电路板不接触的问题。

边界扫描可以用于各种级别的功能测试和调试,从内部IC 测试到板级测试,甚至能用于硬件/软件测试中。

有些测试设备和ASIC 单元供应商就给自己的产品增加了JTAG 功能来执行软件调试功能。通于内置到目标CPU 中的功能支持,这个接口可以用下载代码、执行代码并检查寄存器和内存值。这些功能已经囊括了一个标准调试器的大部分低级别功能。另外,还可以在工作站或者电脑上运行一个成本不高的远程调试器,来软件调试提供支持。

边界扫描技术还被用来仿真。通过控制扫描信息在目标和调试器窗口之间的传输,仿真器的前端可以行使扫描管理器的功能。当然,当有一个主机来控制JTAG扫描信息时,必须让连接到这一扫描链中的其它器件也获知这一点。

JTAG 还让设备的内部组件都可以被扫描(例如CPU)。这使得JTAG 可以接入所有能通过CPU 接入的设备,因而可用来调试嵌入式设备,同时还能全速进行测试。

这已经成为了硅厂商使用的一个标准仿真调试方法。JTAG 还可进行系统级调试。

如果给设备添加额外的管脚,就能实现额外的系统集成功能,包括基准化、绘制概图和系统级断点等。

设计周期时间压力是由以下几个因素造成的:

集成等级的提高- 更多功能被集成到一个设备中,而不是添加离散器件。

时钟率提高- 外部支持逻辑导致的电气干扰。

更精密的封装- 这产生了外部调试连接性问题。

如今,这些同样的因素交织在一起,给为当前复杂的、更高时钟率的高集成设计提供所需的系统调试能力的扫描类仿真器形成了极大的挑战。现在的系统正在变得越来越小、越来越快而且越来越便宜。它们的面积密度越来越大,性能越来越高。系统发展的这些积极趋势,却给对系统活动的观察产生了反作用,而系统可视性却正是快速部署的关键因素。这个效应就叫做“日益下降的可视性”。

片上系统(SoC)模式将一个完整系统所有的功能都集成到了一张硅芯片中,包括处理器、存储设备、逻辑元件、通信外围设备和模拟设备。这个方法的优势在于通过在单芯片上集成所有这些组件而缩小了组件之间的物理间隔,使设备变得更小,并进而能够运行得更快,制造起来也更简单。这些优势使得系统的可靠性得以提高,总体成本也降低了。

应用开发人员更喜欢图6 中显示的理想化可视性级别,因为它不仅提供了可视性,还能控制各种相关的系统活动。随着集成等级和时钟速率的稳步上升,可视性和控制级别则不断下降。这些就造成了一个可视性和控制间隙,即期望的可视性和控制级别和现实级别之间的差距。这个间隙会随着时间的推移而不断扩大。

应用开发工具供应商正在努力延缓这一间隙的扩大。开发工具、软件和相关硬件组件必须以更少而且不同的方式来执行更多的功能,降低由于这些因素而导致的使用难度。高端的仿真技术可以提供人们期望的程序活动和执行的可视性,而由于以上提到的各种原因,DSP 类系统正需要这样的可视性。



图6:可视性和控制间隙

下一章将解释仿真器如何通过断点和单步执行等功能来控制DSP 上的程序。

仿真的基本原理

仿真是一种被用在嵌入式系统开发领域的技术。它可以给系统开发者带来集成硬件和软件所需的可控制性和可视性,有效地模仿DSP 处理器的电气特征和性能,同时让工程师更清晰地了解处理器的活动并加以控制。

仿真器包含了硬件和软件技术。仿真硬件方面由DSP 芯片上的功能构成,它可以采集数据。该数据提供了有关系统活动状态和其它可视性的信息。硬件还需要从DSP 设备上高速获取此类信息,并将数据格式化。仿真器软件则提供了更高级别的控制,以及一个和主机相连的接口- 一般是一个调试器。调试器让开发工程师可以轻松地从编辑过程(编译、汇编并为某个应用建立链接)过渡到执行环境。

它从编辑过程中输出数据,并将图象导入到目标系统中。接下来,工程师可以通过调试器和仿真器互动,来控制并执行应用,同时找到并解决问题。这些问题可能是硬件问题,也可能会是软件上的问题。仿真器被设计成一个完整的集成和测试环境。

仿真器系统组件
所有的仿真器系统都是由以下三个部分构成的:
片上调试装置
仿真控制器
运行在主机上的调试器应用程序



图7:一个基本的仿真系统

图7 展示了这三部分的连接。其中主机和一个仿真控制器相连,仿真控制器也连接到目标系统。用户通过IDE 中的调试器来控制目标应用。

从处理器、仿真器到主机平台的整个开发环境,都会使用DSP 仿真技术。

在DSP 设备本身,要实现更高的时钟率,就要求仿真逻辑必须是在芯片上,这样它才能够全速运行,并跟上处理器的速率。集成度更高的芯片,总线会被隐藏起来,让工程师无法通过管脚看到。这也使得仿真逻辑必须在芯片上,这样才能接入到系统总线。为此,DSP 厂商都一直在积极地将高端仿真功能集成到它们的DSP产品上。

下一个组件是仿真器,它用来将目标板连接到主机平台上,并在主机和目标处理器之间传输数据。

第三个组件也是最后一个组件是调试器和仿真软件。该软件可以自动配置以匹配DSP 设备,并作为用户接口,让片上系统(SoC)设备的调试变得尽可能简单。

这些IDE 还支持“插入式”应用的开发,此类应用不仅能控制处理器,还能通过一个高速数据接口显示来自处理器的仿真数据。

调试器运行的主机可以是一台电脑,也可以是一个工作站。该主机可以通过各种方式来和仿真器相连,包括以太网、通用串行总线(USB)、Firewire (IEEE 1394)和并行接口等。

主机可以决定设备到主机之间的数据带宽。主机和仿真器之间的通信决定着数据传输协议的最大持续数据带宽。比如,在某些仿真应用下,仿真器清空接收数据缓冲器的速度必须和这些缓冲器被装满数据的速度一样快。第二,产生数据的主机和接收数据的客户端必须拥有足够的MIP 和/或磁盘带宽,来准备、传输、处理和/或存储来自DSP 的数据。此处必须注意的一点是,一个功能强大的电脑或者一个工作站会对整个仿真系统的性能产生影响。

仿真器的物理特征

大多数仿真控制器都位于主机外部。仿真器分为通信和仿真两个部分。通信部分负责和主机通信,而仿真部分则和目标连接,控制目标调试功能和设备调试端口。

仿真器/目标通信

仿真控制器通过连接线和目标相连。调试、跟踪、触发和实时传输可以通过同一根目标连接线来完成,有时也可以采用同样的设备管脚。当一根连接线无法满足目标系统的跟踪带宽时,就需要多根连接线。所有跟踪、实时数据传输和调试通信可以通过这个链路来完成。仿真器允许目标和仿真器之间可以至少分开2 英尺,以方便DSP 开发者能在各种环境下应用。

片上仿真

由于当前精密的DSP 处理器的可视性日益下降,调试功能也被集成到了芯片上-即我们常说的片上调试。片上调试实际上硬件和软件的结合。位于DSP 上的功能是硬件实现资源。这些资源包括终端用户代码可利用的功能,例如断点寄存器和其它专用硬件。要在芯片和调试器之间进行通信,DSP 上必须有额外的管脚。这些管脚可以是JTAG 接口管脚,也可以是一些专门用于控制或数据的额外管脚。要进行片上调试,还要求主系统必须和调试部分以及数据抽取通信并对之加以控制。主软件运行调试器软件,并通过专用接口头信息与片上调试寄存器连接。主调试器以图画形式显示源代码、处理器资源、存储器位置和外围设备状态等。

片上调试的一些主要功能包括:

-中断或插入程序和/或数据存储地址上的调试模式
-中断或插入外围设备上的调试模式
-通过1 个DSP 微处理器指令进入调试模式
-读/写DSP 内核寄存器
-读/写外围存储器映射的寄存器
-读/写程序或数据存储器
-执行1 个或多个指令
-跟踪1 个或多个指令
-读实时指令跟踪缓冲器



图8:DSP 上的仿真逻辑可以实现有效系统集成所需的可视性

图8 展示了一个高性能DSP 上的仿真硬件。该逻辑位于DSP 上,可以执行以下功
能:

观测-采用总线事件探测器来观测系统中的事件。用户可以通过调试器界面编程选择需要观测的特定事件或情况。
保存-采用计数器和状态机来保存系统中发生的事件。
导向和控制-采用触发器来发送计数器和状态机获取的有用数据。
导出-采用导出功能从系统导出数据。例如,以跟踪逻辑来导出原始程序寄存器和数据跟踪信息。
加速-采用本地振荡器来提高以高时钟速率运行的设备的数据传输率。
导入-以导入逻辑来从主机导入数据,让开发者可以输入用来调试和集成系统的数据文件。

这个仿真系统里还包括一个主通信控制器(host communications controller)。
 
它可以连接到控制整个过程的主调试器。调试器可以位于电脑上或者工作站中,也可以集成到一个集成度更高的开发环境中,或者独立运行。电脑或工作站中构建的代码通过一个通信链路导入到目标中。

仿真控制器(以及调试器)是一种带有两组不同功能特征的调试工具。其中的一组特征可以提供简单的运行控制,让DSP 开发者能控制DSP 处理器的运行。运行控制的例子有启动、暂停、步进和运行至断点。

另一组特征则用来捕捉和记录DSP 处理器的活动,正如处理器总线所显示的那样。开发者可以通过一个触发系统来限定控制捕捉这一跟踪信息的条件。该跟踪系统将DSP 处理器总线的活动记录在系统内部或外部的高速RAM 中。

调试器是在主系统上执行的一个软件组件。它可以监控和控制整个仿真过程,有以下一些常见功能:
启动/运行(Go/Run)- 这个命令将启动目标CPU 的执行。执行是从当前程序计数器的位置和寄存器数值开始的。
停止/暂停(Stop/Halt)- 这一命令用来通知仿真器停止目标CPU 并暂停执行。当执行这一命令时,目标CPU 和寄存器的当前上下文会被保存,以便当处理器再次开始运行时,执行可以继续从原停止点处继续进行。
单步执行(Single-Step)- 这一命令是启动或运行指令的一个特殊形式,但在下一个指令处有一个断点组。它让用户可以连续步进。在每一步,用户都可以观察寄存器、执行堆栈和其它关于系统状态的重要信息。这可能是寻找软件或固件模块的问题时应用最为普遍的命令。
步过/步进(Step-Over/Step Through)- 这个命令和单步执行很相似,但有一个很大的不同。当步过一个子程序调用时,该命令会执行子程序但不会进入子程序。而当采用单步执行命令时,调试器会进入子程序并以一次一条指令的方式执行子程序。如果用户不需要看到子程序或库函数中的每条指令,这一命令可以让用户绕过。
运行至(Run To)- 这个命令可以在程序某个被认为有用的地方设置一个断点,然后运行直到达到该断点。它可以让用户不必多次单步执行便可达到同样的位置。

DSP 仿真器可以提供DSP 处理器、寄存器和应用软件的可视性,让软件工程师可以了解到应用执行中处理器内部发生的变化。软件工程师可以基于应用内部的硬件信号值和软件位置在应用中设置断点。在这些断点上,用户可以了解到处理器和数据的状态,并确定其应用是否仍在正常运行,还可以在仿真器上执行应用软件的基准化(时序分析)和绘制概图(CPU 加载)。多处理器调试可以让用户同时在多个处理器上调试软件,并依照设置在某个处理器中的条件停止一个或多个处理器,让用户能够在有疑问时捕捉到整个系统的状态。DSP 调试器中的这些功能可以极大地缩短软件开发周期中的调试时间。

仿真器是直接和DSP 处理器连接的。电气信号被发送到仿真器,仿真器可以接入到处理器,而标准软件调试器则不能。工程师可以浏览并更改寄存器-这是标准软件调试器所没有的。硬件信号发送还可以带来更好的实时控制。仿真器还能实时记录处理器的活动,如果发生问题,开发者就可以有一个系统活动的历史记录来进行分析。

仿真器相比于标准软件调试器的另一个优势在于它可以调试系统的启动代码。标准软件调试器一般需要目标操作系统来接入系统和通信接口。在系统初始化过程中,这是不能实现的。而仿真器可以提供自己的通信接口(一般是JTAG),能接入到系统的任何部分,达到和CPU 一样的可视性。

仿真器的另一个优势是可以调试已经损坏的系统。如果目标系统因为某个原因而被损坏,它的操作系统一般会停止运行。此时软件调试器根本排不上用场。而仿真器则不会受到系统损坏的影响。仿真器可以保留重要的跟踪信息和寄存器数值等DSP 处理器状态信息,并对该数据进行分析,以确定导致系统损坏的原因。

基本仿真组件

当采用一个DSP 调试器来在硬件平台上进行软件调试时,必须执行一些设置程序,以确保目标处理器能够和调试器兼容。仿真的设置包含了两个工具:一个是仿真器本身(例如TI XDS510 或XDS560)-它控制到达目标和来自目标的信息流,另一个是调试器-它是这一信息的用户接口。在仿真设置之后是目标处理器。

大多数DSP 处理器中的仿真逻辑都采用联合测试行动组(JTAG)标准连接方法来从处理器内部获取调试信息。

硬件的调试是通过停止DSP 内核来进行的,这样才可以使信息通过JTAG 信息头被扫描进设备并从设备中扫描出来。该信息是通过符合IEEE 1149.1 JTAG 规格的JTAG 接口来串行传输的。必须注意的是,这个调试方法接近于实时调试,但它是插入式的,因为它需要停止内核来扫描信息。尽管和JTAG 头之间的连接可能是一样的,但用于仿真的扫描链和用于边界扫描的扫描链是不同的。在处理器内部有多种可以扫描信息进出的串行扫描链。扫描链的选择以及每个扫描链所包含的信息由一个微处理器来控制。这个“扫描管理器”的任务是在信息被扫描进出各种处理器的过程中控制该信息,并将之引导在各个调试器窗口之间。

仿真器主机可以作为扫描管理器,因为它控制着扫描信息在目标和调试器窗口之间的传输。比如,操作系统可以是一台电脑,而JTAG 连接则通过一张ISA 卡(图7)来完成,其它配置也可以实现。当主CPU 或一个独立的处理器控制JTAG 扫描信息时,主机需要有关扫描链中包含的设备的信息。

仿真功能

仿真可以提供一套用于集成和调试阶段的标准操作。它的一些主要功能如下:

断点(Breakpoints)

仿真技术的一个普通功能就是支持断点。断点可以中断DSP,并让开发者可以检测目标系统上的数据或寄存器。断点功能是由仿真器来控制的。仿真器执行协议来在执行流尽可能早的地方停止CPU,并让开发者在需要时从当前点继续执行。

由于从运行状态转向暂停状态可以在瞬时发生,大部分断点都是同步的。

软件断点是同步断点的一种形式。它可以在特定断点处保存指令,并以能创建出一个例外条件的不同指令取而代之。这样一来,控制功能就被转移到了可保存重要DSP 状态寄存器上下文的控制器上。当由主调试器来进行控制时,开发者就可以在CPU 暂停时在寄存器上“查看并修改”。如果反过来,就可以让CPU 从当前位置继续执行。这种类型的断点可用于包含RAM 的目标系统,以编写并更换指令。

断点的另一种形式叫做硬件断点。这种断点是通过采用目标设备上的自定义硬件来实现的。它适用于有复杂取指序列的DSP 设备,并可在不能用软件断点来替换指令的带ROM 的系统中设置断点。这一硬件逻辑是用来监控设备上的一组地址和状态信号,并当指令拾取在某个特定地点进行时停止设备执行。

事件检测器(Event Detectors)

图9 中的事件探测器提供了更好的目标可视性和执行中断。图4 中的总线事件和辅助事件检测逻辑可以检测到系统中发生的一系列复杂事件并进行仿真断开。除了硬件和软件断点提供的代码执行断点,事件检测器也可以在数据访问、其它地址和数据的结合以及其它系统状态下断点。图9 中的事件检测器包含了一套比较仪和其它逻辑。用户可以通过调试器界面对这些比较仪进行编程以找到系统中事件的一个特定样式。比较仪会触发其它事件逻辑执行相关任务,例如停止执行,增加一个计数器来跟踪某个特定事件的发生,或者在一个可被其它设备所用的管脚上产生一个信号以进行其它操作。



图9:开发人员可以通过用户界面设置事件计数器和比较仪,并能编程复杂事件,只受到设备上逻辑数量的限制。

开发人员完成编程后,总线和辅助事件系统逻辑就将依照逻辑中设定的条件对运行的系统进行监控。一旦检测到情况,就会作出预先设定的响应。它可能会给仿真器发出一个指令,让它停止执行,也可能会设置一个输出管脚来告知其它器件或测试设备。这种片上逻辑的一个优势就在于它能“看”到设备内部发生的情况,而采用外部管脚时则只能看到管脚所代表的信号或情况。DSP 厂商已经通过提供可实现DSP 可视性的片上逻辑改进了这方面的功能。这一点是非常关键的,因为DSP 和其它嵌入式处理器都在向片上系统结构过渡,而这种系统恰恰会限制设备可视性的程度。

由于这些事件触发功能都是直接创建到DSP 处理器中的,它们不会占据过多的CPU 周期或存储器空间。因此,当被通过用户控制启动时,事件触发设备逻辑能以非侵入形式检测到所有事件,而不需停止CPU。这样可以让系统保持实时运行,并缩短调试时间,因为开发人员不必在每个单独事件上设置断点,并能够重复执行,知道下一个复杂事件发生。

跟踪(Trace)

图8 中的跟踪采集区块是DSP 仿真功能的扩展。它让开发人员能以全时钟速度从设备中抽取程序计数器、时序信息和原始数据访问信息。该数据被保存在一个外部大型存储器上并被格式化。通过这一数据,开发人员可以极其详细地了解处理器的活动情况。这有利于调试各种目标系统上的间歇性硬件和软件问题。跟踪功能可以由事件逻辑来控制,仅当系统发生一系列特定情况时才启动,例如计数器达到了某个预设值,某个特殊模块被执行,或者接入到了某个特定变量。程序计数器和/或数据访问信息一般都带有时间戳标记,可帮助开发人员确定访问次数、中断潜伏、模块执行次数和其它有用数据。



图8:DSP 设备上的仿真逻辑能带来有效系统集成所需的可视性

连续执行可视性(Continuous Execution Visibility)

有些DSP 应用要求在继续服务中断时停止处理器。这对于硬盘应用等控制应用来说尤其重要,因为此时DSP 在控制着磁头的位置。在连续执行可视化模式中,当发生了一个物理中断时,调试器会停止控制,并让应用执行硬件中断。接着,从硬件中断服务程序(ISR)中恢复后,处理器又会被暂停。在这些系统中,DSP是用来控制伺服系统以避免通信时发生磁头撞击。但是,在系统调试过程中,开发人员必须保持和通信系统的同步。这要求DSP 在调试系统时继续服务中断。此功能需要特殊DSP 仿真逻辑才能实现。这只是DSP 仿真如何定制以便用于一些由应用域来决定所需仿真功能类型的DSP 系列的例子之一。

源级调试(Source Level Debugging)

源级调试让开发人员可以在一个更高的抽象层集成系统。开发人员可以将从系统抽取的数据连接到高级源代码(程序就是以该代码编写而成的),并采用来自源代码的符号名或数据所在的原始存储器地址来接入到系统变量和其它程序的位置。源代码一般可以和汇编代码一起显示,这样可以让开发人员看到编译器生成了什么汇编代码。当优化编译器来生成代码时,这一点是非常重要的。DSP 编译器具有多个级别的高性能优化能力。当采用代码优化切换时,每个高等级语言语句汇编代码的可视性都非常重要。根据创建系统时所选择的调试选项,开发人员可以通过一组由编译器和连接器生成的符号来接入各种程序变量、结构和片段。

这些符号信息会在每个调试过程之前被导入到仿真器。

仿真功能的另一个有用之处在于可实现被执行汇编语言的可视性。由于在编辑过程中创建的目标文件是一个二进制文件,二进制目标代码(机器代码)必须转换成汇编指令。这个转换过程被称为“反汇编”。反汇编功能将二进制数导入到存储器并将之反汇编,让用户可以查看产生机器语言代码的实际汇编语言流。

跟踪功能还需要反汇编操作。跟踪反汇编必须选取跟踪帧,并反汇编从该原始跟踪数据执行的代码。该数据对于开发人员来说是非常有帮助的。它可以准确显示数据采集期间系统中发生的情况。利用数据跟踪,用户不仅能够查看实际被执行的指令(不是应该被执行的指令),还能查看这些指令所进行的数据访问。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top