MXT0106处理器调试环境的设计与实现

2022-03-24 09:15:27 | 浏览次数:

引言

随着软件开发规模的不断扩大,调试工具在软件开发中的作用显得越来越重要。针对嵌入式处理器的调试环境的搭建有很多的方法,包括在线仿真器、ROM(只读存储器)仿真器及类似于调试支持单元(Debug SupportUnit,简称DSU)的硬件调试,而GDB(GNU的软件调试器)完全是通过软件方式实现调试。

本文针对国产SPARC,v8处理器,设计实现了其基于处理器硬件调试机制的GDB调试环境。

调试环境的硬件基础

MXT01 06是北京时代民芯公司设计的一款SPARC V8体系结构的嵌入式处理器,具有非常丰富的外设接口,只需加上存储器和应用相关的外围电路,就可以构成完整的单板计算机系统。

它具有片内硬件调试功能,可以辅助软件在目标硬件上进行调试。该部分功能包括两个模块:调试支持单元(DSU)和调试通讯连接模块(如图1所示)。对这两个模块的理解和使用,是开发调试环境的基础。

调试支持单元

调试支持单元(DSU)可以通过任何在内部总线上的主设备来调试处理器。通过DSU将处理器置于调试模式(进入调试模式时流水线冻结),允许从外部调试处理器。DSU主设备在内部总线上占有一个地址空间,通过这个地址空间,可以访问处理器的寄存器和跟踪缓冲区的内容,CPU内部的所有寄存器、cache(缓存)在总线上都有映射的空间,调试时直接由DSU按地址访问。用户也可以调试和/或从中断的位置重新执行。

DSU还有两个断点寄存器来匹配任何内部的总线地址或者执行的指令。

DSU通讯连接

DSU通讯连接包含一个串口,该串口在内部总线上作为一个主设备。该串口支持简单的通信协议传输访问参数和数据。连接命令由一个控制字节、32位地址和可选的写入数据组成。数据以8位为基础进行发送:包括一个起始位、8位数据位和一个停止位。

通过通讯链路,可以对内部总线上任何地址进行读/写操作。通过设置长度字段为n-1(其中n标明传输字的长度),可以进行块传输。其协议格式如图2。

BMDEBUG调试环境

实现的调试环境运行于PC机的Windows平台上,具有源代码级和汇编级的调试能力,能够远程调试基于MXT0106处理器的程序。它和处理器配合工作,能最大限度地利用处理器的硬件调试支持单元,完成调试;并且和集成开发环境SPE—c很好地整合在一起。方便用户使用。

体系结构

调试器环境分为三层,从上到下分别为:用户界面、调试核心、通讯模块,整体结构如图3所示。

用户界面是调试器与用户互动的媒介,用户可以通过该界面观察调试的进行过程:获取处理器的当前信息;修改被调试程序的某些状态,如寄存器、存储器中的值,继续执行的位置等。

调试核心控制SPARC v8处理器调试的进行。核心通过通讯模块取得SPARC空间处理器的状态和调试过程中的信息,向上返回用户界面,又把从用户界面接收到的控制信息经过分析和处理后发给SPARC v8处理器。

通讯模块在调试核心和与SPARCv8处理器的DSU调试接口之间建立连接,接收调试核心发来的命令,封装成DSU接口能够识别的帧,发送给DSU。同时,还接收SPARC v8处理器发回的数据、解析数据,向上送回调试核心。通讯模块分为协议转换和物理通讯接口两个子部分。

用户界面及实现

用户界面作为与用户的交互窗口,需要能够完整地提供被调试处理器的所有信息和资源,并能够有能力针对处理器的运行状态进行控制,此外还需要有良好的视觉感,使用户不会产生不易用的感觉。所以针对用户界面主要实现以下功能:

1.源代码视图,该视图提供调试需要的各种信息。另外可在可执行的源代码上标注不同类型的断点。断点可以针对c级源代码,也可针对汇编级源代码。

2.堆栈视图,该视图提供函数之间的调用关系。包括调用顺序和函数所在的文件位置。

3.断点视图、用于显示用户在源代码中设置的所有断点及断点信息。

4.CPU视图,用于显示所有与硬件直接相关的信息,包括内部寄存器、存储器、片上外设寄存器、存储器、cache、tracebuffer(跟踪缓冲区)等。

5.变量视图,用于显示程序中与变量相关的信息,如名称、类型、值等。

6.表达式计算视图,用于计算被调试程序中任伺合法变量或对象的值。

7.错误报告,当SPARC v8处理器出现陷阱、异常时,调试器有一个单独的向用户报告错误的机制。

核心调试器

核心调试器采用调试SPARC平台ELF格式可执行程序的SPARC-ELF—GDB调试器。其中符号表和表达式计算是两个重要的功能。

符号表通常作为可执行代码的一部分存在于用户希望调试的程序中。调试器参考符号表以建立源代码与可执行指令所在地址之间的映射关系。这种“状态”信息对于设置断点是必要的指导。符号表也包含程序中变量的信息,以便调试器能够把源代码级的变量或数据结构映射到下位机的一个特殊位置或被调试程序数据存储器中的某个位置。调试信息的产生通过在编泽时增加编译选项GDWARF来使生成的EXE程序附加DWARF格式的调试信息,符合调试器的要求。

表达式计算部分能够计算表达式值、申请操作数以及调用函数,这些表达式、操作数和函数都是用户特别指定的。用户可以输入一段短代码,调试器应根据被调试程序当前执行位置的结果计算结果。

调试控制

调试控制主要包括初始化、执行控制、断点控制、状态检测与报告等。

初始化

发送命令与SPARC v8处理器的DSU通信速率并建立连接。如果连接建立成功则继续进行,如果失败则通知用户。

根据配置表配置片上设备:调试器中包含一个默认的配置表,该配置表用于默认的用户开发板。同时,用户也可以修改该开发表,根据需要配置片上设备。

下载程序:选择需要调试的程序,解析其文件格式,利用DSU命令把该程序下载到存储器内。

控制运行:通过修改pc和NPCf下一个程序计数器)寄存器值,控制程序开始执行的起始地址。使用该功能可以从程序中的某一段开始执行。

断点

断点(breakpoint)是用户在调试过程中,希望程序停止的位置。当用户确定断点位置后,调试器根据断点所在地址,用“TA1”指令替换地址处的原始指令。当程序运行到此时,由于“TA1”指令处理器会进入调试状态。被替换的原始指令由调试器保存,当程序继续执行时,把原始指令

写回原始位置。通过设置断点可以完成用户断点的功能。

用户断点是最常用的断点,通常于调试的开始和调试中停止时设置。断点标注于c级源代码或汇编级代码上,当程序运行到断点语句时,程序运行停止。除此之外,还可以使用断点功能间接实现源代码级单步,运行到此,完成函数等执行控制的功能。

执行控制

调试控制(execution contr01)采用GDB调试器核心的功能,包括源代码级单步、运行到此、完成函数、全速运行及单步执行等:从用户界面操作到执行控制的过程转换由GDB调试器完成。

不同于用户断点明显标注于源代码之中,当执行源代码级调试时,断点被调试器隐性的添加于被调试程序代码之中。调试器根据源代码与汇编指令之间的映射关系,在与源程序代码一步相应的一组汇编指令之后添加断点,以达到在用户看来一次只运行了一条源代码。用户断点的另一种形式,在代码中指定运行停止的位置。与用户断点不同是,该断点不必标注在代码中,当程序运行停止之后,该类断点就不再起作用。即这种断点仅仅中断程序运行一次。

完成函数功能用于直接完成正在调试的函数。使用断点指令替换函数返回地址处的指令可以实现此功能。

全速运行则发生在用户设置完成断点,或在某个断点之后调试完成希望继续执行被调试程序时。这时被调试程序“全速”执行,当执行过程中发生调试事件,如碰到“TA 1”时,执行停止,处理器进入调试模式:如果没有遇到调试事件,则程序继续运行。

单步指仅运行一步处理器就会回到调试模式下。这里的单步仅指汇编级单步,C一级的单步通过上面的断点方式保证。

状态检测与报告

该模块用于实时检测下位机的状态,判断下位机是处于运行模式、调试模式还是错误模式。检测方式采用查询方式,即根据上位机最近一次的控制,按照一定的时间间隔查询下位机模式,根据查询结果不同向调试器报告下位机状态。

通信模块

该层实现了调试核心与SPARC v8处理器之间建立连接的功能:发送DSU协议数据给SPARC v8处理器,从v8处理器接收DSU的反馈数据给调试核心。该模块的主要的任务是控制PC机和DSU串口之间的通讯,以及协议的转换,在软硬件控制实现上都比较简单。

结语

本文讨论了针对SPARC v8嵌入式处理器的软件调试环境的设计实现。通过上面的工作,实现了MXT0106处理器的调试环境,并集成在SPE-C集成开发环境中,实现了统一的开发和调试功能。下一步,会进一步提高调试器的健壮性,针对操作系统的调试需求,提供进程监控、任务统计等相关方面的工作。

推荐访问: 处理器 调试 环境 设计 MXT0106