数字信号处理(DSP )系统测试和调试4
仿真功能
仿真可以提供一套用于集成和调试阶段的标准操作。它的一些主要功能如下:
断点(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 编译器具有多个级别的高性能优化能力。当采用代码优化切换时,每个高等级语言语句汇编代码的可视性都非常重要。根据创建系统时所选择的调试选项,开发人员可以通过一组由编译器和连接器生成的符号来接入各种程序变量、结构和片段。
这些符号信息会在每个调试过程之前被导入到仿真器。
仿真功能的另一个有用之处在于可实现被执行汇编语言的可视性。由于在编辑过程中创建的目标文件是一个二进制文件,二进制目标代码(机器代码)必须转换成汇编指令。这个转换过程被称为“反汇编”。反汇编功能将二进制数导入到存储器并将之反汇编,让用户可以查看产生机器语言代码的实际汇编语言流。
跟踪功能还需要反汇编操作。跟踪反汇编必须选取跟踪帧,并反汇编从该原始跟踪数据执行的代码。该数据对于开发人员来说是非常有帮助的。它可以准确显示数据采集期间系统中发生的情况。利用数据跟踪,用户不仅能够查看实际被执行的指令(不是应该被执行的指令),还能查看这些指令所进行的数据访问。
评论