第一章:联发科平台概述
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 性能优化核心指标:别只看跑分
很多工程师一上来就问:“这芯片跑分多少?” 我通常会反问一句:“你的应用场景是什么?”
跑分只是参考,真正要关注的是这几个指标:
- 帧率(FPS):游戏场景最直观。低于30帧就卡顿了。
- 帧时间抖动(Jitter):平均60帧不代表不卡。如果某几帧突然掉到20ms,用户就会感觉到卡。
- CPU负载率:超过80%就要警惕了,说明快瓶颈了。
- 功耗(mA/W):尤其是待机功耗。我见过一个项目,待机功耗多了50mA,结果续航少了2小时。
- 温度(°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调频策略。