3. INTEGRITY开发环境与通信工程配置

INTEGRITY 的通信工程不是“写几行 socket 代码”那么简单,它横跨宿主机开发环境、系统构建器、通信配置文件以及目标板卡初始化四个层面。理解这四层如何衔接,比记住某个 API 更重要。本节围绕 MULTI IDE、INTEGRITY 系统构建器、通信配置文件组织和目标板卡与网络接口初始化展开,重点说明“在哪里配置、配置什么、配置结果如何进入目标镜像”。

MULTI IDE:宿主机侧的开发与调试入口

MULTI IDE 是 Green Hills 提供的集成开发环境,承担源码编辑、编译、下载、调试和工程管理。在通信工程中,它主要解决三件事:第一,管理通信相关源文件与头文件路径;第二,通过 MULTI 的构建系统调用 INTEGRITY 交叉编译器生成目标代码;第三,通过 MULTI 的调试器连接目标板,观察通信任务、中断和缓冲区状态。

一个典型的通信工程在 MULTI 中至少包含以下目录结构:src/ 存放协议栈与应用任务源码,include/ 存放通信接口头文件,config/ 存放 INTEGRITY 系统配置与通信配置文件,build/ 存放编译输出。MULTI 工程文件(.gpj)中需要显式声明这些路径,否则系统构建器在解析通信配置时会找不到对应的驱动或协议模块。

在 MULTI 中配置交叉编译工具链时,需要选择与目标板 CPU 架构匹配的编译器,例如 ARM 架构选择 arm-greenhills-eabi-gcc 或 INTEGRITY 自带的 ccarm。编译选项中的 -DINTEGRITY 和 -DGHNET 等宏定义会影响通信协议栈的条件编译分支,必须与目标系统配置保持一致。

INTEGRITY 系统构建器:把配置变成镜像

INTEGRITY 系统构建器(System Builder)负责把内核、BSP、驱动、协议栈和应用任务组装成一个可加载的目标镜像。通信工程中,系统构建器主要处理三类输入:.int 系统配置脚本、通信配置文件(如网络接口定义、协议栈参数)以及 MULTI 工程编译出的目标文件。

系统构建器的工作流程可以概括为:解析 .int 脚本中的 Kernel、Memory、Device、Task 等段,读取通信配置中定义的网络接口和协议参数,调用 MULTI 编译产物,最终生成 .bin 或 .elf 镜像。如果通信配置中引用了未在 .int 中声明的设备,构建器会在链接阶段报错,提示未解析的符号或设备未注册。

系统构建器不是“一键生成”,它依赖配置文件的完整性和一致性。通信配置中的接口名、设备名、中断号必须与 BSP 和 .int 脚本中的定义完全对应,否则镜像无法正常启动网络功能。

通信配置文件组织:接口、协议与参数

INTEGRITY 通信配置通常分散在多个文件中,按职责可以划分为四类:

  • 网络接口定义:描述 MAC 地址、IP 地址、子网掩码、网关、接口名称(如 eth0、eth1)。
  • 协议栈参数:TCP 窗口大小、UDP 缓冲区长度、ARP 表项数量、路由表容量等。
  • 设备驱动绑定:将网络接口与具体驱动(如 ghnet、e1000)关联,并指定中断号和寄存器基地址。
  • 任务与队列:通信任务优先级、消息队列深度、信号量初始值。

这些配置通常以 .cfg、.int 或 .h 形式存在。例如,一个网络接口配置片段可能如下:

/* net_config.cfg */
Interface eth0 {
    Device = "e1000_0";
    MacAddr = 00:11:22:33:44:55;
    IpAddr = 192.168.1.10;
    NetMask = 255.255.255.0;
    Gateway = 192.168.1.1;
    Mtu = 1500;
}

Protocol TCP {
    WindowSize = 65535;
    MaxConnections = 32;
}

Protocol UDP {
    RxBufferSize = 8192;
    TxBufferSize = 8192;
}

配置文件的组织原则是“分层不重复”:接口层只描述地址和 MTU,协议层只描述协议行为,驱动层只描述硬件绑定。任何一层修改后,都需要重新运行系统构建器生成镜像,不能只重新编译应用代码。

目标板卡与网络接口的工程初始化

目标板卡上电后,INTEGRITY 内核先完成 BSP 初始化,然后根据系统构建器生成的镜像中的配置信息,依次初始化网络设备、协议栈和通信任务。工程初始化的关键步骤包括:

  1. 设备注册:BSP 探测网络控制器,注册设备实例,分配中断向量和 DMA 通道。
  2. 接口创建:根据 net_config.cfg 中的 Interface 段创建 eth0 等逻辑接口,绑定设备实例。
  3. 协议栈启动:初始化 TCP/UDP/ARP/IP 等协议模块,分配缓冲区池和定时器。
  4. 任务启动:创建通信任务,设置优先级和消息队列,启动网络事件循环。

初始化完成后,可以通过 MULTI 调试器查看接口状态。例如,在调试器中执行 netstat 或调用 INTEGRITY 提供的 ifconfig 等效接口,观察 eth0 是否处于 UP 状态、IP 地址是否正确、收发计数器是否增长。如果接口未启动,优先检查 .int 脚本中设备声明与 net_config.cfg 中的设备名是否一致,以及中断号是否与 BSP 冲突。

INTEGRITY 通信工程配置与初始化链路 宿主机侧(MULTI IDE) 源码 / 头文件 / 工程文件 交叉编译工具链 调试器连接目标板 通信配置文件 net_config.cfg(接口/协议) system.int(内核/设备/任务) driver_bind.h(驱动绑定) INTEGRITY 系统构建器 解析 .int / .cfg 链接内核 / 驱动 / 协议栈 生成目标镜像 .bin / .elf 目标板卡(INTEGRITY 运行时) BSP 初始化 设备探测 / 中断注册 接口创建 eth0 / IP / MAC 协议栈启动 TCP / UDP / ARP 通信任务启动与事件循环 优先级 / 消息队列 / 信号量 镜像加载 调试与状态观察 配置一致性:接口名 / 设备名 / 中断号 必须跨文件匹配

配置一致性与常见问题

通信工程初始化失败,多数不是代码逻辑错误,而是配置不一致。以下三类问题最常见:

现象可能原因排查位置
接口未创建,eth0 不存在net_config.cfg 中设备名与 .int 中 Device 段不匹配对比 Device 名称与 Interface 中的 Device 字段
协议栈启动后无法收发中断号冲突或 DMA 通道未分配检查 BSP 中断向量表与 driver_bind.h
系统构建器链接报错通信配置引用了未编译的协议模块确认 MULTI 工程中已包含对应源文件并参与编译

建议在每次修改通信配置后,按“配置检查 → 重新构建 → 下载镜像 → 观察接口状态 → 验证收发”的顺序执行。配置检查可以借助系统构建器的语法检查功能,也可以人工核对接口名、设备名、中断号三要素。只有三要素在 .int、net_config.cfg 和 BSP 中完全一致,目标板卡上的网络接口才能正常初始化并进入通信任务循环。

不要跳过系统构建器直接替换目标板上的旧镜像。通信配置的修改必须经过系统构建器重新链接,否则新配置不会生效,调试时容易误判为驱动或协议栈故障。