4. INTEGRITY测试环境搭建

INTEGRITY是Green Hills Software面向安全关键领域的实时操作系统,其测试环境不是“装一个IDE就能跑”的普通开发环境,而是由目标硬件、仿真器、调试探针、INTEGRITY工具链、MULTI IDE以及测试执行框架共同构成的一条完整链路。任何一环配置不当,都会表现为“编译通过但无法下载”“能下载但断点不命中”“断点命中但测试结果无法回传”等典型故障。本节围绕这条链路的集成配置展开,重点说明各环节的输入、关键配置项以及结果判读依据。

一、测试环境的组成与数据流

INTEGRITY测试环境可以理解为一条从宿主机到目标板的双向链路。宿主机侧运行MULTI IDE、INTEGRITY工具链和测试执行器;目标侧运行INTEGRITY内核、板级支持包(BSP)以及被测应用。两者之间通过调试探针(如Green Hills Probe、Lauterbach TRACE32或板载JTAG)建立物理连接,通过MULTI的调试服务器建立逻辑连接。测试执行时,测试用例在目标上运行,结果通过调试通道或串口回传到宿主机,由测试执行环境汇总为报告。

下图给出该环境的集成拓扑,重点标出各组件之间的接口与数据流向,便于在配置时逐段排查。

INTEGRITY测试环境集成拓扑 宿主机(Host) MULTI IDE 工程管理 / 编辑器 / 调试前端 INTEGRITY工具链 编译器 / 链接器 / 内核构建 / BSP 测试执行环境 测试用例调度 / 结果收集 / 报告 调试服务器(Debug Server) GDB协议 / 探针驱动 / 连接管理 宿主机接口 USB / Ethernet / 串口 目标侧(Target) 调试探针 / 仿真器 JTAG / SWD / Green Hills Probe 目标板(Target Board) CPU / 内存 / 外设 / 时钟 INTEGRITY内核 + BSP 启动代码 / 驱动 / 地址映射 被测应用(AUT) 测试桩 / 测试用例 / 断言 目标接口 JTAG / 串口 / 以太网 下载 / 控制 状态 / 结果回传

二、目标板与BSP配置

目标板是测试的最终执行载体。配置的第一步是确认CPU型号、主频、内存布局和启动方式。以常见的ARM Cortex-A9目标板为例,需要明确DDR起始地址(如0x80000000)、内核加载地址、异常向量表位置以及串口调试口编号。这些信息必须与INTEGRITY BSP中的配置文件一致,否则内核启动后会在早期挂死。

BSP配置通常涉及以下关键项:

  • 内存映射:在.ld链接脚本和BSP的memmap.h中定义代码段、数据段、堆栈和共享内存区域。
  • 时钟与定时器:配置系统节拍(tick)频率,例如1000Hz,用于INTEGRITY调度和超时判断。
  • 中断控制器:设置GIC基地址和中断优先级分组,确保测试用例中的中断响应可预测。
  • 串口:指定调试串口的波特率(如115200)、数据位和停止位,用于输出测试日志。

配置完成后,用INTEGRITY工具链构建内核镜像,生成integrity.bin或integrity.elf。若构建报错,优先检查BSP路径是否与目标板版本匹配,以及编译器选项中的-mcpu是否与CPU一致。

三、仿真器与调试器接入

当目标硬件尚未就绪或需要早期验证时,可使用仿真器替代真实目标板。INTEGRITY支持Green Hills的Simulator以及第三方指令集仿真器。仿真器配置的核心是“目标描述文件”,其中定义CPU模型、内存大小和外设行为。仿真器启动后,MULTI通过调试服务器连接仿真器,操作方式与真实目标基本一致,但需要注意仿真器不反映真实时序,因此性能相关测试不能以仿真结果为准。

真实目标板则通过调试探针连接。以Green Hills Probe为例,配置步骤包括:安装探针驱动、在MULTI中新建连接、选择探针类型和接口(JTAG/SWD)、设置目标电压和时钟频率。连接成功后,MULTI的调试控制台会显示目标CPU信息。若连接失败,依次检查:探针供电是否正常、JTAG线序是否正确、目标板是否已上电、复位引脚是否被拉低。

调试器连接成功后,建议先执行一次“连接并停止”操作,确认能读取PC指针和核心寄存器,再下载镜像。这一步能提前暴露大部分硬件连接问题。

四、MULTI IDE与测试执行环境的集成

MULTI IDE是INTEGRITY开发的主要前端。测试执行环境的集成,本质上是让MULTI能够自动加载测试用例、运行并收集结果。常见做法是在MULTI中创建“测试构建配置”,将测试用例源文件与AUT一起编译链接,生成带测试桩的可执行镜像。

测试执行环境通常由三部分组成:测试用例注册表、测试运行器和结果收集器。测试用例注册表在编译时生成,记录每个用例的函数入口和预期结果;测试运行器在目标上按顺序调用用例;结果收集器通过调试通道或串口将PASS/FAIL及失败原因回传宿主机。在MULTI中,可以通过multi命令行或脚本触发一次完整测试运行,例如:

# 示例:在MULTI命令行中加载并运行测试镜像
multi -t ghs_probe -cpu cortex_a9 -load integrity_test.elf
target remote | ghs_probe --jtag
load
run
# 测试运行器自动执行,结果输出到串口和MULTI控制台

结果判读时,重点关注三类信息:用例通过率、失败用例的断言位置、以及目标是否在测试过程中发生异常复位。若出现异常复位,应检查测试用例是否触发了未处理的中断或访问了非法地址。

五、集成配置检查表

为便于实际搭建时逐项核对,下表给出关键配置项及其验证方法。表中参数为示例值,实际使用时需根据目标板和项目要求调整。

配置环节 关键项 示例值 验证方法
目标板 DDR起始地址 0x80000000 读取BSP memmap.h,与链接脚本一致
BSP 系统节拍 1000 Hz 内核启动日志打印tick频率
调试探针 JTAG时钟 10 MHz MULTI连接后读取IDCODE成功
串口 波特率 115200 终端能收到内核启动信息
测试执行 用例注册表 自动生成 运行后输出用例总数与通过数
结果回传 回传通道 调试通道+串口 宿主机收到PASS/FAIL记录

六、常见集成故障与排查方向

集成过程中最典型的故障是“下载成功但无法运行”。此时应检查镜像入口地址是否与BSP定义的启动地址一致,以及CPU是否处于正确的异常级别。另一个常见问题是“断点不命中”,通常是因为代码运行在只读内存或优化后地址偏移,建议在测试构建时关闭高阶优化(使用-O0或-Og)并保留调试符号。

若测试结果无法回传,先确认串口线是否连接正确,再检查测试运行器是否在目标上真正执行。可以在测试运行器入口处设置断点,观察是否命中。若命中但无输出,检查结果收集器的缓冲区是否溢出或回传通道是否被其他任务占用。

在安全关键项目中,测试环境的配置变更必须纳入配置管理。探针固件版本、BSP版本、工具链版本和测试脚本版本都应记录,避免因环境漂移导致测试结果不可复现。