4. Jacinto软件栈与开发环境

Jacinto 系列(如 TDA4VM、TDA4VH)不是一颗“单核跑全部”的芯片,而是一个异构多核 SoC:主域有 Cortex-A72 运行 Linux/QNX,MCU 域有 Cortex-R5F 运行 RTOS,还挂载了 C7x DSP、VPAC、DMPAC 等专用加速器。雷达目标检测与跟踪算法要落地,第一步不是写算法,而是搞清楚“代码跑在哪个核、由谁调度、通过什么接口调用加速器”。本节围绕这条主线展开。

一、软件栈分层:从 SDK 到 PDK 再到具体核

TI 的 Jacinto 软件栈自上而下大致分为三层。最上层是 Processor SDK RTOS / Linux(PSDK),它面向应用开发者,提供 Linux 内核、文件系统、OpenVX/TIOVX 框架、示例应用和构建脚本。中间层是 Platform Development Kit(PDK),它面向驱动与底层开发者,包含 CSL(芯片支持库)、各外设驱动(UART、I2C、SPI、以太网、CSI2、DSS 等)、DMA 以及各加速器的底层驱动。最底层是芯片硬件与固件(如 DMSC/System Firmware、各核的 bootloader)。

关键理解:PDK 是“按核”组织的。在 pdk_jacinto_xx_xx/packages/ti/ 下,你会看到 drv/、csl/、board/ 等目录,而每个驱动都区分 mcu2_0、mcu2_1、mcu1_0、mpu1_0 等构建目标。同一个 UART 驱动,编译给 MCU2_0 和编译给 A72 的产物是不同的库。因此“调用方式”首先取决于你站在哪个核上。

二、MCU2_0 与 MCU2_1 的分工

在典型雷达/视觉感知系统中,MCU 域的两个 R5F 核承担不同职责:

  • MCU2_0:通常作为“感知主控核”,负责运行视觉/雷达感知链路,管理 VPAC、DMPAC、C7x 的调用与数据流,运行 TIOVX/OpenVX 图,并通过 IPC 与 A72 上的应用通信。
  • MCU2_1:常作为“辅助/安全核”,承担 CAN、以太网、诊断、安全监控或部分雷达信号处理任务,也可运行独立的 RTOS 任务。

两者之间通过 IPC(Inter-Processor Communication) 通信,底层是 Mailbox + 共享内存,上层可用 TI 的 IPC 库或 OpenVX 的 tivx 节点。调用加速器时,MCU2_0 通常作为“主机核”向 C7x 下发任务,MCU2_1 则更多处理外设与安全逻辑。

三、视觉与雷达硬件加速器的调用方式

Jacinto 的加速器不是“直接写寄存器”就能高效使用的,TI 提供了统一的调用路径:

  • VPAC(Vision Pre-processing Accelerator):负责图像预处理,包括去马赛克、降噪、色彩转换、缩放、金字塔生成。调用方式是通过 PDK 的 VHWA 驱动,或通过 TIOVX 的 tivxVpacVissNode、tivxVpacMscNode 等节点,在 OpenVX 图中以节点形式接入。
  • DMPAC(Depth and Motion Perception Accelerator):负责稠密光流、立体视差、深度计算。调用方式类似,通过 tivxDmpacSdeNode、tivxDmpacDofNode 等节点接入 OpenVX 图。
  • C7x DSP:作为可编程加速器,运行雷达信号处理(FFT、CFAR、DoA)或深度学习推理。调用方式有两种:一是通过 OpenVX 自定义节点,把 C7x 上的 kernel 注册为节点;二是通过 IPC 直接向 C7x 发送任务描述符。

核心结论:在 Jacinto 上,加速器的“调用方式”本质上是“在 OpenVX/TIOVX 图中以节点形式接入”。你不需要手动管理 DMA 和寄存器,TIOVX 框架会处理核间同步、缓冲区管理和任务调度。

Jacinto 软件栈与加速器调用关系 应用层:Linux / QNX(Cortex-A72) 雷达点云可视化、目标跟踪应用、网络通信、文件系统 Processor SDK(PSDK):OpenVX / TIOVX 框架、IPC、示例应用 提供跨核通信、图调度、节点注册、缓冲区管理 PDK:CSL、外设驱动、VHWA 驱动、DMA、Board 支持 按核构建:mcu2_0 / mcu2_1 / mcu1_0 / mpu1_0 各自独立库 MCU2_0(R5F) 感知主控核 运行 OpenVX 图 调度 VPAC/DMPAC/C7x MCU2_1(R5F) 辅助/安全核 CAN/以太网/诊断 独立 RTOS 任务 C7x DSP 雷达信号处理 FFT/CFAR/DoA 深度学习推理 VPAC 去马赛克/降噪/缩放 金字塔生成 DMPAC 稠密光流/立体视差 深度计算 C7x 加速器 可编程 DSP 自定义 kernel IPC 调用方式:在 TIOVX 图中以节点接入(tivxVpacVissNode / tivxDmpacSdeNode / 自定义 C7x 节点)

四、实际开发中的调用示例

假设我们要在 MCU2_0 上构建一条“摄像头输入 → VPAC 预处理 → C7x 推理 → 输出”的链路。在 TIOVX 中,代码结构大致如下:

// 在 MCU2_0 的 OpenVX 图中创建节点
vx_node vissNode = tivxVpacVissNode(graph, config, sensorObj, rawImage, outputImage);
vx_node c7xNode  = tivxC7xKernelNode(graph, inputTensor, outputTensor, kernelParams);
vx_node mscNode  = tivxVpacMscNode(graph, outputImage, scaledImage, mscConfig);

// 设置目标核
vxSetNodeTarget(vissNode, VX_TARGET_STRING, TIVX_TARGET_VPAC_VISS1);
vxSetNodeTarget(c7xNode,  VX_TARGET_STRING, TIVX_TARGET_C7X_1);
vxSetNodeTarget(mscNode,  VX_TARGET_STRING, TIVX_TARGET_VPAC_MSC1);

// 图验证与执行
vxVerifyGraph(graph);
vxProcessGraph(graph);

这段代码的关键点:vxSetNodeTarget 决定了节点跑在哪个硬件单元上。VPAC 节点必须绑定到 TIVX_TARGET_VPAC_VISS1 或 MSC1,C7x 节点绑定到 TIVX_TARGET_C7X_1。如果绑定错误,图验证会失败并报出目标不匹配的错误。

五、开发环境搭建要点

实际工程中,开发环境通常包含:Ubuntu 主机 + TI PSDK Linux + PSDK RTOS + Code Composer Studio(CCS)。构建流程是:先在主机上编译 PDK 和 RTOS 固件,生成 .appimage 或 .xer5f 文件,再通过 U-Boot 或 CCS 加载到目标板。Linux 侧则通过 make linux 构建内核和文件系统。调试时,MCU2_0/MCU2_1 的日志通过 UART 输出,C7x 的调试可通过 CCS 的 JTAG 连接。

实践建议:初次接触 Jacinto 时,不要急于写算法。先用 TI 提供的 vision_apps 示例跑通一条完整链路,观察 MCU2_0 如何创建图、如何绑定节点、如何通过 IPC 与 A72 通信。理解了这个框架,再把自己的雷达检测算法替换进去,效率会高很多。
常见误区:很多开发者习惯在 A72 Linux 上直接调用加速器,但 VPAC/DMPAC 的实时性要求高,通常由 MCU2_0 的 RTOS 侧统一调度。A72 更适合做结果展示和上层逻辑。跨核调用必须通过 IPC,不能直接访问加速器寄存器。

总结来说,Jacinto 的软件栈是“分层 + 分核”的:SDK 提供框架,PDK 提供驱动,MCU2_0 是感知调度中心,MCU2_1 是辅助核,VPAC/DMPAC/C7x 通过 TIOVX 节点被调用。掌握这条调用链,是后续雷达目标检测与跟踪算法工程化的基础。