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)和链接脚本。两者共用同一套交叉编译器,但使用的库、启动代码和内存布局不同。
二、许可证配置:先确认授权,再谈编译
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,优先检查网络、防火墙端口和服务器进程,而不是反复重装工具链。
三、交叉编译环境验证:从最小程序到目标运行
环境是否可用,不能只看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 found | PATH与GHS_ROOT | which ccarm无输出 |
| License error / feature not available | 许可证文件或服务器 | lmstat显示无可用授权 |
| 链接报undefined reference | 链接脚本与库路径 | 缺少运行时库或启动代码 |
| .text地址异常 | MEMORY段ORIGIN/LENGTH | objdump -h地址超出DDR范围 |
| 下载失败或连接超时 | target server与目标IP | ping通但端口未监听 |
| 运行无输出 | 串口配置与内核状态 | 目标未运行或波特率不匹配 |
完成本节的环境搭建后,你应当能够独立回答三个问题:当前主机上的交叉编译器是否可用、许可证是否覆盖INTEGRITY与调试器、以及一个最小ELF能否在目标板上运行并输出预期信息。只有这三个问题都得到肯定答案,后续的BSP移植、驱动适配和板级调试才有稳定的基础。