您当前的位置:五五电子网电子知识单片机-工控设备嵌入式系统-技术一种新的嵌入式处理器在线调试方法 正文
一种新的嵌入式处理器在线调试方法

一种新的嵌入式处理器在线调试方法

点击数:7734 次   录入时间:03-04 11:51:34   整理:http://www.55dianzi.com   嵌入式系统-技术

摘要: 针对嵌入式处理器在FPGA 中的应用现状,通过引入通用的调试模块,实现了对没有调试接口的嵌入式处理器进行在线调试的功能。所设计的调试模块通过引入专用的调试中断及与之对应的调试服务程序实现一种处理器响应断点( breakpoint) 的机制,并基于双端口RAM 中一种巧妙的地址映射机制实现同时对多行代码设置断点的功能。实际的工程应用情况表明,新的调试方法扩展了对小型嵌入式处理器进行调试的手段,明显提高了开发效率。

1 引言

在FPGA 设计中使用嵌入式处理器软核( 如MICroBlaze、PiCOBlaze 等) 构成可编程片上系统( SystemOn Programmable Chip,SOPC) ,相比于ASIC 具有更好的可修改性和可维护性,得到了普遍的应用。由于ARM,MicroBlaze 等大型处理器内核具备调试接口,在与之对应的调试模块配合下,调试软件可以通过JTAG 接口实现: 执行到断点处挂起、单步执行、查看处理器内部状态、查看和修改Memory空间中的数据等基本的在线调试功能。上述基本的在线调试功能对嵌入式系统的调试具有重要意义。

对于PicoBlaze 等占用资源少、设计开发简单的小巧型处理器,一般不具备调试接口,然而在SOPC系统设计中经常需要使用上述处理器。使用上述处理器时,由于没有调试接口,属于大型处理器的标准高效的调试机制不再能够使用,因此通过指令集仿真( ISS,Cycle - aCCurate Instruction Set Simulation) 和利用仿真工具对含有处理器的系统进行软硬件协同仿真是确保设计正确性的重要途径。然而在诸如接收机基带信号处理等系统的设计中,仿真所用的测试用例往往覆盖率不够,或者在发现故障以后很难构造出与之相应的测试用例。因此迫切需要使在线调试功能能够方便地扩展到一般的处理器上。

针对上述应用需求,这里提出的新调试方法通过引入一种通用的调试模块( Universal Debug Module,UDM) 可以使没有调试接口的处理器建立起标准的调试机制。该调试模块利用处理器的中断机制实现处理器响应断点( breakpoint) 的机制,利用基于双端口RAM 中一种巧妙的地址映射机制实现同时对多行代码设置断点的功能,并且能够方便地实现被调试系统和调试主机之间调试信息和命令的交互。UDM 还具有易于扩展的优点,当SOPC 系统中有多个处理器时可以共用一个UDM。

2 在线调试的一般原理

嵌入式处理器的主流在线调试方法,目前主要有2 种: 后台调试模式( backgroud debug mode,BDM) 技术和基于IEEE P1149. 1 协议的JTAG 调试技术。BDM 技术在Motolora 微控制器中得到了大量的应用,ARM,MIPS 和PowerPC 等处理器都具有基于JTAG 技术的在片调试功能,如ARM 公司提出了基于JTAG 技术的RDI 调试接口标准,主要用于ARM 芯片的调试。处理器内核中通过增加支持调试的扩展设计,可在预留的调试接口输入简单的控制信号,以实现: 处理器挂起( Halt) 、输出PC 值和通用寄存器值、输出和修改Memory 空间中的数据等基本的原始调试操作。通常上述调试接口的设计与指令集架构相关,如MIPS32 提供如下一些调试方法: ①断点指令BREAK; ②一些自陷指令TRAP; ③特殊控制寄存器WATCH,通过编程使得特定的load /store 操作以及取指操作产生特殊的例外;④一种基于TLB 的MMU,通过编程使得访问任意存储器页都可以产生特定的例外。

对于没有调试接口的处理器目前主要是通过在软件和硬件设计中充分考虑可能的调试需求,再加上调试主机和被调试系统之间的通信机制来实现在线调试的。这种调试模式下,调试代码需要插入到正常程序中,将调试信息输出到调试主机,同时还能够接收调试主机发过来的命令做出各种响应。该方法的主要缺陷是针对不同的调试需求,要不断修改正常程序中的调试代码,导致标准化和通用性程度不高。此处的UDM 在不对处理器内核做修改的情况下即可使这类处理器建立起方便的调试机制,是一种不同于主流大型处理器实现在线调试的方法。

3 通用调试模块( UDM) 的工作原理

3. 1 系统描述

使用UDM 的调试系统框图如图1 所示,利用与FPGA 同在一块PCB 板上的ARM、DSP 等处理器作为辅助调试用的嵌入式处理器( 下文中简称为辅助处理器) ,简化了UDM 与调试主机之间的通信。通过辅助处理器的总线接口,UDM 中的各种控制和数据寄存器被直接映射到辅助处理器的Memory 空间。在辅助处理器开发工具的Memory 窗口直接进行数据读写操作,就可实现对UDM 的操控,如图4、图5 所示。由于在一块PCB 板上同时集成FPGA 和嵌入式处理器芯片是很常见的设计,因此这种通信方式适用的范围很广。

应用UDM 的调试系统框图
应用UDM 的调试系统框图
图1 应用UDM 的调试系统框图

www.55dianzi.com

UDM 直接作为FPGA 外部辅助调试的嵌入式处理器的外设,如果在外部处理器总线挂接多个UDM 模块,就能实现同时对多个处理器进行调试。

UDM 通过产生调试中断( DeBug Interrupt,DI) 信号,使处理器响应中断并调用调试服务程序( DebugRoutine,DR) 。UDM 通过监测处理器的取指令地址( Instruction Address, IA) 产生DI 信号。PiCOBlaze 在运行DR 时可通过其总线接口访问UDM,从而实现调试信息的输出和对调试命令的响应。

3. 2 断点设置机制

产生DI 时由于处理器会立即执行DR,从而中断正常的执行流程转为为调试服务,因此决定DI 产生的时机是实现断点机制的核心。DI 信号是通过监测处理器的取指令地址( Instruction Address, IA)产生的。直接通过一个比较器将IA 与一个数据比较一次只能设置一个断点,为了解决此矛盾采用了如下方法: 在UDM 中用双口RAM 存储断点配置信息,使RAM 中的每1bit 与程序存储区的一个地址对应起来,数据为1 代表设置了断点,0 代表没有。

将输入的IA 进行地址变换后对RAM 存储区寻址,使得RAM 在一端输出一个正好代表输出的地址处是否设置了断点信息,再根据此数据就可生成正确的DI 信号。在双口RAM 的另外一端,断点设置情况可以方便地被修改。这样一来可以设置的断点个数变为主要受UDM 中双口RAM 容量限制了。

3. 3 调试服务程序

只需在DR 中保证处理器不对目标程序的内外部环境造成改变,就等效于实现了处理器的挂起功能。因此,需要将DR 和目标程序的执行环境隔离开来,这可以通过对编译器进行某些设置或强制的编码规范来实现。在处理器被挂起之后,DR 与外部调试主机通信,通过查询命令寄存器的方式响应调试主机发出的各种调试命令。这些命令包括: 将有关的调试信息搬移到外部调试主机可以观察的缓存区中、修改Memory 空间中的数据、退出DR 使目标程序继续执行等。由于DR 必须与目标程序使用相互隔离的资源并且小型处理器中代码容量,外部Memory空间大小等都比较受限,因此DR 的设计应该尽可能占用较少的端口数、通用寄存器数和代码总行数。

4 设计实例

Xilinx 公司的PICoBlaze 是一种常用的小巧型处理器,它由ALU、程序计数器栈( 适用于嵌套子程序) 、16 个8 位通用寄存器、64 字节RAM 构成的暂存器、程序计数器和控制器以及中断支持电路构成,其代码容量为1024。本节以针对PicoBlaze 的应用为例,设计了一个具体的UDM,并在Spartan3S5000FPGA 上进行了实际验证。该UDM 使用的硬件资源为1 个18KB BRAM 和62 个Spartan - 3逻辑片,软件资源为61 行汇编代码,具备的功能如下:

·可同时在每一行代码处设置断点,在没有设置断点的情况下,可强制产生DI,从而运行DR 输出调试信息;

·可以观察到的调试信息为: 程序计数器PC的值、s0 ~ sb 寄存器、64byte 的暂存器,Memory 空间中的数据,在DR 运行时可以刷新上述调试信息。

4. 1 硬件实现

基于PicoBlaze 处理器应用的UDM 硬件结构如图2 所示。UDM 与调试终端和PicoBlaze 都有总线接口,因此其内部寄存器分为3 类: 仅受PicoBlaze控制,仅受辅助处理器控制以及受二者共同控制。

PicoBlaze 和辅助处理器分别在双口RAM 的A、B 端口写入数据。为了减少占用PicoBlaze 的I /O端口,PicoBlaze 在向双口RAM 写入数据之前先向RAM寻址寄存器写入地址,然后通过写数据输出寄存器将数据写入前一操作指定的地址中。

www.55dianzi.com

UDM 的内部电路结构框图
UDM 的内部电路结构框图
图2 UDM 的内部电路结构框图

双口RAM 的B 端口连接到辅助处理器的总线,数据位宽为16,可访问的地址范围为0 ~ 255,地址0 ~ 165 作为交互调试数据的缓存区,地址192 ~255 用于存储断点设置信息。每一个寄存器中存放16 行代码的断点设置情况,由于PiCOBlaze 的代码容量为1024 行,故只需占用64 个寄存器,例如地址为193 的数据为0x4080 则表示第24 和31 行设置了断点。双口RAM 的A 端口数据位宽为8,在DR 运行时用于输入调试信息,在目标程序运行时输出断点设置信息。因此在A 端口有一个地址选择电路,使得输入A 端口的地址在不同的情况下分别由RAM寻址寄存器和IA 决定。当运行目标程序时,A 端口输入的地址为IA 的高7 位加上偏移量0x180,输出的8bit 数据再经IA 的低3 位寻址输出1bit 数据,这样得到的数据正好反映了与IA 对应的代码是否设置了断点。中断信号产生电路根据上述数据和中断信号的时序要求,产生输出给处理器的DI 信号。

[1] [2]  下一页


本文关键字:处理器  嵌入式  在线  嵌入式系统-技术单片机-工控设备 - 嵌入式系统-技术