2. ARM架构基础

做嵌入式系统,尤其是ARM架构的芯片,功耗问题迟早会找上门。我最早接触低功耗设计是在一个手持设备项目上,电池容量就那么大,客户还要求续航翻倍。那时候我才真正意识到——功耗不是附属指标,它是硬约束。

这一章我们就把功耗的底牌翻出来看看。搞懂了功耗从哪来,你才能知道怎么省电。

2.1 CMOS功耗的两大来源

CMOS电路的功耗,说白了就两块:动态功耗和静态功耗。一个跟干活有关,一个跟闲着有关。

2.1.1 动态功耗

动态功耗是芯片在“干活”时消耗的能量。它又分两部分:

  • 开关功耗:每次信号从0变1或从1变0,都要给负载电容充放电。频率越高、电压越高、负载越大,这部分功耗就越猛。
  • 短路功耗:信号翻转的瞬间,PMOS和NMOS会同时导通一小会儿,形成从电源到地的直流通路。虽然时间短,但频率高了也不能忽视。

公式很简单:P_dynamic = α × C × V² × f

α是翻转率,C是负载电容,V是电压,f是频率。你看,电压是平方项,动它一下效果最明显。

关键结论:动态功耗与电压的平方成正比。降低电压是减功耗最狠的手段,但代价是性能会下降。

2.1.2 静态功耗

静态功耗是芯片“闲着”也在耗的电。以前工艺老的时候,这玩意儿几乎可以忽略。但现在28nm以下,静态功耗已经成了大头。

主要来源是漏电流,包括:

  • 亚阈值漏电:晶体管关不彻底,还是有微弱电流流过。阈值电压越低,漏电越大。
  • 栅极漏电:栅氧化层太薄,电子直接隧穿过去。高k金属栅工艺就是为解决这个问题的。
  • 源漏穿通漏电:沟道太短,源漏之间直接漏电。

静态功耗公式:P_static = I_leak × V

I_leak是漏电流总和。温度每升高10°C,漏电差不多翻一倍。所以散热不好的设备,静态功耗会恶性循环。

注意:我曾经在一个IoT项目上踩过坑——常温下功耗测出来没问题,放到高温箱里一测,静态功耗直接飙了3倍。后来才意识到,漏电流的温度敏感性被我们忽略了。

2.2 电压与频率缩放(DVFS)

DVFS是动态电压频率缩放。说白了就是:活多的时候跑快点,活少的时候跑慢点。

为什么要把电压和频率绑在一起调?因为频率高了,电压也得跟着高,否则信号传不过去。频率降下来,电压就可以跟着降。

我习惯把DVFS分成三个层级:

层级 实现方式 典型场景 功耗节省
芯片级 P-State / OPP Linux cpufreq 30-50%
模块级 独立电压域 GPU/CPU独立调频 20-40%
指令级 自适应电压缩放 ARM Intelligent Energy 10-20%

实际项目中,我建议你关注两个关键点:

  • 电压跳变速度:从低电压升到高电压需要时间,太快了电源会不稳。一般要留几十微秒的稳定时间。
  • 频率切换时机:不能在关键任务执行到一半的时候切频率,否则可能造成时序违例。

实战技巧:在ARM Cortex-M系列上做DVFS,我一般用WFI(Wait For Interrupt)指令配合PLL重配置。先让CPU休眠,再改PLL分频比,唤醒后自动跑在新频率上。这样能避免频率切换时的毛刺问题。

2.3 电源门控技术

电源门控比DVFS更狠——直接把不用的模块断电。ARM架构里常用的叫Power Gating,用高阈值电压的开关管(Header/Footer)来控制电源通断。

核心结构就两种:

  • Header开关:放在电源和模块之间,关断时模块浮空到GND。
  • Footer开关:放在模块和GND之间,关断时模块浮空到VDD。

ARM Cortex-A系列处理器里,每个核心都有自己的电源域。休眠时整个核心断电,只留一个很小的Always-On域来响应唤醒事件。

关键数据:电源门控能把静态功耗降到接近0。但代价是唤醒时间较长(几十到几百微秒),而且断电后寄存器内容全丢,需要做状态保存和恢复。

2.3.1 电源门控的三大挑战

  1. 浪涌电流:模块重新上电时,瞬间充电电流可能很大。我见过一个项目因为没做软启动,每次唤醒都把电源电压拉掉0.3V,导致其他模块复位。
  2. 状态保持:断电后寄存器内容丢失。ARM的解决方案是Retention Flip-Flop——一种带影子寄存器的触发器,断电时用低漏电的慢速寄存器保存状态。
  3. 隔离逻辑:断电模块的输出不能影响其他还在工作的模块。需要加Isolation Cell,在断电时将输出钳位到固定电平。

避坑指南:我曾经在一个SoC项目上,电源门控的隔离单元没加全,结果一个断电的SPI模块输出浮空,把隔壁还在工作的I2C总线给干扰了。排查了两天才找到原因。从那以后,我每次做电源门控都会用形式化验证工具跑一遍隔离检查。

2.4 三种技术的协同使用

实际项目中,DVFS和电源门控是配合使用的。我一般这样分层:

  • 运行态:用DVFS根据负载动态调压调频。
  • 空闲态:降频降压到最低运行点,或者进入WFI状态。
  • 休眠态:直接断电,用电源门控把模块关掉。

ARM的Big.LITTLE架构就是这套思路的典型代表——大核跑重负载,小核跑轻负载,不用的核直接断电。

下面这张图展示了三种技术的协同关系:

低功耗技术协同架构 系统负载检测 功耗状态决策 运行态 DVFS动态调压调频 空闲态 WFI + 最低运行频率 休眠态 电源门控 + 状态保持 功耗降低 30-50% 功耗降低 50-70% 功耗降低 90-99% 说明:三种技术按需组合使用 运行态用DVFS,空闲态降频,休眠态断电——ARM低功耗设计的核心思路

2.5 小结

这一章我们把CMOS功耗的底牌翻了个遍。动态功耗靠DVFS来控,静态功耗靠电源门控来灭。两者配合,才能做到真正的低功耗。

嗯,这里要注意:没有银弹。每种技术都有代价——DVFS需要稳定的电源和精确的负载预测,电源门控需要额外的隔离和状态保存逻辑。选什么方案,取决于你的应用场景和成本预算。