引言
在嵌入式系统开发过程中,上位机通过调试器完成对目标机软件的开发、下载、调试。早期的调试器与上位机之间通过串口或并口通信,存在速度慢、通用性差等缺陷。相比之下,USB接口优势明显,具备速度快、易插拔、支持多个调试器同时工作等优势。但目前的USB接口调试器一般采用USB芯片和可编程器件结合的实现方式,成本和复杂度较高。
M8051是Mentor公司的嵌入式8051处理器,凭借良好的性能和功耗控制,占据了大量的SoC(System on a Chip)市场。该处理器集成了OCI(On-Chip Instrumentation,片上调试单元)来完成程序的调试。FS2公司设计的System Navigator是一款针对M8051的调试器,但该产品价格过于昂贵。本文通过研究M8051的调试结构,设计一款基于SOPC(System on a Programmable Chip)的M8051调试器,实现对M8051核心的高效、低成本的开发。
1 M8051片上调试技术的研究
1.1 典型的OCD调试系统
目前,嵌入式调试领域的趋势是在MCU上集成一个专门用于调试的功能模块,并且提供一个专用接口开放给用户。用户通过该调试控制模块来实现停止/继续CPU的运行,并访问目标机上的各种资源,这就是OCD(On-Chip Debug,片上调试)技术。同时,JTAG作为应用最广泛的系统级测试技术,控制逻辑简单、实现方便,常作为片上调试模块的测试接口。
一个完整的OCD调试系统通常包括调试主机、调试协议转换器(或调试器)、目标机三个部分。调试主机运行调试软件,并通过调试器与目标机相连;调试器将主机发出的调试命令和数据转换为基于目标机OCD模块和JTAG接口的调试数据;目标机的OCD模块接收到调试器发来的JTA G数据,完成对CPU的逻辑控制。典型的OCD调试系统如图1所示。
1.2 M8051的片上调试结构
M8051核心的调试功能由其片上的OCI模块完成。OCI模块通过JTAG口与外部通信,其实现完全符合IEEE-1149.1。具体来说,TAP控制器接收一系列的JTAG边界扫描链读写时序,完成对扫描链上的IR和DR的读写。OCI模块内部的Tracc模块、Trigger模块和Dcbug模块根据IR和DR的内容,产生相应的控制信号给处理器,达到控制M8051处理器的运行或者读取处理器信息的目的。以上就是OCI模块的基本调试原理。M805 1OCI模块的体系结构如图2所示。
2 基于SOPC的M8051调试器的设计
2.1 调试系统的总体设计
在研究了OCD测试技术和M8051片上调试结构OCI的基础上,本文提出了M8051调试系统的总体设计方案。该方案通过USB接口与上位机通信,调试器主体由一个FPGA芯片实现。其总体结构图如图3所示。
上位机运行调试软件,将编译器的各种调试操作,通过调试接口函数转化为各种调试协议数据;再将这些调试协议数据通过底层通信模块发送给M8051调试器。本设计的底层通信接口是USB接口。编译器选择应用最为广泛的且具备开放调试接口函数AGDI的Keil C51编译器。
M8051调试器本身主要由USB控制器模块、8051处理器和JTAG控制器模块组成。USH控制器在8051处理器的控制下接收来自上位机的调试协议数据;JTAG控制器模块负责将这些调试协议数据转化为基于OCI结构的底层调试命令集,并以JTAG边界扫描链读写时序发送出来。
M8051目标机通过OCI模块的JTAG接口,接收M8051调试器发送的底层调试命令,完成对M8051目标机的调试,并将返回值通过JTAG接口送回M8051调试器。
2.2 调试器的硬件设计
目前,市场上流行的基于USB接口的调试器,硬件一般以一个USB2.0控制芯片为核心,完成数据通信和调试协议数据解析,同时配置一个可编程器件实现JTAG边界扫描链读写时序。本文出于成本和系统复杂度的考虑,并结合FPGA的优势,创新地使用单独的FPGA芯片实现调试器的全部功能,简化电路板和系统设计,降低系统成本。硬件结构如图4所示。
调试器的主要硬件包括:Xilinx公司高性价比的Spartan-6FPGA,Flash配置芯片XCF04S,缓冲器芯片74LCX245作为JTAG接口的电气隔离及电源转换芯片。USB控制器、8051处理器、片内SRAM和JTAG控制器等功能模块均以IP核的彤式在FPGA上实现。USB控制器采用Mentor公司的MUSB全速(12 Mhps)控制器IP核,8051处理器采用Mcntor公司的M8051EW IP核。系统上电后,配置芯片自动完成对FPGA的配置,保证系统的非易失性。
JTAG控制器模块是本系统硬件部分的核心模块。本文中JTAG控制器是基于M8051的OCI模块实现的,主要任务接收调试固件发送过来的调试协议数据,转化为OCI模块可识别的底层调试命令集,具体说就是一系列对于OCI模块的IR和DR的读写操作;再使用JTAG边界扫描链读写时序将这些底层命令发送给目标机。所以JTAG控制器模块分为两个部分:调试命令解析模块和JTAG边界扫描时序生成模块。JTAG控制器的结构如图5所示。
以系统运行控制操作中的Halt8051操作为例,由OCI的结构可知,该操作由向OCI模块的IR中写入0x69来实现。在上位机中该操作的调试协议数据为0x0069。
调试器固件在接收到来自上位机的调试协议数据后,将0x00和0x69分别写入调试命令解析模块的命令寄存器和数据寄存器。调试命令解析模块将该调试协议数据解析为向OCI的IR中写入0x69,即JTAG_CMD=IR,JTAG_Din=0x69;再由JTAG边界扫描时序生成模块产牛向IR写入0x69的JTAG时序。
与传统的软件方法相比,由FPGA硬件实现调试命令解析和JTAG边界扫描时序牛成,不但减轻了调试器上的8051处理器的负担,而且有效提高了JTAG调试速度。
2.3 调试系统的软件设计
本文中的软件设计分为两部分:PC端调试软件和调试器固件。两部分通过USB接口进行交互。具体的软件构架如图6所示。
2.3.1 PC端软件设计
PC端调试软件由Keil C51编译器、AGDI调试接口函数和USB驱动程序三部分组成。通用的AGDI调试接口函数是独立于处理器体系结构的函数集,它将上层调试操作分别转化为独立于处理器的调试命令。一般来说,AGDI捌试接口函数实现的调试操作有以下儿类:系统运行控制、寄存器读写、存储器读写操作以及断点操作。
AGDI调试接口函数设计是PC端软件设计的重点。主要工作是在通用AGDI接口函数的基础上,实现针对M8051处理器的调试接口,将来自编译器的调试操作转换为针对M8051的调试协议数据。本文中调试协议数据采用调试命令加上调试数据的形式。以系统运行控制操作中的Halt80 51操作为例:AGDI调试接口函数将Halt8051操作转化为基于M8051处理器的调试协议数据0x0069,即调试命令0x00和调试数据0x69。最后由USB驱动层将调试协议数据0x0069打包发送给调试器。
2.3.2 调试器固件设计
调试器固件的功能分成两个方面:一方面是下行数据发送,在完成USB设备的枚举过程后,接收USB接口的调试协议数据,解析得到的调试命令和调试数据,再将调试命令和调试数据分别写入JTAG控制器模块的命令寄存器和数据寄存器;另一方面监控目标机的返回信息,并将返回信息通过USB接口发送给调试主机。
本文中的软件部分主要负责调试协议数据的生成和传送,具体的调试命令解析和JTAG边界扫描时序的产生,全部由硬件实现,保证了调试效率的最大化。
3 M8051调试系统的测试
3.1 测试环境
测试环境包括软件环境和硬件环境。软件环境包括Kell C51编译器和Xilinx ISE Design Suite;硬件环境包括PC机、本文开发的调试器电路板和基于M8051处理器的目标板。测试环境如图7所示。
3.2 调试系统的功能测试
功能测试的项目主要包括:涮试开始/停止、单步运行、断点、读写寄存器、渎写存储器等。经测试,以上调试操作稳定可靠。以断点操作为例,断点操作是软件调试过程中最重要的手段之一,本文断点功能经测试完全可靠。测试结果如图8所示。CPU从PC指针为零处开始执行,到达断点地址0x0006处停止执行,并将处理器的最新状态更新到用户界面上。
3.3 调试器的主要参数
本调试器采用USB2.0全速(12 Mbps)接口,调试器内部M8051处理器主频为48 MHz,JTAG协议数据收发速度达到8 Mbps。采用Spartan-6 xc6slx16 FPGA芯片实现,FPGA资源使用情况如下:可配置逻辑单元Slice1439个,占该资源总数的63%;嵌入式存储模块BLOCKRAM 144 KB,占该资源总数的14%;I/O接口数24个,占该资源总数的13%;时钟管理模块DCM 1个,占该资源总数的25%。
结语
本文给出的基于USB接口、以单一FPGA芯片实现的M8051嵌入式渊试器系统,不仅突破了传统调试器的速度瓶颈,而且大大简化了系统的复杂度。经测试,本调试器系统能够高效地完成M8051处理器的软件开发,是一种易于被开发者接受的高性价比、实用的调试器方案。