SOC的功耗

从SOC的应用层面来说,功耗主要取决于以下几个方面:

  • 芯片规格:尺寸、工艺、晶体管数量、使用的模拟与外设功能。
  • 供电电压:电压越高,功耗越大。
  • 时钟频率:频率越高,功耗越大。
  • 使用的外设:使用外设越多,功耗越大。
  • 运行模式:MCU不同的运行模式具有不同的功率消耗。

芯片功耗指标

从设计角度来说,在满足系统性能需求的情况下,尽可能选择能耗较低的低功耗芯片,即在CPU的性能和功耗方面进行比较和选择。通常一个参考指标是每执行1M次指令所消耗的能量,即Watt/MIPS。但是,实际上各个CPU的体系结构相差很大,衡量性能的方式也不尽相同。所以,我们还应该进一步分析一些细节。CPU的功率消耗分为两大部分:内核功耗PCORE和外设功耗PI/O,总的功耗等于两者之和,即:
P=P_CORE+P_(I/O)
对于PCORE,关键在于其供电电源电压和时钟频率的高低;对于PI/O来讲,除了留意各个外设的功耗外,还必须关注时钟单元与数据通路。

电源

动态功耗与供电电压的平方成正比,因此降低供电电压能够有效降低功耗。能够使用低电压电源供电的SOC往往都具有较好的功耗表现,而且一些SOC支持较宽的电源电压范围,在这种情况下,从降低功耗考虑,应尽可能使用较低的电源电压供电。

需要注意的是,降低供电电压会导致芯片电路信号延迟加大,执行时间变长,这是低功耗芯片设计时需要考虑的,而且在应用中,过低的供电电压可能使得SOC的部分功能或者外设无法使用,这需要结合具体应用情况而定。一些SOC内部也自带调压器,调压器输出合适的电压给SOC的core使用。内部使用调压器使得SOC的core功耗在不同电源电压下时基本固定。有些支持低功耗的SOC内部可能不止一个调压器,除了主调压器之外还有专用于低功耗模式的调压器。相比于主调压器,低功耗调压器带负载能力会弱很多,但是其调压器本身的功耗也会小很多。

此外,通过动态电压调节技术,使得SOC在不同的运行模式下,工作电源可以自动调整,从而在保证性能的基础上降低功耗。

时钟

大部分SOC都不止一个时钟源可以用,而支持低功耗的SOC,其时钟单元也相对复杂,包含时钟发生器、驱动、时钟树和时钟负载等,也是芯片中功耗较高的单元。

时钟源通常分为外部时钟源和内部时钟源。外部时钟源往往使用晶体振荡器,精度高,功耗高;内部时钟源为RC振荡器,精度低,功耗相对较低。低功耗SOC通常支持外部高速时钟源、外部低速时钟源、内部高速时钟源和内部低速时钟源。很多SOC的时钟树也支持分频器和倍频器,系统时钟可以选择多个时钟源,各个外设也支持独立的时钟开关和选择多个时钟源。

选择时钟的类型和速度对SOC的功耗有很大影响。首先,动态功耗与时钟的速度成正比,时钟速度越快,功耗越大。所以,当实际使用中不需要CPU高速工作时,适当降低时钟频率可以有效降低系统功耗。虽然降低时钟速度可以直接降低功耗,但是这在很多情况下不是理想的解决方案,因为时钟速度降低后,CPU执行指令所需的时间变长,其性能会减弱。如果我们考虑平均功耗,使用最快的时钟速度让CPU执行任务,然后在剩下的时间内使CPU工作在低功耗模式才是一个较好的选择。这就是后面会分析的SOC的低功耗运行模式。

外设与GPIO

SOC通常具有很丰富的外设以适应各种应用场景。支持低功耗模式的SOC其每个外设应可以独立的开启和关闭。实际低功耗应用中SOC用不到的外设应该全部失能,而且其对应的各个外设时钟也应该关闭掉,这样可以节省由未使用的外设消耗的部分功耗。

很多SOC上电复位后,其GPIO默认模式为浮空输入。因为噪声的影响,设置为浮空输入时,GPIO内部的施密特触发器可能会因为噪声的波动而检测为IO电平的翻转,这也会导致GPIO一定的功率消耗。所以在低功耗应用中,未使用的GPIO应当配置到一个合适的状态以节省这部分功耗,例如配置为上拉输入或者高/低电平输出。

此外,很多SOC的应用方案里都会使用到按键来做人机交互。不建议按键使用额外的电阻上拉到外部电源或者下拉到地,因为按键按下时外电路会增加不必要的电流消耗。通常的做法是按键一端直接连接GPIO,一端到地,GPIO配置为上拉输入模式。因为SOC的GPIO内的上拉输入一般为弱上拉,按键按下时内部电源通过GPIO输出的电流相对小很多。

此外,为了进一步降低按键按下时消耗的电流,我们可以在程序中动态的配置按键GPIO的输入状态:当按键按下时,程序进入外部中断的中断服务程序里,此时先将GPIO配置为浮空输入模式,然后再执行相应的任务代码。在按键释放后或者任务代码执行完成后,应再将GPIO重新配置回上拉输入模式。动态配置上拉输入的好处在于,在按键按下的时间里,GPIO大部分的时间处于浮空输入状态,比上拉输入状态的消耗更小。

运行模式

系统功耗也取决于SOC的运行模式。如果SOC使用电池供电,那么选择合适的运行模式就十分重要。为了确保电池的使用时长,在设计时就必须考虑系统的平均功耗,使其低于一个目标值。一般情况是,SOC在一个周期内很短的时间片内执行任务,然后在剩下的时间内工作在低功耗模式,从而使其平均电流消耗小于目标值。

概括来说,低功耗SOC支持以下三种运行模式:

  • 运行模式(Run Mode)
  • 待机模式(Wait Mode)
  • 休眠模式(Sleep Mode)

运行模式指的是SOC没有使用休眠策略,CPU与外设正常工作的模式。在持续供电且不用考虑功耗的情况下,系统往往采用运行模式。

在待机模式下,系统的core以低速保持工作,部分组件进入休眠状态,等待一个外部或内部的中断事件来唤醒。

在休眠模式下,系统绝大部分组件包括core都关断,以大幅度的节省能耗。同时,系统能够被唤醒的手段相对于待机模式也会少很多,往往可能只支持外部中断唤醒。

待机模式和休眠模式都属于低功耗模式,两种又有着一些区别:休眠模式的唤醒反应时间比待机模式长一些,因为在休眠模式下,片上存储器断电、core关断、大部分外设与时钟关闭,而这些恢复正常工作都需要时间。也正因为这些特性,休眠模式的功耗比待机模式的功耗也小很多。

其他低功耗手段

1.尽量减少CPU的计算量。
减少CPU运算的工作可以从很多方面入手:

  • 将一些运算的结果预先计算好,放在Flash中,用查表的方法替代实时的计算,减小CPU的运算工作量,可以有效降低CPU的功耗。
  • 不可避免的实时计算,算到精度够了就结束,避免“过度”计算。
  • 尽量使用短的数据类型,如尽量使用字符型的8位数据替代16位的整型数据。

2.软件代码优化。
软件代码的功耗优化主要包括:

  • a.在确定算法时,对所需算法的复杂性、并发性进行分析,尽可能利用算法的规整性和可重用性,减少所需的运算操作和运算资源。
  • b.把算法转化为可执行代码时,尽可能针对特定的硬件体系结构进行优化,如由于访问寄存器比访问内存需要更少的功耗,所以,可以通过合理有效的利用寄存器来减少对内存的访问。
  • c.在操作系统中充分利用硬件提供的节点模式,随着动态电压调整技术的出现,操作系统可以通过合理的设置工作状态来减少功耗。