S698系列处理器软件调试工具V8MON的设计与应用
1 引言
本文引用地址:http://www.amcfsurvey.com/article/139098.htm在嵌入式软件开发中,调试是一个重要的环节,调试工具是衡量软件开发环境优劣的重要因素。可以说嵌入式交叉调试器是嵌入式系统开发者使用最多的工具,也是整个开发周期中使用时间最长的工具。
目前基于SPARC核的嵌入式处理器已经成为欧美市场的主流,2003年珠海欧比特控制工程股份有限公司成功研制出国内第一款SPARC V8架构32位嵌入式处理器S698,经过几年发展,S698已成为系列化产品,有军品级、商业级、多处理器类型等,并广泛应用于国防、航空、通信等领域。
V8MON是欧比特公司自主研发的基于S698系列处理器的软件调试器,可以运行于Windows以及Linux平台,具有使用简捷、接口丰富等特点,同时也可运用于其它SPARC V8架构的处理器平台。V8MON的调试功能主要包括:程序下载、运行、内存读写、反汇编、断点设置、数据跟踪等。
2 调试原理
2.1 交叉调试
嵌入式系统中的软件调试与桌面软件的调试有很大的不同。调试嵌入式系统时,调试器和被调试程序往往是物理上分离的。调试器运行在宿主机上,而被调试程序运行在目标机上,宿主机与目标机之间通过某种媒介进行通信。通常情况下,还要在目标机上运行一个称为调试代理(Debug Agent)的监控程序,由它来负责与运行在宿主机上的调试器进行通信,控制被调试程序的执行,并将被调试程序的执行情况及时反馈给调试器。
使用调试代理软件的最大的缺点是占用目标系统的资源,消耗处理器时间,造成应用程序的最终运行环境和调试环境有差异,且影响被调试程序的运行。目前一些高端处理器都内置有硬件调试逻辑单元,可以通过硬件方式完成调试过程中的通讯、控制工作,且不占用系统资源,不影响程序的运行,不需要调试代理程序的参与。
S698系列处理器的内部就集成有调试单元DSU(Debug Support Unit),DSU可以独立于IU处理单元在内部AHB总线上产生读写时序,所以可以直接到访问处理器上的各种资源(如内存空间、片内寄存器、ROM地址等)。
V8MON调试器运行在主机端,通过串口、以太网等方式与目标硬件系统相连,通过收送指令的方式与DSU调试单元进行交互,从而完成对目标系统的调试。可以看到这种调试模式无需在硬件系统上烧写监控调试软件,也不需要借助硬件仿真器,甚至不需要硬件处理单元的参与。V8MON除了与DSU通讯之外,还要完成对人机接口,以及文件解析、GDB协议分析等功能,其完整的模块结构如图1所示。
图1 V8MON连接结构图
V8MON不仅可以设置软件断点(指令级中断),还可以设置硬件断点。通过写DSU调试单元中断点寄存器的值可以进行硬件断点设置,V8MON不仅对地址还可以对数据以及总线的信号进行复杂的触发控制设定,从而满足对特定事件的中断响应,增加了灵活性,同时可以在ROM中设置断点和观察点,极大地方便调试。
V8MON还提供追踪功能,可以不停止CPU的运行而实时监视芯片总线的信息,这些信息存储在处理器内部的trace buffer中, V8MON可以随时读取这些信息,从而根据这些数据信息重现处理器的历史状态、数据以及程序流程等。合理使用此功能,用户可以得到细致、准确的运行分析数据,而又不必借助任何硬件设备,可以大大降低分析的成本。
2.2 gdb连接
V8MON有两种操作模式:命令行模式和GDB模式。在命令行模式下,V8MON命令通过窗口终端控制台手工输入,V8MON通过DSU协议把指令传输给目标系统DSU调试单元;在GDB模式下,V8MON作为一个网关,V8MON首先把客户端通过远程GDB协议发过来的GDB命令翻译为调试指令,再通过DSU协议把调试指令传输给目标系统DSU调试单元。
Gdb是GNU软件序列中的调试工具,Gdb可以调试各种程序,包括C、C++、JAVA、PASCAL、FORAN和一些其它的语言,支持现有的大部分处理器平台,即可用于上位机软件调试,也可用于嵌入式软件交叉调试。
V8MON通过标准socket接口与gdb连接,V8MON为socket服务器端,gdb为客户端。V8MON和gdb可以在同一个PC机上运行,也可以在两台不同的PC上运行,这两台机器之间通过以太网相连;连接后用户可以在主机上用gdb对目标系统进行调试,V8MON在目标系统与gdb之间进行命令转换,起到桥梁纽带作用。
图2 V8MON GDB模式调试原理框图
采用gdb调试更关注于软件本身,较适合对大型应用软件的调试,用户可以在高级语言层面调试应用程序,如查看变量,源代码级单步执行等。同时可以进一步将gdb调试内嵌到到集成开发环境中,从而获得更直观、更友好的人机界面,此时用户的操作全部是在图形界面下完成,无需了解V8MON的任何操作细节。
3 设计实现
V8MON大部分由C语言编写,使用gcc编译器编译生成,链接了readline、pthread等系统库,并且对gdbserver、utils等开源软件包进行了移植。以下是工程的主Makefile文件内容:
V8MON内部可以分为3层,包括:命令层,调试驱动层和调试接口层。
(1) 命令层:由命令解析器组成,可以解析一般通用的用户命令以及GDB命令,例如:下载、运行等。
(2) 调试驱动层:实现特殊的命令,这些命令与目标处理器的构造相关。V8MON在启动的时候会扫描目标硬件,检测当前处理器类型及其配置,如果是支持的处理器,调试驱动层激活,可以执行特殊的调试命令。
(3) 接口驱动层:实现调试连接协议(DSU protocol),通过协议与目标系统的DSU单元通讯。
可以看到V8MON的主要工作就是命令/协议的解析以及传递,完成数据流由用户接口到目标系统之间的双向传输。下图指明V8MON内部的数据传递流程,方框中是各协议层数据的原始模型;示例条件为:gdb工作模式,通过串口连接目标系统,用户输入内存查看命令。
图3 V8MON内部数据流
4 应用举例
通过V8MON的命令行操作,用户可以开速、简捷的完成调试操作,V8MON的主要操作项如下文。
4.1 文件下载
通过load命令可以将一个SPARC V8体系的应用程序下载到目标系统中:
V8MON支持的文件格式为elf32-sparc。V8MON内建的ELF解析器,可以将程序的每个功能段正确的下载到对应的链接地址上,下载完成后程序运行时的%pc指针指向程序的入口地址。下载过程中,控制台将输出段地址、段字节大小、程序入口地址等信息。
4.2 程序运行
运行程序之前,必须先下载程序,而下载的程序必须确保是经过sparc-rtems或sparc-elf工具链编译得到。
目标系统的UART1用来输出应用程序的打印信息,这些信息并不能从V8MON的控制台显示,而如果使用-u参数启动V8MON,V8MON将初始化目标系统的UART1为回采模式,这样DSU单元可以读到从UART1输出的信息,进而可以在V8MON控制台上把这些信息显示出来。
4.3 插入断点和监测点
程序下载完后,可以通过break或hbreak命令设置断点,其中break命令用来添加一个软断点(ta 1),而hbreak命令是通过IU单元的watchpoint寄存器添加插入一个硬断点,在调试只读代码(如程序在ROM中运行)时只能使用硬断点。
一个断点只能作用于一个字的地址,当程序运行到此地址时,系统切换到调试模式。软断点可以设置在基于RAM的代码段的任何位置,包括禁止trap的区域(如trap处理函数中);S698处理器提供两个硬断点,设置硬断点将冻结系统的trace buffer。
例如添加断点命令:
查看寄存器
在命令行下可以随时输入reg命令查看所有窗口寄存器的当前值:
也可以使用 reg wn命令查看指定窗口寄存器的值,其中n表示窗口号。使用float指令可以查看FPU寄存器的值(存在FPU运算单元的前提下)。
4.4 查看内存
可以通过mem命令查看任何内存地址上的内容,mem命令的参数包括目标地址和长度,这两个参数都可以缺省。如果符号表被加载,可以使用文本符号代替地址。
用户也可以通过disas命令将内存中的内容反汇编成SPARC V8机器指令进行显示。
4.5 使用trace buffer
处理器中的trace buffer用来保存最近的执行指令以及最近的AHB总线上的传输数据,V8MON启动时自动使能trace buffer,启动后用户也可以通过tmode命令使能或禁止trace buffer。ahb/inst/hist分别用来显示trace buffer中的内容。trace buffer在调试时可以起到辅助作用。
4.6 多处理器支持
在多核处理器(例如S698P4)系统中,可以使用cpu命令来切换各处理器的调试状态。在对称多核处理器中,处理器的编号为0~n-1,n表示处理器个数。每个处理器可以设置为使能、禁止两种状态,处理器使能后,将响应run、cont、go等命令。当处理器禁止时,将处于挂起状态,不响应V8MON的任何指令。使用cpu enable n 命令将使能对应处理器,cpu disable n 命令将禁止对应处理器。系统允许同时有多个处理器被使能,但同时只能有一个处理器被激活。所有的调试命令如查看寄存器、增加断点等只对被激活的处理器有效。
可以使用gdb来调试多处理器系统,gdb连接后,当前被激活的处理器负责接收gdb命令。
5 结束语
调试器不仅是软件除错的工具,也是硬件除错必不可少的工具,选好调试器、用好调试器、理解调试器的原理对嵌入式开发工作都大有裨益。调试技术的理论基础并不复杂,但是调试本身却是一门实践性非常强的技术,只有在不断的实际操作中才能取得进步,希望本文的讲解能够起到抛砖引玉的作用,引导读者进入S698调试开发之门。
参考文献:
[1] 珠海欧比特控制工程股份有限公司. V8MON用户手册. 2009.
[2] 珠海欧比特控制工程股份有限公司. S698-MIL芯片用户手册. 2011.
[3] 珠海欧比特控制工程股份有限公司. ORION4.0 用户手册. 2005
[4] THE SPARC-V8 ARCHITECTURE MANUAL, Version 8. SPARC International.
[5] 蒋晓华,李付海,祁波. SPARC体系的S698系列SoC及其应用[J]. 单片机与嵌入式系统应用, 2007, 8: 84-85.
[6] 龚永红,梅卫平,蒋晓华,唐芳福等. 32位嵌入式处理器S698的SPARC V8指令集[J]. 新特器件应用,2007,11:25-28.
[7] 蒋晓华,梁宝玉,王祝金,颜军. S698系列处理器中指令流水的设计与实现[J]. 半导体技术,2009,1:24-26.
c语言相关文章:c语言教程
c++相关文章:c++教程
评论