蜂鸟E203 - 调试机制

570 阅读5分钟

交互式调试 和 追踪调试

交互式调试

交互调试功能是处理器提供的一种常见的调试功能,从最低端的处理器到最高端的处理器,交互调试几乎是必备的。交互调试是指调试器软件GDB能够对处理器取得控制权,进而以一种交互的方式进行调试。

下载或启动程序

通过设定各种特定条件来停止程序。

查看处理器的运行状态,包括通用寄存器的值,存储器地址的值。

查看程序的状态,包括变量的值,函数的状态

改变处理器的运行状态,包括通用寄存器的值,存储器地址的值。

改变程序的状态,包括变量的值,函数的状态。

对于嵌入式平台而言,调试器软件一般是运行于主机端的一款软件,而被调试的处理器往往在嵌入式开发板之上,这是交叉编译和远程调试的一种典型情形。 调试器取得处理器的控制权 需要 硬件的支持。

在处理器核的硬件中,往往需要一个硬件调试模块。该调试模块通过物理介质JTAG接口与主机端的调试软件进行通信,受其控制,然后调试模块对处理器核进行控制。

假设调试软件GDB试图为程序中的某个PC地址设置一个断点,然后希望程序运行到此处停下来,之后GDB能够读取处理器的某个寄存器当时的值。调试软件和调试模块会进行如下协同操作。

breakpoint指令,产生异常,进入调试模式的异常服务程序。

GDB软件通过底层驱动JTAG接口访问远程处理器的调试模块,对其下达命令,告诉它读取哪个寄存器的值。

跟踪调试

为了避免交互式调试对处理器的干扰性,便引入了跟踪调试机制。

即跟踪器只跟踪记录处理器核执行过的所有程序指令,而不会打断,干扰处理器的执行过程。

RISC-V的架构的调试机制

调试器的软件实现

完整的调试机制需要调试器软件GDB 和 硬件 密切协作。

调试模式

处理器核一旦遇到此类触发条件便会进入调试模式。开发人员可以将调试模式当成一种特殊的异常,当进入调试模式的时候,处理器核会进行如下更新。

处理器PC跳转到0x800

将处理器正在执行的指令的PC保存到dpc寄存器中。

将进入调试模式的原因保存到dcsr寄存器中。

调试指令

RISC-V标准指令集定义了一条特殊的断点指令 - ebreak。此指令主要用于调试软件,设置断点。 此处理器核执行到这条指令时会跳转到异常模式或者调试模式。

dter指令,dret指令执行后,处理器进行如下更新。

处理器PC跳转到dpc寄存器中的值指向的地址,这意味着处理器退回进入调试模式之前的程序执行点。

调试中断

处理器核在接收到此中断请求之后,将进入调试模式,调试中断是进入调试模式最主要的触发条件。

蜂鸟E203处理器的调试机制

蜂鸟E203处理器中的交互式调试

调试主机为PC的调试平台。由于嵌入式系统往往以交叉编译,远程调试的方式工作。因此软件的开发,编译在PC端完成。 并且在PC端进行调试软件,例如使用GDB调试软件对嵌入式硬件平台进行调试。

PC端的GDB软件 需要与GDBserver通信,GDBserver可以使用开源软件OpenOCD充当。 OpenOCD包含了各种常见芯片的驱动,如USB转JTAG芯片,因此此芯片的USB接口使用USB线与PC连接。此芯片的JTAG接口则可以与RISC-V处理器 的SOC硬件平台相连。

在RISC-V的SOC中,JTAG接口由DTM模块转换成 内部的调试总线。 通过该总线访问调试模块。

DTM

debug tranport module: 主要用于将JTAG标准接口转换成内部的调试总线。

DTM使用状态机对 JTAG协议进行解析,然后将JTAG标准接口转换成调试总线。 由于DTM处于JTAG时钟域,与调试总线要访问的调试模块不属于同一时钟域,因此需要同步。

硬件调试模块

硬件调试模块在整个调试机制中担任了重要角色。

调试模块中实现了若干寄存器,调试ROM,调试RAM。这些资源既可以被调试总线访问,也可以被系统存储总线访问。

调试ROM模块中包含了处理器进入调试模式需要执行的异常处理程序。

在运行调试ROM中固定的异常处理程序时,使用调试ROM存放一些临时数据和中间数据。

调试中断处理

与普通中断一样,调试中断会作为一个 输入信号输送给处理器的交付模块。

交付模块接收来自调试模块的一个中断信号的请求。

调试中断一旦被接受,处理器变会冲刷流水线,将后续的指令取消掉,并向IFU模块发送冲刷请求和重新取指PC,PC的值为0x800,用以重新从新的PC地址开始取指令。