1 引言
调试嵌入式程序通常采用一种称为交叉调试的调试技术来调试已下载到嵌入式开发板中的程序。该技术可以允许用户通过PC机端的调试器以某种方式远程控制目标开发板上被调试程序的运行方式,并具有查看与修改目标开发板上内存单元、寄存器以及被调试程序中变量值等功能。采用硬件仿真器来调试嵌入式程序是常用的一种开发方式。
一般嵌入式CPU都设计有JTAG口来进行硬件仿真调试。硬件仿真器通过JTAG口输入该CPU型号专有的JTAG时序来控制CPU的运行,并通过JTAG指令来观察CPU以及开发板上硬件设备的运行情况,主要是各种寄存器以及相关内存地址空间的实时数据。
同时将嵌入式软件的运行结果通过JTAG口按照特定的JTAG时序输出反馈给硬件仿真器,硬件仿真器再通过USB或者串口、并口等总线返回给PC机端的调试软件。
硬件仿真器通常采用USB总线与PC机端的调试软件通信,因此硬件仿真器需要采用相关的USB芯片来支持USB通信功能,同时PC端的调试软件也需要开发针对该款USB芯片的驱动功能以支持与硬件仿真器USB芯片的数据交互。此外,PC端的调试系统还包括调试器(比如GDB调试器)、协议转换器以及位于它们之间的远程调试协议(通常是GDB RSP协议),这些都是针对特定型号CPU定制的。
本文通过对GDB RSP协议与USB通信技术的研究与应用,针对一款具有自主知识产权的ZW100DSP处理器成功开发了一套调试系统,从而为该款DSP的应用提供了极大的便利。该调试系统的框架如图1所示。
2 GDB RSP协议与EZ-USB FX2芯片概述
2.1 GDB RSP协议
GDB 远程串行通信协议RSP(GDB RemoteSerial Protocol)是基于消息的 ASCⅡ码字符流协议,规定有服务器端(RSP Server)与客户端(RSP Client)之分,通常在GDB中实现客户端功能,而服务器端通常另起一个进程实现与GDB的RSP协议通信,两者之间的数据交互一般采用进程间的通信方式来实现,常用的有网络socket通信等。
调试系统的RSP Server和RSP Client双方通过RSP协议进行数据的接收和发送。RSP 数据包包含了调试信息和校验两个部分。调试信息是以“$”作为开始、以“#”作为结尾的ASCⅡ码字符流,后面跟两个字节的校验码,该校验码的值是调试信息中所有字符的 ASCⅡ码相加后取256的模,该值用两个十六进制字符表示,数据包格式如图2所示。
接收方接收到数据包后进行解析,如果接收到的数据包正确,会返回响应信息“+”字符,如果接收到的数据包出错,需要重新传送数据包,则返回响应信息“-”字符。发送方通过接收方发回的响应信息判断数据是否发送成功。
RSP协议的调试命令是通过第一个ASCⅡ码字符进行区别的。以下是比较常用的调试命令及其功能:
● C:报告目标CPU挂起的原因;
● c、C、s和S:恢复运行或者单步调试目标CPU;
● D:与目标板断开连接;
● g和G:读写通用寄存器;
● m和M:读写内存地址空间;
● p和P:读写指定寄存器;
● X:加载二进制数据;
● z和Z:清除或者设置断点。
2.2 Cypress EZ-USB FX2功能
硬件仿真器采用Cypress的EZ-USB FX2芯片与PC端的调试进程(RSP Server)进行通信。Cypress公司的EZ-USB FX2系列芯片是世界第一个集成USB 2.0协议的微处理器,它支持12 Mb/s的全速传输和480 Mb/s的高速传输,可使用4种USB传输方式:控制传输、中断传输、批量传输和同步传输;完全使用USB 2.0,并向下兼容USB1.1.
EZ-USB FX2的前身是EZ-USB,其芯片固件也是存储在主机上而不是芯片内部,显着特点是代码容易升级。芯片结构也与EZ-USB类似,主要包括USB2.0收发器、串行接口引擎、增强型8051、16 KB的RAM、4 KB的FIFO存储器、I/O口、数据总线、地址总线和通用可编程接口GPIF.
采用Cypress EZ-USB FX2芯片进行USB通信传输性能稳定,其硬件性能可以进行灵活配置。该芯片的特点在于:
(1)USB2.0单芯片解决方案,包括USB2.0收发器,串行接口引擎(SIE)和增强型51内核。可“软配置”RAM,大小为16 K,可取代传统51的RAM和ROM,程序可以通过USB口下载或者通过外部EEPROM装载,同时也支持外界存储设备。
(2)通用可编程接口GPIF.GPIF是FX2一个重要技术,可设置为主从模式,主从模式下可对外部FIFO、存储器、ATA接口设备进行高速读写操作,从模式下外部主控器(如DSP,MCU)可把GPIF端口当做FIFO进行高速读写操作;支持与外设通过并行8位或者16位总线传输;支持通过GPIF编程工具编程,灵活产生各种波形。支持多CTL输出和RDY输入。
(3)增强工业级8051内核:支持48 MHz时钟;4个时钟指令周期,在时钟为48 MHz时,单指令执行时间为83.3 ns;两个UART;三个TIMER;多中断系统;多数据指针。
3 研究与实现
GDB RSP协议与USB通信技术在调试系统中主要由三部分组成:EZ-USB FX2芯片USB通信功能开发、RSP Server与GDB的RSP通信、RSP Server与EZUSBFX2芯片的USB数据交互。在进行功能开发之前,我们需要将EZ-USB FX2的开发包安装到PC机上,该开发包主要包括了EZ-USB FX2芯片的USB驱动、EZ-USB FX2进行USB开发所需的链接库和相关头文件、增强型8051单片机开发所需的头文件等开发要件。
3.1 EZ-USB FX2芯片USB通信功能开发
为了简化固件编程,Cypress提供了固件编程框架,开发人员只需要在此基础上添加少量代码就可以完成固件编程。固件编程框架已经将USB标准请求和USB电源管理包括进去了,并且提供了任务调度函数,只需要在这任务调度函数中添加部分代码就完成了固件编程。
上电复位时,固件先初始化一些全局变量,接着调用初始化函数TD_Init(),初始化设备到没有配置的状态和打开中断,循环1 s后重新枚举,直到端点0接收到SETUP包退出循环,进入循环语句while,执行任务函数,函数包括:
(1)TD_POLL()用户任务调度函数;
(2)如果发现USB设备请求,则执行对应的USB请求;
( 3 ) 如果发现U S B 空闲置位, 则调用TD_Suspend()这个挂起函数,调用成功则内核挂起,直到出现USB远程唤醒信号,调用TD_Resume(),内核唤醒重新进入while循环。
3.2 PC端USB通信开发
PC端USB通信的开发主要由三部分组成:设置要读写的内存空间地址、读内存地址空间、写内存地址空间。这三个功能主要由3个函数来实现:voidSetAddr(DWORD addr)、int ReadReg(ULONGaddr, ULONG *val)、int WriteReg(ULONG addr,ULONG data)。
3.2.1 void SetAddr(DWORD addr)函数的实现
SetAddr函数的实现过程可以由图4来表示。
3.2.2 int ReadReg(ULONG addr, ULONG *val)函数的实现
考虑到GDB调试器要频繁读取DS P 内核寄存器及相关的内存地址空间内容, 因此USB采用异步通信的方式来完成读取功能, P C 端的RSP Se r v e r 通过启动传送线程实现数据的异步传输。R e a d R e g 函数的实现流程如图5 所示。
3.2.3 int WriteReg(ULONG addr, ULONG data)函数的实现
在调试过程中,通常写寄存器的操作由程序员在调试过程中手动实现,USB通信量相比较于读操作要小得多,因此本调试系统采用简单的Write函数操作来实现DSP内存地址空间的写操作,其实现流程如图6所示。
3.3 RSP通信功能开发
RSP通信功能的开发主要包括RSP Client和RSP Server功能的开发,其中RSP Client内嵌于GDB调试器中实现。GDB与RSP Server的通信主要通过基于TCP/IP的网络Socket编程来实现。在RSP Server中,RSP命令处理函数主要用来对RSP的各种命令包在解析之后作出符合DSP条件的具体操作,该命令处理函数对RSP命令包的处理情况如表1所示。
在实现了GDB RSP协议的各个命令包之后,就可以将GDB调试命令映射到RSP命令包的组合实现常用的GDB调试命令,如表2所示。
4 结束语
GDB RSP协议与USB通信在嵌入式调试系统中发挥了重要作用。本文给出了一种在嵌入式调试系统中应用GDB RSP协议与USB通信的应用案例,解决了通过USB对特定DSP开发板的硬件仿真调试问题,使得该DSP平台的嵌入式应用程序的开发更加方便,缩短了开发周期并提高了下载目标程序的速度。该调试系统已经通过测试并通过了国家重点项目的验收。