3. INTEGRITY开发环境搭建与工具链

INTEGRITY是Green Hills Software面向安全关键领域的实时操作系统,其开发过程高度依赖配套工具链。要在一个真实项目上开始工作,第一步不是写代码,而是把MULTI IDE、交叉编译器、目标板连接和工程构建下载这条链路完整打通。本节围绕这条链路,说明每个环节的实际对象、关键配置和判断依据。

MULTI IDE:开发入口与工程组织

MULTI IDE是Green Hills提供的集成开发环境,它同时承担编辑器、工程管理、构建调度、调试前端和性能分析入口。安装完成后,通常通过multi命令或桌面快捷方式启动。MULTI本身不直接编译代码,而是调用底层编译器、链接器和调试器,因此IDE能否正常工作,取决于工具链路径和许可证是否正确。

在MULTI中,一个INTEGRITY工程通常包含以下关键文件:

  • .gpj:MULTI工程文件,记录源文件、编译选项、目标配置和构建目标;
  • .int或.bld:INTEGRITY系统构建描述文件,定义内核、地址空间、任务和驱动;
  • .ld:链接脚本,决定代码段、数据段和内存布局;
  • Makefile或MULTI内部构建规则:描述编译顺序和依赖关系。

创建工程时,建议从Green Hills提供的INTEGRITY示例工程复制一份,再修改目标板配置和源文件路径。这样能避免手动配置内核参数时遗漏关键项。工程创建后,先在MULTI中执行一次Clean和Build,确认工具链能识别所有源文件,再接入目标板。

交叉编译工具链配置

INTEGRITY开发属于典型的交叉编译:宿主机是Windows或Linux,目标机是ARM、PowerPC、MIPS或x86等架构。Green Hills工具链通常以ccarm、ccppc、ccmips等前缀区分目标架构。配置的核心是让MULTI知道使用哪套编译器、头文件和库。

在MULTI中,工具链配置主要落在两个位置:Project → Properties → Compiler和Project → Properties → Linker。需要确认的典型参数包括:

  • 目标架构:例如ARM Cortex-A9或PowerPC e500;
  • 浮点模式:硬浮点、软浮点或混合,必须与目标板FPU能力一致;
  • 优化等级:调试阶段常用-O0或-Og,发布阶段用-O2;
  • 字节序:大端或小端,必须与目标板一致;
  • 库路径:INTEGRITY内核库、BSP库和C库的搜索路径。

一个常见的命令行验证方式是直接调用编译器,确认版本和目标架构:

ccarm --version
ccarm -c hello.c -o hello.o -O0 -g

如果ccarm无法找到,说明环境变量GHS_ROOT或PATH未正确设置。在Windows下通常需要把C:\ghs\comp_<version>\加入系统路径;在Linux下则通过source ghs_env.sh或手动导出GHS_ROOT完成。

目标板连接与调试通道

目标板连接是环境搭建中最容易出问题的环节。INTEGRITY调试通常通过Green Hills Probe、JTAG/BDM调试器或以太网三种方式之一建立。选择哪种方式,取决于目标板是否已有可运行的INTEGRITY镜像。

如果目标板是空板,必须先用JTAG/BDM连接,通过MULTI的Debug → Connect加载引导程序和INTEGRITY内核。如果目标板已经运行INTEGRITY,并且网络已配置,则可以通过gdbserver或Green Hills的rtserv走以太网连接,速度更快,也不占用JTAG口。

连接时需要确认的关键点:

  • 调试器驱动已安装,MULTI的Connection配置中选择正确的Probe型号;
  • 目标板供电正常,复位电路和时钟电路工作;
  • JTAG链上如果有多个器件,需要正确设置IR长度和旁路;
  • 以太网连接时,宿主机与目标板IP在同一网段,且防火墙未拦截调试端口。
调试连接成功后,MULTI的Debug视图会显示目标CPU、当前PC和寄存器状态。如果连接失败,优先检查复位电平、JTAG时钟频率和Probe固件版本,而不是反复修改工程配置。

工程创建、构建与下载流程

一个完整的INTEGRITY工程从创建到下载,通常经历以下阶段:

  1. 新建或复制工程:在MULTI中选择File → New → Project,或直接复制示例工程目录;
  2. 配置目标:在.gpj中指定目标架构、BSP和链接脚本;
  3. 编写或导入源文件:包括应用任务、驱动和INTEGRITY配置;
  4. 构建:MULTI调用编译器生成.o,链接器生成.elf或.bin;
  5. 下载:通过调试通道把镜像写入目标板Flash或RAM;
  6. 运行与调试:设置断点、查看任务状态和内存使用。

构建阶段最值得关注的是链接脚本与内存布局。INTEGRITY要求内核、BSP和应用任务在地址空间上明确分区。如果链接脚本中的RAM起始地址与目标板实际内存不一致,下载后会出现无法启动或跑飞。一个典型的链接脚本片段如下:

MEMORY
{
  rom (rx) : ORIGIN = 0x00000000, LENGTH = 2M
  ram (rwx): ORIGIN = 0x20000000, LENGTH = 64M
}
SECTIONS
{
  .text : { *(.text) } > rom
  .data : { *(.data) } > ram
  .bss  : { *(.bss)  } > ram
}

下载时,MULTI会调用gsrec或flashprog等工具,把.elf转换为目标板可识别的格式。下载完成后,通过Run启动,观察串口输出或MULTI的Console视图。如果目标板没有输出,先确认串口波特率、启动模式和镜像入口地址。

常见环境问题排查

环境搭建阶段的问题往往集中在四类:工具链找不到、许可证失效、目标板连不上、构建产物无法运行。下面给出一个排查路径图,帮助快速定位。

INTEGRITY环境问题排查路径 工具链找不到 ccarm / ccppc 无法执行 许可证失效 License server 不可达 目标板连不上 JTAG / 以太网失败 镜像无法运行 下载后无输出或跑飞 检查 GHS_ROOT 与 PATH 确认安装目录与版本匹配 检查 License 文件与端口 确认服务器时间与MAC绑定 检查供电、复位、JTAG时钟 确认Probe固件与驱动版本 检查链接脚本与启动地址 确认串口波特率与启动模式 重新执行 Build 确认无编译错误 重新连接调试器 确认CPU寄存器可读 重新下载镜像 确认Flash写入成功 观察串口与Console 确认任务正常启动 排查原则:先确认工具链与许可证,再确认连接,最后检查镜像与启动配置

实际排查时,建议按“工具链→许可证→连接→镜像”的顺序逐层确认。例如,如果ccarm能正常输出版本号,但MULTI构建时报“compiler not found”,问题通常出在MULTI的工程属性中编译器路径未指向正确安装目录,而不是系统环境变量。如果JTAG连接时提示“target not responding”,先降低JTAG时钟频率,再检查目标板是否处于复位状态。

INTEGRITY工程对目标板配置非常敏感。修改链接脚本、BSP或内核配置后,必须重新完整构建并重新下载,不能只替换应用任务。否则可能出现内核与任务地址空间冲突,导致系统在启动阶段就进入异常。

环境搭建完成后的验证清单

当上述环节都完成后,可以用一份简短清单确认环境是否真正可用:

检查项验证方式通过标准
编译器可用命令行执行ccarm --version输出版本号与目标架构
许可证有效MULTI中执行一次完整Build无license报错,生成.elf
调试器连接MULTI中Connect目标板可读取CPU寄存器和内存
镜像下载下载后运行串口或Console有启动输出
断点调试在任务入口设置断点程序正确停在断点处

这份清单的意义在于把“环境是否搭好”从主观感觉变成可观察的结果。只有五项都通过,才建议进入后续的INTEGRITY任务开发和BSP适配工作。否则,后续调试中出现的异常很难判断是应用代码问题还是环境问题。