引言
在软件开发过程中,调试占用相当比例的时间和人力。调试是发现程序错误原因并纠正的过程,需要借助调试器软件工具。嵌入式应用一般采用交叉开发方式,即目标处理器的编译器、调试器运行在PC主机上,编译生成的可执行程序运行在目标处理器,通过主机的调试器调试目标程序[1]。一般情况下,调试器在设计时就确定了目标处理器。但是随着IC技术不断发展和市场需求不断变化,处理器设计技术同样在快速发展。嵌入式应用领域的需求差异巨大,如计算密集的信号处理、对功耗要求苛刻的便携式系统应用、需使用多种视频编解码标准的应用等。为了满足不同应用需求,人们提出了可配置处理器[2]。可配置处理器的主要特点是计算单元、寄存器和内存资源、核芯数量可变,这给调试器设计提出了挑战。
1 可配置处理器与调试
可配置处理器的思想是指按照应用领域的特征,利用可重用资源重构或重组,形成一个适用于特定应用领域的新计算平台[3]。它最早由美国加利福尼亚大学洛杉矶分校的Estrin教授在其论文中提出[4]。可配置是为了解决处理器硬件结构与应用需求不匹配的问题。
本文讨论的目标处理器是一款可配置数字信号处理器RecDSP4A,属于静态可配置,即运行后不能再改变处理器结构。RecDSP4A为多核数字信号处理器,但它的核芯数目是可变的。核芯数量可以根据应用配置为1、2、3、4。RecDSP4A采用超长指令字VLIW技术实现较高的指令级并行,最大发射宽度达到8指令字。RecDSP4A的可配置特性是通过可配置单元RU(Reconfigurable Unit)实现的。RecDSP4A具有16个完全相同的RU,其物理编号为0~15。RU结构如图1所示。每个RU包括多个计算部件:4个加法器ALU、4个乘法器MUL、16个数据寄存器、16个地址寄存器和一块256K数据存储器。

图1 可配置单元RU结构
RecDSP4A结构如图2所示。RecDSP4A的可配置特性主要表现为16个RU可以分别被分配到任意核芯。例如,4个核芯分别分配到4个RU,或者其中两个核芯各分配到8个RU。依据具体应用需求确定配置方案,可以有效解决硬件结构与应用之间的矛盾。同一核芯获得多个RU,就具备单指令多数据(SIMD)功能。多计算部件和SIMD技术使RecDSP4A具有很高的并行处理能力。

图2 RecDSP4A结构
可配置硬件结构具有足够的应用灵活性,但给软件工具设计带来难度,包括支持可配置处理器的调试器。由于可配置特性,这种目标处理器的核芯数量是可变的,核芯内部的RU数量是可变的,即核芯的计算部件、寄存器、存储器资源是可变的。目前现有调试器大都是针对结构不变的处理器,缺乏对支持可配置目标机调试器的研究。
2 可配置处理器调试器设计
本文调试器设计策略,首先注重软件的可复用性,这样能使嵌入式处理器厂商在激烈的竞争中更迅速、更经济地适应市场需求。其次关注软件的可扩展性,为了满足瞬息万变的市场需求,软件调试器架构必须具有较好的可扩展性,缩短软硬件产品上市时间。第三,调试器需要与具体目标机解耦,解耦的具体方法是将调试系统事物分为目标机无关和目标机相关两个部分。这样调试器就具备高效的目标机重定向能力。最后,调试器需要支持可配置处理器,即需要支持硬件资源可变的处理器。下文从架构设计、模块接口设计和支持可配置目标机三方面阐述问题。
2.1 调试器架构设计
本文提出一种基于功能模块化、层次化的调试器软件架构,从上到下依次分为用户层、调试接口层、调试功能层、目标调试层和通信层。下层为上层提供服务。各层内部按照功能划分若干模块。调试器软件架构如图3所示。

图3 调试器软件架构
根据调试器整体需求设计5层结构,其不同层次对应相应需求。
① 最底层为通信层,主要功能是解决与远程目标机通信的问题。此层包括两个功能模块,物理通信模块负责发送和接收数据包。远程通信协议是调试器与目标机间的通信规范,详细规定通信过程、调试数据包的格式,负责装包(将调试信息按照协议格式组装为数据包)和解包。
② 目标调试层包含一个目标调试模块,为上层模块提供统一的目标调试接口,便于上层调用。同时目标调试是具体目标机的调试引擎,不同目标机具有不同实现。
③ 调试功能层是调试器核心层,包含若干功能模块,每个模块为上层提供一组服务集合,如断点模块提供的服务,包括断点设置、删除、使能、失能、查询等。其中,目标机管理模块实现多芯片和多核管理。目标文件管理实现运行在多目标机上的若干可执行文件的管理。目标调试信息管理模块负责从目标文件中提取调试信息,并保存调试信息数据,提供统一查询接口供其他功能模块使用。目标机信息查询模块提供统一查询接口,能查询具体目标机的硬件信息,如核芯数目、寄存器信息等。
④ 调试接口层封装若干调试功能模块,为上层提供统一的调试接口,简化上层调用。
⑤ 最上层为用户层,包含用户交互模块,接收用户调试命令并向用户反馈结果信息。用户交互模块具体实现可以是命令行或图形界面。
按照功能划分的架构层次,各层责任明确、接口清晰。只要各层保证提供统一服务接口,可以根据不同需求任意替换各层模块的具体实现,架构就具备了高程度的可复用性、可扩展性。为支持一款新处理器,调试器只需重新实现少数与目标机相关的功能模块,如:目标机信息查询模块,调试器使用它获取目标机信息;目标调试模块,直接反映目标机支持的底层调试功能。调试器重定向目标机只需要替换目标机相关模块,实现了调试器与具体目标机解耦。
2.2 模块接口设计
本节内容包括若干重要模块的接口设计。目标调试层在调试器中起到承上启下的作用,一方面为上层功能层提供服务,另一方面是具体目标机的调试引擎,直接驱动目标机进行调试。为目标调试模块设计规范接口尤为重要,它是对功能层提供服务的承诺,同时屏蔽了具体目标机调试引擎的差异。目标调试模块接口定义见表1。
表1 目标调试模块接口

目标机信息查询模块的主要职责是提供目标处理器的硬件信息,包括芯片类型、核芯数量、寄存器信息、内存布局信息、流水线信息等。目标机信息查询模块使得调试器与具体目标机分离。所有需要使用目标机信息的模块都是通过目标机信息查询模块获得。目标机信息查询模块的接口定义见表2,详细规定所能查询的硬件信息。
表2 目标机信息查询模块接口

目标机信息查询模块本身并不包含目标机信息。本文将目标机所有硬件信息按照规范格式存储在目标机信息描述文件中,描述文件采用标准XML格式。调试器在初始化阶段将目标机硬件信息从XML文件读到内存,通过目标机信息查询模块供其他模块查询。此种方法进一步将目标机相关部分分离出来。对于使用IP核芯构建的系列多核处理器,仅实现相应目标机信息描述文件,调试器就能支持这些处理器。
2.3 支持可配置目标机
对于无可配置特性的处理器,其每个核芯结构都是不变的,目标机信息描述文件完全可以列举核芯所拥有的硬件资源。但是,对于可配置的RecDSP4A,其16个RU可任意分配到4个核芯,不同的配置方案必然导致核芯资源不同。目标机信息描述文件无法记录这种动态变化。本文提出一种解决可配置目标机硬件资源动态变化问题的方法。
首先,根据RecDSP4A的结构特征,按照RU、核芯、芯片三个层次将所有硬件资源信息记录在目标机信息描述文件中。每个RU拥有各自的数据寄存器、地址寄存器和数据存储器。每个核芯都有各自的流水线寄存器、控制寄存器等。对于整个芯片有全局共享的程序存储器。再使用参数配置模块保存RU分配信息。4个核的RU分配信息采用4个16位整数表示。例如核0的分配信息为0x000F,表示物理号为0、1、2、3的RU被分配到核0。最后,在目标机信息查询模块中动态计算核芯资源。核芯资源包含三部分:一是芯片全局共享资源;二是核私有资源;三是属于本核的RU资源。全局共享资源和核私有资源直接从目标机信息描述文件中获取。根据RU分配信息可知核的所有RU,再从目标机信息描述文件获取这些RU资源。这样就实现了可配置目标机的资源计算。
结语
本文重点介绍嵌入式处理器的调试器设计思想,特别为支持可配置处理器提供解决方法。首先讲述可配置数字信号处理器RecDSP4A的结构特点及其对调试器设计提出的挑战。根据嵌入式处理器的特点,设计具有可复用性和可扩展性的分层模块化调试架构,使调试器更易重定向不同目标机。将目标机硬件信息存储在XML文件中,并通过目标机信息查询模块获取,此方法使调试器与具体目标机解耦。最后针对可配置特性设计资源动态计算方法,实现支持可配置目标机的调试器设计。本文的调试器设计思想和实现方法,在实践中取得良好效果。