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 框架会处理核间同步、缓冲区管理和任务调度。
四、实际开发中的调用示例
假设我们要在 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 连接。
vision_apps 示例跑通一条完整链路,观察 MCU2_0 如何创建图、如何绑定节点、如何通过 IPC 与 A72 通信。理解了这个框架,再把自己的雷达检测算法替换进去,效率会高很多。
总结来说,Jacinto 的软件栈是“分层 + 分核”的:SDK 提供框架,PDK 提供驱动,MCU2_0 是感知调度中心,MCU2_1 是辅助核,VPAC/DMPAC/C7x 通过 TIOVX 节点被调用。掌握这条调用链,是后续雷达目标检测与跟踪算法工程化的基础。