3. 驱动开发环境搭建与工程配置

INTEGRITY 是 Green Hills Software 面向高可靠嵌入式系统的实时操作系统,其驱动开发与通用 Linux 驱动开发在工具链、编译模型和调试方式上有明显差异。本节围绕一条可复现的搭建路径展开:先安装 INTEGRITY 开发环境与 MULTI IDE,再配置目标板连接,最后创建驱动工程并设置编译选项,使工程能够成功编译出可加载的驱动镜像。

一、开发环境组成与安装顺序

INTEGRITY 驱动开发环境由三部分构成:主机侧的 MULTI IDE 与 INTEGRITY 平台包、目标侧的 INTEGRITY 内核与 BSP(板级支持包)、以及连接两者的调试通道。安装顺序建议为:先装 MULTI IDE 主程序,再装对应版本的 INTEGRITY 平台包(Platform),最后装目标板 BSP。原因是 MULTI 的编译器、调试器与 INTEGRITY 平台包存在版本绑定关系,若顺序颠倒,可能出现编译器路径未注册、BSP 无法被工程识别的问题。

安装完成后,需要确认几个关键路径已加入环境变量。以 Windows 主机为例,典型安装目录为 C:\ghs\comp_<version>,其中包含 ccarm、cxarm 等交叉编译器。INTEGRITY 平台包通常位于 C:\ghs\int1014 一类目录下,BSP 则在其 bsp 子目录中。安装后可在 MULTI 的 Project → Options → Directories 中检查编译器与头文件搜索路径是否已自动填入。

安装前应确认主机操作系统版本、磁盘空间(建议预留 20 GB 以上)以及目标板调试接口(JTAG/BDM/以太网)驱动是否就绪。INTEGRITY 平台包与 MULTI 版本必须匹配,混用不同版本会导致链接期符号缺失。

二、MULTI IDE 基础配置

MULTI IDE 是驱动开发的主要工作界面,首次启动后需要完成三项基础配置。第一是编译器选择:在 Project → Options → Compiler 中指定目标架构对应的编译器,例如 ARM 架构选择 ccarm,PowerPC 选择 ccppc。第二是调试器配置:在 Debug → Debugger Options 中选择连接方式,常见有 Green Hills Probe、以太网 GDB 代理和仿真器三种。第三是源码路径映射:若工程源码与编译主机不在同一路径,需要在 Source Path Mapping 中建立映射,否则调试时无法定位源文件。

MULTI 的工程文件为 .gpj,其中记录了源文件列表、编译选项、链接脚本和调试配置。驱动工程通常不单独建立可执行程序,而是编译为可被 INTEGRITY 内核加载的 .rta 或 .out 模块,因此工程类型应选择 INTEGRITY Module 而非普通 Executable。

三、目标板连接配置

目标板连接是环境搭建中最容易出问题的环节。以常见的 ARM Cortex-A 目标板为例,连接配置包含以下要素:调试探针的物理连接(JTAG 排线方向、供电跳线)、目标板启动模式(从 Flash 启动还是从调试器加载)、以及 MULTI 中的通信参数。若使用 Green Hills Probe,需在 Debug → Connection 中选择 Green Hills Probe 并指定探针序列号;若使用以太网,则需填写目标板 IP 与端口,默认端口为 4000。

连接成功的判断依据是 MULTI 底部状态栏显示目标处理器型号与内核版本,且 Debug 菜单中的 Connect 变为可用状态。若连接失败,优先检查目标板是否已上电、复位电路是否正常、以及探针驱动是否被主机识别。连接建立后,建议先加载 INTEGRITY 内核镜像,确认内核能正常启动并进入 Shell,再开始驱动工程的编译与加载。

四、驱动工程创建与编译选项设置

创建驱动工程的典型流程是:在 MULTI 中选择 File → New → Project,工程类型选 INTEGRITY Module,指定目标 BSP 路径,然后添加驱动源文件。驱动源文件通常包含一个入口函数(如 drv_init)和若干设备操作函数,入口函数通过 INTEGRITY 的 RegisterDevice 或类似接口向内核注册设备。

编译选项的设置直接决定驱动能否被内核正确加载。关键选项包括:

  • -cpu:指定目标 CPU 型号,必须与 BSP 一致,否则生成的指令集不兼容。
  • -DINTEGRITY:定义 INTEGRITY 平台宏,使头文件走 INTEGRITY 分支。
  • -I:添加 INTEGRITY 内核头文件路径与 BSP 头文件路径。
  • -O2 或 -Os:优化级别,驱动通常建议 -O2,调试阶段可降为 -O0。
  • -g:生成调试信息,便于在 MULTI 中单步调试。
  • -nostdlib:驱动模块不链接标准库,避免与内核符号冲突。

链接阶段需要指定 INTEGRITY 模块的链接脚本,通常由 BSP 提供,例如 integrity.ld。链接脚本决定了模块的加载地址、段布局和符号导出方式。若链接报错提示符号未定义,应检查是否遗漏了 BSP 提供的库文件或是否错误地链接了标准库。

# 示例:驱动模块编译命令(ARM 架构,仅供参考)
ccarm -cpu=cortex-a9 -DINTEGRITY -I$(INTEGRITY_DIR)/include \
      -I$(BSP_DIR)/include -O2 -g -nostdlib \
      -c drv_uart.c -o drv_uart.o

# 链接为 INTEGRITY 可加载模块
cxarm -nostdlib -T $(BSP_DIR)/integrity.ld \
      drv_uart.o -o drv_uart.out

编译成功后,在 MULTI 中通过 Debug → Download 将 drv_uart.out 加载到目标板,观察内核日志是否出现设备注册成功的提示。若加载失败,常见原因包括:模块与内核版本不匹配、符号表未导出、或加载地址与已有模块冲突。此时应回到编译选项检查 -cpu 与 BSP 是否一致,并确认链接脚本中的地址范围未越界。

INTEGRITY 驱动开发环境搭建与工程配置关系图 主机侧(Host) MULTI IDE + 编译器 INTEGRITY 平台包 BSP(板级支持包) 调试连接通道 JTAG / BDM / 以太网 端口示例:4000 目标侧(Target) INTEGRITY 内核 BSP 启动镜像 驱动模块 .out 驱动工程编译与加载流程 创建 Module 工程 .gpj 设置编译选项 -cpu -DINTEGRITY 编译源文件 ccarm -c 链接模块 cxarm -T .ld 下载到目标板并观察内核日志 判断:设备注册成功 / 符号冲突 / 版本不匹配 检查点 版本 / 路径 / 地址

五、常见配置问题与排查方向

环境搭建阶段的高频问题集中在三类。第一类是版本不匹配:MULTI 版本与 INTEGRITY 平台包版本不一致,表现为编译通过但加载时内核拒绝模块。排查方法是核对 MULTI → Help → About 中的版本号与平台包 version.txt 是否一致。第二类是路径错误:头文件或库文件路径未正确设置,表现为编译期 cannot open source file 或链接期 undefined symbol。排查方法是检查 -I 与 -L 选项是否指向实际存在的目录。第三类是目标板连接不稳定:表现为下载中断或调试会话频繁断开,排查方向包括探针供电、JTAG 时钟频率(可适当降低)、以及目标板复位电路。

驱动模块的编译选项必须与 BSP 保持一致,尤其是 -cpu 和字节序相关选项。若目标板为大小端混合架构,还需确认 -endian 设置,否则驱动读写寄存器时会出现数据错位。

完成上述配置后,建议先编译一个最小驱动模块(仅包含入口函数和一条日志输出),确认整条链路——编译、链接、下载、加载、日志输出——全部打通,再逐步添加实际设备操作代码。这样可以把环境问题与驱动逻辑问题分开定位,显著降低调试成本。