新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 一种新的嵌入式处理器在线调试方法

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

作者: 时间:2011-03-14 来源:网络 收藏

  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寻址寄存器写入地址,然后通过写数据输出寄存器将数据写入前一操作指定的地址中。

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 信号。

  调试命令寄存器由PicoBlaze 和辅助处理器共同控制,辅助处理器向该寄存器写不同的数代表不同的调试命令。在运行DR 时通过查询该寄存器来实现对各种调试命令的响应,在响应调试命令之前PicoBlaze 将调试命令寄存器清0,作为与辅助处理器的握手操作机制。当向调试命令寄存器写3 时,不管是否设置了断点都会立即产生DI 信号。

  4. 2 软件实现

  在基于PicoBlaze 的应用中,为了减少代码容量,DR 的流程比较简单。在初始化准备之后,依次将s0 ~ sb 寄存器、64byte 的内部RAM,Memory 空间中的数据输出到双口RAM 中,然后陷入一个等待和处理调试命令的循环中。目标程序和DR 执行环境的隔离通过限制目标程序只允许修改寄存器s0 ~sb 以及64byte 的内部RAM,而DR 只允许修改寄存器se ~ sf 来实现。只有当调试命令为退出调试时,DR 程序才会结束,PicoBlaze 又返回到目标程序的执行。当调试命令为刷新调试信息时,PicoBlaze 将重复一次初始化和调试信息输出的过程。

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


评论


相关推荐

技术专区

关闭