3. INTEGRITY开发环境搭建

INTEGRITY BSP移植的第一步不是改代码,而是把“能编译、能链接、能下载、能调试”这条链路先打通。很多移植失败并非BSP本身有问题,而是MULTI IDE、许可证、交叉编译器或目标连接配置中某一环没有对齐。本节围绕MULTI IDE、INTEGRITY系统构建工具链、许可证配置和交叉编译环境验证四件事,给出可落地的搭建与验证方法。

一、MULTI IDE与INTEGRITY工具链的组成关系

Green Hills软件的核心是MULTI IDE,它并不是一个单纯的编辑器,而是集成开发环境前端。真正完成编译、汇编、链接、库生成和调试服务的是其后端的工具链组件。理解这一点,才能明白为什么“IDE能打开工程”不等于“环境已就绪”。

典型组件包括:MULTI IDE(工程管理、源码编辑、调试界面)、编译器(如ccarm、ccppc、ccmips等,按目标架构选择)、汇编器(as)、链接器(elxld/ld)、归档器(ar)、二进制工具(objcopy、objdump、size等)、调试器与目标服务(MULTI Debugger、gdbserver或Green Hills专用target server)、以及INTEGRITY系统构建工具(如mkintegrity、integrity.bsp相关脚本、gmak或make驱动)。

INTEGRITY的构建通常分两层:一层是BSP/内核镜像的构建,另一层是应用工程的构建。前者依赖INTEGRITY安装目录下的系统构建脚本和BSP目录,后者依赖MULTI工程文件(.gpj)和链接脚本。两者共用同一套交叉编译器,但使用的库、启动代码和内存布局不同。

INTEGRITY开发环境组成与验证链路 MULTI IDE(前端) • 工程管理 .gpj • 源码编辑 / 语法检查 • 构建配置(Debug/Release) • 调试会话与断点管理 • 目标连接配置 交叉工具链(后端) • 编译器 cc<arch>(ccarm/ccppc…) • 汇编器 as / 链接器 elxld • 归档器 ar / objcopy / objdump • 运行时库与C++库 • 链接脚本 .ld / 启动代码 INTEGRITY系统构建 • BSP目录与板级参数 • 内核镜像构建脚本 • 系统配置 .int / .bsp • 地址映射与内存分区 • 生成 .elf / .bin / .hex 许可证配置层(License) • 许可证文件路径:GHS_LMD_LICENSE_FILE / LM_LICENSE_FILE • 节点锁定(node-locked)或浮动(floating)授权;浮动需指定 license server 端口 • 校验命令:lmutil lmstat / ghs_license_check • 授权组件:编译器、调试器、INTEGRITY内核 交叉编译环境验证链路(由左至右逐级确认) ① 编译器可执行 ccarm --version ② 许可证可用 lmstat 显示授权 ③ 最小程序编译 hello.c → .o → .elf ④ 目标连接 target server 在线 ⑤ 下载运行 串口/调试器输出 授权约束

二、许可证配置:先确认授权,再谈编译

Green Hills的许可证通常由ghs_license.dat或类似文件描述,授权方式分为节点锁定和浮动两种。节点锁定把授权绑定到某台主机的MAC地址或hostid,适合单机开发;浮动授权由license server统一分发,适合团队。无论哪种方式,环境变量必须指向正确位置。

Linux下常见配置方式是在~/.bashrc或/etc/profile.d/ghs.sh中设置:

export GHS_LMD_LICENSE_FILE=27000@192.168.1.50
export LM_LICENSE_FILE=$GHS_LMD_LICENSE_FILE
export GHS_ROOT=/opt/ghs/comp_2023
export PATH=$GHS_ROOT/comp_2023/bin:$PATH

其中27000@192.168.1.50表示浮动授权服务器地址与端口,若为节点锁定则改为本地文件路径,如/opt/ghs/license/ghs_license.dat。配置完成后,用lmutil lmstat -c $GHS_LMD_LICENSE_FILE -a查看授权状态,确认Users of ghs_compiler、ghs_debugger、integrity等特性处于可用状态。若显示Cannot connect to license server,优先检查网络、防火墙端口和服务器进程,而不是反复重装工具链。

许可证未生效时,编译器可能仍能启动,但在链接或调试阶段报出“license error”或直接退出。因此建议把许可证检查放在环境验证的第一步,而不是等到编译失败后再排查。

三、交叉编译环境验证:从最小程序到目标运行

环境是否可用,不能只看IDE能否打开。建议按“编译器→许可证→最小程序→目标连接→下载运行”的顺序逐级验证。下面以ARM架构为例,假设目标编译器为ccarm,实际名称以安装目录bin下为准。

第一步,确认编译器可执行:

which ccarm
ccarm --version

若输出编译器版本与目标架构信息,说明PATH配置正确。第二步,编写最小验证程序hello_integrity.c:

#include <stdio.h>

int main(void)
{
    printf("INTEGRITY cross compile OK\n");
    return 0;
}

第三步,执行编译与链接。注意INTEGRITY应用通常需要指定目标架构、浮点ABI、优化等级和链接脚本。示例命令如下:

ccarm -c hello_integrity.c -o hello_integrity.o \
      -cpu=cortex-a9 -fpu=vfpv3 -O2 -g

ccarm hello_integrity.o -o hello_integrity.elf \
      -cpu=cortex-a9 -fpu=vfpv3 \
      -T integrity_app.ld

若链接阶段提示未定义符号,常见原因是链接脚本未包含INTEGRITY运行时库,或启动代码未加入。此时应检查-T指定的链接脚本是否与BSP目录中的内存布局一致,并确认库路径-L指向INTEGRITY安装目录下的lib/arm等对应目录。

第四步,用objdump或size检查生成物:

size hello_integrity.elf
objdump -h hello_integrity.elf

重点观察.text、.data、.bss的地址是否落在BSP定义的RAM区间内。如果.text起始地址为0x00000000或明显超出DDR范围,说明链接脚本的MEMORY段配置有误,需要回到BSP的integrity_app.ld或target.ld中核对ORIGIN和LENGTH。

四、目标连接与下载运行验证

编译通过只证明“主机侧工具链可用”,还不能证明“目标侧可运行”。接下来需要配置MULTI的目标连接。常见方式包括:通过Green Hills Probe、通过以太网target server、或通过串口+gdbserver。以以太网为例,在MULTI的Debug → Connect中选择目标类型,填写目标IP和端口,确认target server已启动。

连接成功后,将hello_integrity.elf下载到目标板并运行。若串口输出INTEGRITY cross compile OK,说明交叉编译、链接、下载、运行四个环节全部打通。若下载失败,优先检查目标板是否已运行INTEGRITY内核或bootloader、内存地址是否与链接脚本一致、以及调试器授权是否包含目标架构。

建议把上述验证过程固化为一个env_check.sh脚本,每次更换主机或升级工具链后执行一次。脚本至少包含:编译器版本检查、许可证状态检查、最小程序编译、ELF段地址检查、目标连接测试五项。这样可以把环境问题与BSP问题尽早分离。

五、常见问题与判断依据

现象优先排查判断依据
ccarm: command not foundPATH与GHS_ROOTwhich ccarm无输出
License error / feature not available许可证文件或服务器lmstat显示无可用授权
链接报undefined reference链接脚本与库路径缺少运行时库或启动代码
.text地址异常MEMORY段ORIGIN/LENGTHobjdump -h地址超出DDR范围
下载失败或连接超时target server与目标IPping通但端口未监听
运行无输出串口配置与内核状态目标未运行或波特率不匹配

完成本节的环境搭建后,你应当能够独立回答三个问题:当前主机上的交叉编译器是否可用、许可证是否覆盖INTEGRITY与调试器、以及一个最小ELF能否在目标板上运行并输出预期信息。只有这三个问题都得到肯定答案,后续的BSP移植、驱动适配和板级调试才有稳定的基础。