3. Jacinto 异构计算框架
Jacinto 系列 SoC(如 TDA4VM、TDA4VL、TDA4VH)之所以能同时承担摄像头接入、图像预处理、深度学习推理、点云处理、显示输出和整车通信,靠的不是某一颗“万能核”,而是一套分工明确的异构计算框架。理解这套框架的关键,不是记住每个核的名字,而是搞清楚三件事:每个核擅长什么、数据在核之间怎么流动、任务按什么原则切分。
一、各核心的分工定位
Jacinto 的计算资源可以按“通用控制—实时控制—专用加速—图形显示”四类来理解。
A72 应用核是主控 CPU,通常运行 Linux 或 QNX,负责系统启动、资源管理、网络协议栈、应用逻辑、算法调度和结果融合。它算力强、生态好,但不适合硬实时和低延迟中断响应。典型任务包括:感知结果后处理、目标跟踪、规划决策、与云端或座舱交互。
R5F 实时核是安全与实时控制的核心,运行 RTOS 或 AUTOSAR,负责摄像头/雷达/激光雷达的传感器接入、时间同步、CAN/以太网通信、功能安全监控和看门狗。R5F 主频不高,但中断延迟确定,适合毫秒级甚至微秒级的硬实时任务。在 TDA4VM 中通常有多个 R5F 簇(MCU 域和主域),分别承担安全岛和传感器管理。
C7x DSP/MMA是视觉与深度学习加速的主力。C7x 是向量 DSP,配合 MMA(矩阵乘加单元)可高效执行卷积、矩阵运算和传统视觉算子。它承担 CNN 推理、光流、特征提取、点云滤波等计算密集任务。C7x 通常由 A72 或 R5F 通过 OpenVX/TIOVX 节点调度,以“核函数”形式执行。
GPU 主要承担图形渲染、显示合成和部分可并行的通用计算。在感知链路中,GPU 常用于图像缩放、色彩空间转换、可视化叠加和 HMI 渲染,也可通过 OpenCL 承担部分后处理。
VPAC(视觉预处理加速器)是硬件 ISP 与视觉前端,负责 RAW 域处理:去马赛克、降噪、白平衡、伽马、色彩转换、缩放。它把摄像头 RAW 数据变成可供 C7x 和 GPU 使用的 YUV/RGB 图像,是感知链路的入口。
DMPAC(密集光流与深度加速器)负责稠密光流、立体匹配和深度计算,输出视差图或光流场,供后续障碍物检测、运动估计使用。它与 VPAC 一样是固定功能硬件,延迟低、功耗低,但不灵活。
二、数据流:从光子到决策
下面这张图给出了一条典型的多摄像头感知数据流,以及各核心在链路中的位置和交接关系。
这条链路有几个必须记住的约束。第一,VPAC 和 DMPAC 是固定功能硬件,它们的处理参数(如去马赛克算法、光流搜索范围)必须在初始化时配置好,运行中不能随意改变算法结构。第二,C7x 不直接读 RAW 数据,它拿到的是 VPAC 输出的 YUV 或 RGB 图像,以及 DMPAC 输出的视差/光流图。第三,A72 不参与像素级处理,它只接收 C7x 输出的结构化结果(检测框、类别、置信度、深度值),做融合和决策。
三、任务划分原则
把算法部署到 Jacinto 上,核心工作是“切任务”。切分时遵循以下原则:
按实时性切。硬实时任务(传感器触发、时间戳、CAN 收发、安全监控)放 R5F;软实时任务(推理、跟踪、显示)放 C7x、GPU 和 A72。如果一个任务错过截止时间会导致安全风险,它就不应该放在 Linux 侧。
按计算密度切。卷积、矩阵乘、光流、立体匹配这类规则且密集的计算,优先交给 C7x/MMA 和 DMPAC;逻辑分支多、依赖操作系统和文件系统的任务,交给 A72。
按数据局部性切。尽量让数据在同一个核或同一级缓存内完成多步处理,减少跨核搬运。例如 VPAC 输出直接进 C7x 的 L2 缓存,比先写 DDR 再读回要快得多。TIOVX 的节点图支持这种“零拷贝”或“低拷贝”连接。
按功能安全切。ASIL 相关的监控、冗余校验、故障注入检测放在 R5F 的 MCU 域;非安全相关的感知和显示放在主域。两个域之间通过受控的 IPC 通信,不能随意共享内存。
四、协同机制:TIOVX 与 IPC
核与核之间不是直接调用函数,而是通过 TIOVX 框架和 IPC 通信。TIOVX 把每个处理步骤抽象成“节点”,节点有输入输出队列,可以映射到不同核上执行。A72 侧构建节点图,指定每个节点运行在哪个核(C7x、GPU、A72 自身),TIOVX 负责调度、缓冲管理和跨核同步。
一个典型的 OpenVX 节点图配置示例如下(示意,非实测):
// 伪代码:在 A72 侧构建感知节点图
vx_graph graph = vxCreateGraph(context);
// 节点1:VPAC 输出 YUV 图像(硬件节点)
vx_node capNode = tivxCaptureNode(graph, capture_obj, yuv_image);
// 节点2:C7x 上执行 CNN 推理
vx_node cnnNode = tivxTIDLNode(graph, cnn_params, yuv_image, tensor_out);
// 节点3:C7x 上做后处理(解码检测框)
vx_node postNode = tivxPostProcNode(graph, tensor_out, detections);
// 节点4:A72 上做目标跟踪
vx_node trackNode = tivxTrackingNode(graph, detections, tracks);
// 指定核映射
vxSetNodeTarget(cnnNode, VX_TARGET_STRING, TIVX_TARGET_DSP1);
vxSetNodeTarget(postNode, VX_TARGET_STRING, TIVX_TARGET_DSP2);
vxSetNodeTarget(trackNode, VX_TARGET_STRING, TIVX_TARGET_A72);
vxVerifyGraph(graph);
vxProcessGraph(graph); // 循环执行
这段配置的关键信息是:CNN 推理和后处理分别映射到 DSP1 和 DSP2,实现 C7x 内部的多核并行;跟踪放在 A72。VPAC 采集节点由硬件自动触发,不需要 CPU 轮询。实际部署时,节点映射要根据各核负载调整,避免某个 C7x 核成为瓶颈。
五、一个可参考的任务划分表
下表给出一个 4 摄像头 L2 感知系统的任务划分示例,参数为教学假设值,实际项目需按算力和延迟预算调整。
| 任务 | 推荐核心 | 周期/延迟预算 | 数据接口 |
|---|---|---|---|
| 摄像头触发与时间戳 | R5F (MCU 域) | 1 ms | CSI-2 / I2C |
| RAW → YUV (ISP) | VPAC | 33 ms (30fps) | DDR 帧缓冲 |
| 稠密光流 / 深度 | DMPAC | 33 ms | YUV 图像对 |
| CNN 目标检测 | C7x + MMA | 20–30 ms | YUV → 张量 |
| 检测后处理 / NMS | C7x | 5 ms | 张量 → 检测框 |
| 多目标跟踪 | A72 | 10 ms | 检测框 → 轨迹 |
| 显示合成 / HMI | GPU | 16 ms (60fps) | 轨迹 + 图像 |
| CAN 输出 / 安全监控 | R5F (主域) | 5 ms | 轨迹 → CAN 帧 |
这张表的使用方法是:先按任务性质选核心,再检查延迟预算是否满足端到端要求。例如从摄像头触发到 CAN 输出,总延迟约为 1 + 33 + 30 + 5 + 10 + 5 = 84 ms(假设串行),如果要求 100 ms 以内则可行;如果要求 50 ms,就需要把部分任务并行化,或降低分辨率、减少摄像头路数。