3. 开发环境搭建与工具链
INTEGRITY 是 Green Hills Software 面向安全关键领域的实时操作系统,其开发过程高度依赖配套的 MULTI IDE 与 Green Hills 交叉工具链。与通用 Linux 开发不同,INTEGRITY 工程通常采用“宿主机编译、目标板运行”的模式:宿主机(Windows 或 Linux)上运行 MULTI,交叉编译器生成目标架构(如 ARM Cortex-A/R、PowerPC、x86 等)的可执行映像,再通过调试通道下载到目标板运行。本节围绕这条链路,说明环境搭建、工程创建、交叉编译配置以及目标板连接与调试的关键做法。
一、工具链组成与安装要点
一套完整的 INTEGRITY 开发环境通常包含以下组件:MULTI IDE(集成开发环境,含编辑器、构建系统、调试器)、Green Hills 交叉编译器(ccarm、ccppc 等,随目标架构不同而变化)、INTEGRITY 操作系统源码与 BSP(板级支持包)、MULTI 调试代理(用于连接目标板的通信组件),以及目标板对应的调试探针驱动(如 Green Hills Probe、Lauterbach、J-Link 等)。安装时需注意:MULTI 版本、编译器版本与 INTEGRITY 版本必须匹配,BSP 必须与目标板型号一致,否则会出现链接失败或启动异常。
安装完成后,建议在命令行验证工具链是否可用。例如在 Windows 的 MULTI 命令行环境中执行:
ccarm --version
# 输出示例(示例值,实际以安装版本为准):
# Green Hills C/C++ Compiler for ARM, Version 2023.1.5
若命令无法识别,通常是环境变量未加载。MULTI 安装目录下一般提供 setenv 或 env.sh 脚本,用于设置 GHS_ROOT、PATH、LM_LICENSE_FILE 等变量。许可证(License)是另一常见问题:需确认 License 服务器可达,或本机 License 文件路径正确,否则 MULTI 启动时会提示授权失败。
二、在 MULTI 中创建 INTEGRITY 工程
MULTI 提供工程向导,但 INTEGRITY 工程并非普通裸机工程,它需要同时管理“操作系统映像”和“应用任务”两部分。典型创建流程如下:
- 启动 MULTI,选择
File → New → Project,在工程类型中选择 INTEGRITY 相关模板(如 INTEGRITY Application 或 INTEGRITY OS + Application)。 - 指定目标架构与 BSP。例如目标板为 ARM Cortex-A9,则选择对应 BSP 目录,向导会自动引入
integrity.bsp、kernel、sys等配置。 - 设置工程名称与输出目录。建议将 OS 映像与应用程序分开输出,便于后续单独更新应用而不重刷 OS。
- 在工程中创建应用任务源文件,例如
main.c,并加入 INTEGRITY 任务创建 API。
一个最小的 INTEGRITY 任务示例(示例代码,仅用于说明结构):
#include <INTEGRITY.h>
void MyTask(void) {
while (1) {
/* 任务主体:周期处理或等待事件 */
Delay(100); /* 示例:延时 100 个 tick */
}
}
int main(void) {
Error err;
Task task;
err = CreateTask(MyTask, "MyTask", 4096, 10, &task);
if (err != Success) {
return -1;
}
return 0;
}
创建任务时需关注优先级、栈大小和调度策略。INTEGRITY 采用固定优先级抢占式调度,优先级数值越大通常表示优先级越高(具体以 BSP 与内核配置为准)。栈大小不足会导致任务崩溃,建议在调试阶段适当放大,稳定后再优化。
三、交叉编译配置
交叉编译配置的核心是“让编译器知道目标是谁”。在 MULTI 工程中,这些配置通常体现在 .gpj 工程文件和编译选项里。关键配置项包括:
- 目标架构:如
-cpu=armv7-a、-cpu=cortex-a9,决定指令集与浮点策略。 - 字节序与浮点:如
-bigendian或-littleendian,-fpu=vfpv3等,必须与目标板一致。 - 优化等级:调试阶段建议
-O0 -g,便于单步与变量观察;发布阶段再切换-O2或-Os。 - 链接脚本:INTEGRITY 工程通常由 BSP 提供
.ld文件,定义内核、任务、共享内存的地址布局。若目标板内存映射与默认不同,需修改链接脚本。 - 库与头文件路径:确保
-I指向 INTEGRITY 头文件目录,-L指向目标库目录。
配置完成后执行构建。若出现“undefined reference”或“section overflow”,优先检查链接脚本与库路径;若出现“illegal instruction”类运行期错误,则多半是 CPU 选项与目标板不匹配。构建产物通常包括 integrity.bin(OS 映像)和 app.bin(应用映像),部分 BSP 会生成可合并的 .elf 或 .hex。
四、目标板连接与调试
目标板连接分为“下载通道”和“调试通道”。下载通道用于把映像写入目标板 Flash 或 RAM;调试通道用于断点、单步、查看寄存器和内存。常见连接方式有:
- JTAG/SWD 探针:如 Green Hills Probe、Lauterbach Trace32、SEGGER J-Link。需在 MULTI 的 Debug Configuration 中选择对应探针驱动,并设置目标芯片型号与时钟。
- 以太网调试:部分目标板支持通过网口与 MULTI 的调试代理通信,适合已运行 INTEGRITY 的系统进行在线调试。
- 串口控制台:用于查看启动日志和
printf输出,是判断系统是否正常启动的第一手信息。
连接成功后,在 MULTI 中执行 Debug → Connect,然后下载映像并复位运行。若连接失败,按以下顺序排查:探针驱动是否安装、目标板供电与复位是否正常、JTAG 时钟是否过高、目标芯片是否被安全锁(如 TrustZone、读保护)占用。调试时建议先确认串口有启动打印,再设置断点;若断点无法命中,检查符号文件是否与下载映像一致。
五、常见问题与排查思路
环境搭建阶段最常见的问题集中在三类:许可证、架构不匹配、连接失败。许可证问题表现为 MULTI 无法启动或编译中途退出,解决方式是检查 LM_LICENSE_FILE 与 License 服务器状态。架构不匹配表现为链接错误或运行期非法指令,解决方式是核对 -cpu、字节序、FPU 选项与 BSP 是否一致。连接失败则按“供电→复位→探针驱动→JTAG 时钟→安全锁”的顺序逐项排除。
-O0 -g,并适当增大任务栈;待功能稳定后再开启优化并做栈使用分析。每次修改链接脚本或 BSP 后,务必重新完整构建 OS 映像与应用映像,避免符号与地址不一致导致断点错位。
完成以上步骤后,开发者应能在 MULTI 中独立创建 INTEGRITY 工程、配置交叉编译选项、下载映像到目标板,并通过串口日志与调试器观察任务运行状态。这套环境是后续多核安全关键应用开发的基础,建议在进入下一阶段前,先用一个最小任务验证“编译—下载—运行—观察”闭环是否稳定。