2. 高通8155硬件架构解析

好,咱们进入正题。8155这颗芯片,说白了就是一个“八爪鱼”——它把CPU、GPU、VPU、DSP、NPU全塞进了一个SoC里。你可能会问,为什么搞这么复杂?

我当年第一次拿到8155的datasheet时,第一反应也是“头大”。但后来在QNX BSP移植过程中,我慢慢摸清了它的脾气。今天我就把这几年的经验拆开揉碎了讲给你听。

2.1 CPU集群:大小核的“黄金搭档”

8155的CPU部分采用了ARM的DynamIQ架构,具体配置是:

  • 1个Cortex-A78超大核(主频最高2.96GHz)
  • 3个Cortex-A78大核(主频2.42GHz)
  • 4个Cortex-A55小核(主频1.8GHz)

这个“1+3+4”的配置,我习惯叫它“1+3+4黄金搭档”。为什么这么分?

核心思路: 大核负责“爆发力”,小核负责“耐力”。在QNX系统里,我会把实时性要求高的中断处理、音频流绑定到A78上;把后台服务、监控任务丢给A55。这样既保证了响应速度,又省了电。

我在做8155的QNX BSP时,遇到过一个问题:默认的调度器会把所有线程都往大核上塞,结果小核闲着,大核热得烫手。后来我手动绑定了CPU亲和性,才把温度压下来。

2.1.1 大小核的“默契配合”

大小核之间怎么通信?靠的是CCI-550(缓存一致性互联)。这个模块负责维护L1/L2缓存的一致性。说白了,就是大核改了数据,小核不能读到旧值。

特性 Cortex-A78 Cortex-A55
架构 ARMv8.2-A ARMv8.2-A
乱序执行 深度乱序(11级流水线) 顺序执行(8级流水线)
L1缓存 64KB I-cache + 64KB D-cache 32KB I-cache + 32KB D-cache
L2缓存 256KB(每核私有) 128KB(每核私有)
L3缓存 共享2MB(所有核共用)
典型功耗 1.5W @ 2.4GHz 0.3W @ 1.8GHz

嗯,这里要注意:L3缓存是所有核共享的。在QNX里,如果你有多个进程频繁访问同一块数据,尽量让它们跑在同一个cluster里,减少缓存miss。

2.2 GPU:Adreno 650的“图形引擎”

Adreno 650,这颗GPU在8155上主要负责两件事:

  • 图形渲染:仪表盘、中控屏的3D界面
  • 通用计算:通过OpenCL做图像处理、计算机视觉

它的规格我列一下:

  • 支持Vulkan 1.1、OpenGL ES 3.2、OpenCL 2.0
  • 最高支持4K@60fps显示输出
  • 支持H.264/H.265硬件编解码

我在移植QNX的GPU驱动时,踩过一个坑:Adreno 650的固件必须和内核驱动版本严格匹配。有一次我升级了内核,忘了更新GPU固件,结果屏幕直接黑掉。后来我学乖了,每次更新驱动前,先检查固件版本。

我的经验: 在QNX下调试GPU,建议先用io-poke工具直接读写GPU寄存器,确认硬件是否正常。别一上来就调驱动,那样容易绕弯路。

2.3 VPU:视频处理的“硬核加速器”

VPU(视频处理单元)是8155上专门干视频编解码的硬件模块。它支持:

  • 解码:H.264、H.265、VP9,最高4K@60fps
  • 编码:H.264、H.265,最高4K@30fps

你可能会问,为什么不用GPU做视频解码?

原因很简单:VPU更省电,延迟更低。在车载场景下,倒车影像、360环视这些功能,要求从摄像头采集到屏幕显示,延迟不能超过100ms。用VPU硬解,延迟能控制在30ms以内。用GPU软解?嗯,我试过,至少80ms起步。

我记得有一次做环视系统,客户要求延迟低于50ms。我一开始用GPU做拼接,死活压不下去。后来换成VPU做解码,DSP做拼接,才勉强达标。

2.4 DSP与NPU:异构计算的“双引擎”

8155上集成了两个专用计算单元:

  • Hexagon DSP:数字信号处理器,擅长音频处理、传感器融合
  • NPU:神经网络处理单元,专门跑AI推理

2.4.1 Hexagon DSP:音频与传感器的“管家”

Hexagon DSP在8155上主要负责:

  • 语音唤醒(比如“你好,小蜜”)
  • 主动降噪
  • 传感器数据融合(加速度计、陀螺仪)

它的优势是超低功耗。在语音唤醒场景下,DSP的功耗只有几十毫瓦,而用A55小核跑同样的算法,功耗要翻好几倍。

注意: DSP的编程模型和CPU完全不同。它用的是静态调度,任务必须在编译时就确定好执行顺序。如果你在QNX里用pthread去调度DSP任务,那肯定行不通。我建议用fastrpc框架来和DSP通信。

2.4.2 NPU:AI推理的“加速器”

NPU是8155上专门为神经网络设计的硬件。它支持:

  • INT8/INT16量化推理
  • 典型算力:4 TOPS(INT8)
  • 支持TensorFlow Lite、ONNX等框架

在车载场景下,NPU主要用来跑:

  • 驾驶员监控(疲劳检测、分心检测)
  • 手势识别
  • 场景理解(比如识别前方是行人还是车辆)

我做过一个测试:同样的YOLOv5s模型,在A78大核上跑,帧率只有15fps;在NPU上跑,帧率能到60fps。差距就是这么明显。

2.5 异构计算框架:如何让它们“协同作战”

好了,现在CPU、GPU、VPU、DSP、NPU都有了。问题来了:怎么让它们一起干活?

8155的异构计算框架,我画了一张图,你看完就明白了:

8155异构计算框架图 8155异构计算框架 CPU集群(主控) 任务调度 & 数据分发 GPU 图形渲染 / 通用计算 VPU 视频编解码 DSP 音频 / 传感器 NPU AI推理 共享内存(DDR) 说明: CPU作为主控,通过fastrpc/QNX IPC将任务分发给GPU/VPU/DSP/NPU。 各计算单元通过共享内存交换数据,避免数据拷贝。

从这张图你能看到:CPU是“大脑”,负责调度和分发任务。GPU、VPU、DSP、NPU是“手脚”,各司其职。它们之间通过共享内存交换数据,避免了数据拷贝的开销。

在QNX下,我一般用fastrpc框架来做异构计算。它的工作流程是这样的:

  1. CPU上的主程序调用fastrpc API,把任务描述发给目标计算单元
  2. 计算单元从共享内存中读取输入数据
  3. 计算单元执行任务,把结果写回共享内存
  4. CPU通过中断或轮询获取完成信号

关键点: 在QNX里,异构计算的核心是内存管理。你必须确保共享内存的物理地址是连续的,并且对齐到缓存行大小(64字节)。否则,DMA传输会出错,或者缓存一致性会出问题。