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 工程并非普通裸机工程,它需要同时管理“操作系统映像”和“应用任务”两部分。典型创建流程如下:

  1. 启动 MULTI,选择 File → New → Project,在工程类型中选择 INTEGRITY 相关模板(如 INTEGRITY Application 或 INTEGRITY OS + Application)。
  2. 指定目标架构与 BSP。例如目标板为 ARM Cortex-A9,则选择对应 BSP 目录,向导会自动引入 integrity.bsp、kernel、sys 等配置。
  3. 设置工程名称与输出目录。建议将 OS 映像与应用程序分开输出,便于后续单独更新应用而不重刷 OS。
  4. 在工程中创建应用任务源文件,例如 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、读保护)占用。调试时建议先确认串口有启动打印,再设置断点;若断点无法命中,检查符号文件是否与下载映像一致。

INTEGRITY 开发链路:宿主机编译 → 目标板运行 宿主机(Windows / Linux) MULTI IDE 工程管理 · 编辑器 · 构建系统 · 调试器 Debug Configuration · 断点/单步/内存查看 Green Hills 交叉编译器 ccarm / ccppc / ccx86 -cpu · -bigendian · -fpu · -O0/-O2 · -g INTEGRITY OS 源码 + BSP 内核配置 · 链接脚本 .ld · 板级驱动 构建产物 integrity.bin(OS) · app.bin(应用) · .elf/.hex 目标板(ARM / PowerPC / x86) 调试探针 / 通信通道 GHS Probe · Lauterbach · J-Link · 以太网 · 串口 目标内存布局 Flash:OS 映像 + 应用映像 RAM:内核数据 · 任务栈 · 共享内存 外设寄存器:UART / Timer / GPIO 运行与观察 串口启动日志 · 断点命中 · 变量/寄存器查看 结果判断 启动成功 · 任务调度正常 · 无异常复位 下载映像 交叉编译产物 调试信息回传 注:图中参数与产物名称为教学示例,实际以所用 BSP 与工具链版本为准

五、常见问题与排查思路

环境搭建阶段最常见的问题集中在三类:许可证、架构不匹配、连接失败。许可证问题表现为 MULTI 无法启动或编译中途退出,解决方式是检查 LM_LICENSE_FILE 与 License 服务器状态。架构不匹配表现为链接错误或运行期非法指令,解决方式是核对 -cpu、字节序、FPU 选项与 BSP 是否一致。连接失败则按“供电→复位→探针驱动→JTAG 时钟→安全锁”的顺序逐项排除。

调试初期建议保持 -O0 -g,并适当增大任务栈;待功能稳定后再开启优化并做栈使用分析。每次修改链接脚本或 BSP 后,务必重新完整构建 OS 映像与应用映像,避免符号与地址不一致导致断点错位。

完成以上步骤后,开发者应能在 MULTI 中独立创建 INTEGRITY 工程、配置交叉编译选项、下载映像到目标板,并通过串口日志与调试器观察任务运行状态。这套环境是后续多核安全关键应用开发的基础,建议在进入下一阶段前,先用一个最小任务验证“编译—下载—运行—观察”闭环是否稳定。