第一章:联发科平台概述

1.1 MTK芯片架构:不止是“大中小”核

做嵌入式开发这么多年,我接触过不少芯片平台。但联发科的架构,说实话,第一次看的时候还是让我琢磨了一阵子。

MTK的芯片,最核心的就是它的三丛集架构。你可能会问,不就是大核、中核、小核吗?嗯,表面看是这样,但实际没那么简单。

以我常用的MT6785(Helio G95)为例,它包含:

  • 2个Cortex-A76大核:最高2.05GHz,负责重负载任务
  • 6个Cortex-A55小核:最高2.0GHz,处理日常轻任务

但到了MT6893(Dimensity 1200)就不一样了:

  • 1个Cortex-A78超大核:3.0GHz,专门跑瞬时爆发任务
  • 3个Cortex-A78大核:2.6GHz,持续高性能场景
  • 4个Cortex-A55小核:2.0GHz,待机、轻负载

为什么这么设计?我个人的理解是:功耗和性能的平衡点,不是靠堆料,而是靠调度。你想想看,如果所有任务都往大核上扔,电池撑不过半天。

核心指标:联发科的CPU调度策略叫“CPU Governor”,默认是schedutil。它会根据任务负载动态调频。但我在项目中遇到过一个问题——默认策略对游戏场景不够激进,导致掉帧。后来我们改成了performance governor,帧率稳了,但功耗涨了15%。

1.2 系统软件栈:从BootROM到Android

联发科的软件栈,说白了就是一层套一层。我习惯把它分成四层来看:

层级 组件 说明
L0 BootROM + Preloader 芯片上电最先跑的程序,初始化硬件
L1 LK (Little Kernel) + U-Boot 加载系统镜像,启动Linux内核
L2 Linux Kernel + MTK HAL 硬件抽象层,驱动管理
L3 Android Framework + Vendor层 应用层和系统服务

这里有个坑,我曾经踩过。Preloader阶段如果出了问题,手机直接变砖。我记得有一次调试一个功耗问题,发现系统在休眠后无法唤醒。查了两天,最后发现是Preloader里一个GPIO配置错了,导致中断信号没传上去。

避坑指南:我曾经在修改LK代码时,不小心把DDR时序参数写错了。结果板子死活起不来,串口打印全是乱码。后来用JTAG一步步查,才发现是时序配置越界了。所以,改底层代码前,一定要备份原始配置

1.3 性能优化核心指标:别只看跑分

很多工程师一上来就问:“这芯片跑分多少?” 我通常会反问一句:“你的应用场景是什么?”

跑分只是参考,真正要关注的是这几个指标:

  1. 帧率(FPS):游戏场景最直观。低于30帧就卡顿了。
  2. 帧时间抖动(Jitter):平均60帧不代表不卡。如果某几帧突然掉到20ms,用户就会感觉到卡。
  3. CPU负载率:超过80%就要警惕了,说明快瓶颈了。
  4. 功耗(mA/W):尤其是待机功耗。我见过一个项目,待机功耗多了50mA,结果续航少了2小时。
  5. 温度(°C):超过45°C就开始降频,性能直接打折扣。

我的经验:做性能优化时,我习惯先抓帧时间曲线。如果曲线平稳,说明调度没问题。如果出现尖峰,那就要查是CPU频率没跟上,还是GPU渲染卡住了。说白了,优化不是堆参数,而是找瓶颈

1.4 联发科特有的优化工具

做MTK平台优化,有几个工具我几乎天天用:

  • PTP (Power Thermal Policy):调功耗和温控策略的。我习惯用它来设置降频阈值。
  • DDT (Device Debug Tool):抓CPU/GPU频率、温度、电流的实时数据。比adb shell cat proc/* 方便多了。
  • EMI (External Memory Interface) 工具:调DDR频率和时序的。这个我一般不碰,除非遇到内存带宽瓶颈。

举个例子,有一次游戏帧率不稳,我用DDT抓了数据,发现GPU频率在800MHz和500MHz之间来回跳。原因很简单——温控策略太激进,温度一到42°C就降频。后来我把降频阈值调到了45°C,帧率就稳了。

总结一下:联发科平台优化,核心是理解它的三丛集调度功耗策略。不要盲目堆频率,而是找到性能与功耗的平衡点。嗯,这一章先讲到这里,下一章我们聊聊具体的CPU调频策略。