0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

GDB RSP协议与USB通信进行调试信息交互的开发与实现方法

电子设计 来源:郭婷 作者:电子设计 2018-12-04 08:20 次阅读

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所示。

GDB RSP协议与USB通信进行调试信息交互的开发与实现方法

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所示。

GDB RSP协议与USB通信进行调试信息交互的开发与实现方法

接收方接收到数据包后进行解析,如果接收到的数据包正确,会返回响应信息“+”字符,如果接收到的数据包出错,需要重新传送数据包,则返回响应信息“-”字符。发送方通过接收方发回的响应信息判断数据是否发送成功。

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;多中断系统;多数据指针。

GDB RSP协议与USB通信进行调试信息交互的开发与实现方法

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来表示。

GDB RSP协议与USB通信进行调试信息交互的开发与实现方法

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所示。

GDB RSP协议与USB通信进行调试信息交互的开发与实现方法

GDB RSP协议与USB通信进行调试信息交互的开发与实现方法

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所示。

GDB RSP协议与USB通信进行调试信息交互的开发与实现方法

GDB RSP协议与USB通信进行调试信息交互的开发与实现方法

4 结束语

GDB RSP协议与USB通信在嵌入式调试系统中发挥了重要作用。本文给出了一种在嵌入式调试系统中应用GDB RSP协议与USB通信的应用案例,解决了通过USB对特定DSP开发板的硬件仿真调试问题,使得该DSP平台的嵌入式应用程序的开发更加方便,缩短了开发周期并提高了下载目标程序的速度。该调试系统已经通过测试并通过了国家重点项目的验收。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4981

    文章

    18271

    浏览量

    288303
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10434

    浏览量

    206521
  • 仿真器
    +关注

    关注

    14

    文章

    988

    浏览量

    82987
收藏 人收藏

    评论

    相关推荐

    RK3568-GDB程序调试方法说明

    RK3568-GDB程序调试方法说明
    的头像 发表于 01-19 16:16 897次阅读
    RK3568-<b class='flag-5'>GDB</b>程序<b class='flag-5'>调试</b><b class='flag-5'>方法</b>说明

    TLT507-GDB程序调试方法说明

    TLT507-GDB程序调试方法说明
    的头像 发表于 01-26 10:11 510次阅读
    TLT507-<b class='flag-5'>GDB</b>程序<b class='flag-5'>调试</b><b class='flag-5'>方法</b>说明

    ARM平台如何玩转GDB远程调试

    另一部机器上运行,支持TCP/IP协议传输的各种网络,在TCP/IP网络及协议上再加搭传输GDB专有的调试操作通信协议,如此便能
    发表于 09-27 15:28

    使用GDB对RT-Smart进行代码调试方法

    开发的过程中,有时没有现成的图形化开发环境,想要进行调试时,需要使用 GDB 直接进行代码
    发表于 03-15 11:28

    嵌入式Linux的GDB调试环境建立

    remote :2345  注意:你的端口号必须与gdbserver开启的端口号一致,这样才能进行通信。  建立链接后,就可以进行调试了。调试
    发表于 04-02 14:33 394次阅读

    嵌入式Linux系统的GDB远程调试实现

    远 程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。使用GDB标准程串行协议协同工作,
    发表于 04-02 14:38 330次阅读

    Linux应用的GDB调试的原理及过程分析

    GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行
    发表于 03-05 09:44 3186次阅读
    Linux应用的<b class='flag-5'>GDB</b><b class='flag-5'>调试</b>的原理及过程分析

    GDB调试原理是什么?

    你说没有用过,那只能说明你的开发经历还不够坎坷,还需要继续被 BUG吊打。   我们都知道,在使用gcc编译时,可以使用-g选项在可执行文件中嵌入更多的调试信息,那么具体嵌入了哪些调试
    的头像 发表于 12-18 15:17 5317次阅读

    GDB串行协议概述 GDB Server的作用

    1.概述做嵌入式开发时,很多时候都会使用到GDB,从底层去理解GDB调试过程,将更加容易的理解调试的过程。 在做嵌入式
    的头像 发表于 08-10 10:10 4811次阅读
    <b class='flag-5'>GDB</b>串行<b class='flag-5'>协议</b>概述 <b class='flag-5'>GDB</b> Server的作用

    嵌入式Linux GDB调试环境搭建与使用

    /跳出函数、设置断点、查看变量等等。Ubuntu资源充足,可以直接用gdb调试程序。嵌入式Linux性能弱,一般PC上运行源码和GDB工具,可执行文件在开发板上运行。PC上通过
    发表于 11-01 17:59 8次下载
    嵌入式Linux <b class='flag-5'>GDB</b><b class='flag-5'>调试</b>环境搭建与使用

    STM32开发之 VS Code + GDB下载调试

    STM32开发之 VS Code + GDB下载调试
    发表于 11-30 19:06 7次下载
    STM32<b class='flag-5'>开发</b>之 VS Code + <b class='flag-5'>GDB</b>下载<b class='flag-5'>调试</b>

    在板子中调试GDB方法

    在板子中调试 上面的方法是直接在 ubuntu 调试源代码,只能查看源代码的错误,如果你想要你的应用程序在板子中运行,想打出它在板子上运行的 bug,就要采用下面的方法。 一般的桌面
    的头像 发表于 07-27 16:37 755次阅读
    在板子中<b class='flag-5'>调试</b><b class='flag-5'>GDB</b>的<b class='flag-5'>方法</b>

    GDB调试工具的原理

    了。 1.2 执行中进程调试 如果想对一个已经执行的进程进行调试,那么就要在gdb这个父进程中调用ptrace(PTRACE_ATTA
    的头像 发表于 11-09 17:04 318次阅读
    <b class='flag-5'>GDB</b><b class='flag-5'>调试</b>工具的原理

    如何使用GDB调试工具

    2.1 启动调试 在程序开始调试之前,要确保程序在gcc、g++编译时,有如下-g的添加调试信息的选项 gcc - g test .c -o test 1、启动未运行的程序 启动未运行
    的头像 发表于 11-09 17:17 332次阅读
    如何使用<b class='flag-5'>GDB</b><b class='flag-5'>调试</b>工具

    如何使用linux下gdb调试python程序

    如何使用linux下gdb调试python程序  在Linux下,可以使用GDB(GNU调试器)来调试Python程序。
    的头像 发表于 01-31 10:41 433次阅读