优化嵌入式软件以提高电源效率:第 1 部分 – 测量电源

时间:2023-03-15

关于如何管理嵌入式软件设计的电源要求的系列文章的篇。作者提供了有关在硬件、算法、数据流和内存级别应用优化技术之前所需的功率测量的提示。

嵌入式项目的产品生命周期中重要的考虑因素之一是了解和优化设备的功耗。手持设备的功耗非常明显,需要电池供电才能保证充电之间的特定使用/空闲时间。其他嵌入式应用,如医疗设备、测试、测量、媒体和无线基站,也对功耗非常敏感——因为需要管理日益强大的处理器的散热、电源成本和能源消耗成本——所以功耗是不容忽视的事实。

设置和保持功率要求的责任通常落在硬件设计人员的肩上,但软件程序员有能力为功率优化做出巨大贡献。通常,软件工程师对影响设备功耗的影响被忽视或低估。

本系列文章的目的是讨论如何使用软件来优化功耗,从功耗的基础知识开始,如何正确测量功耗,然后转向化软件功耗的技术在算法级别、硬件级别和数据流级别。这将包括各种技术的演示,以及某些方法如何以及为何有效降低功耗的解释,以便读者可以立即将这项工作应用到他们的应用程序中。

功耗基础 
一般而言,当讨论功耗时,讨论一个器件的四个主要因素是应用、频率、电压和工艺技术,因此我们需要了解为什么这些因素如此重要.

该应用非常重要,以至于两个手持设备的功率曲线可能不同,以至于使功率优化策略完全相反。虽然我们稍后会解释更多关于功耗优化策略的信息,但基本概念已经足够清晰,可以在本节中介绍。

以便携式媒体播放器与手机为例。便携式媒体播放器需要能够长时间以 100% 使用率运行以显示视频(完整电影)、音频等。我们稍后会讨论这个问题,但此类的一般功耗配置文件设备的开发必须更多地关注算法和数据流功率优化,而不是低功耗模式的有效使用。

将此与蜂窝电话进行比较,蜂窝电话大部分时间都处于空闲状态,并且在通话期间用户仅通话相对较小的时间百分比。对于这一小部分时间,处理器可能负载很重,执行语音编码/解码和传输/接收数据。在剩余的通话时间里,手机的任务并不繁重,它会执行诸如向蜂窝网络发送心跳数据包和向用户提供“舒适噪音”等程序,让用户知道手机在静音期间仍然处于连接状态。对于这种配置文件,功率优化将首先集中在化处理器睡眠状态以尽可能多地节省功率,然后是数据流/算法方法。

就工艺技术而言,当前的嵌入式内核基于
45 纳米,不久的将来将采用 28 纳米技术,其尺寸比其前身 65 纳米技术有所减小。这种更小的工艺技术提供的是更小的晶体管。更小的晶体管消耗更少的功率并产生更少的热量,因此与它们的前身相比具有明显的优势。

较小的工艺技术通常还可以实现更高的时钟频率,这显然是一个优势,可以提供更多的处理能力,但更高的频率和更高的电压是以更高的功耗为代价的。电压是其中明显的,正如我们在物理学(和 EE101)中了解到的那样,功率是电压乘以电流的乘积。因此,如果设备需要大电压供应,功耗增加是不可避免的。

在继续讨论P=V*I的主题时,频率也是该等式的直接部分,因为电流是时钟速率的直接结果。我们在物理和 EE101 中学到的另一件事:当在电容器两端施加电压时,电流将从电压源流向电容器,直到电容器达到等效电位。

虽然这是一种过度简化,但我们可以想象内核中的时钟网络以这种方式消耗功率。因此,在每个时钟边沿,当电势发生变化时,电流会流过器件,直到达到下一个稳定状态。时钟切换得越快,流过的电流就越多,因此更快的时钟意味着嵌入式处理器消耗的功率更多。根据设备的不同,时钟电路负责消耗 50% 到 90% 的动态设备功率,因此控制时钟是这里将重点讨论的主题。

功耗类型 
总功耗包括两种功耗:动态和静态(也称为静态泄漏)功耗,因此总器件功耗计算如下:

P总计 = P动态 + P静态

正如我们刚才所讨论的,时钟转换是动态消耗的很大一部分,但是这个“动态消耗”是什么?基本上,在软件中我们可以控制动态消耗,但我们无法控制静态消耗。

静态功耗 泄漏消耗是设备消耗的功率,与运行的任何活动或任务无关,因为即使在稳定状态下也存在低“泄漏”电流路径(通过晶体管隧道电流、反向二极管泄漏等)。 ) 从设备的 Vin 到地。影响漏电消耗的因素只有电源电压、温度和工艺。

我们已经在介绍中讨论了电压和过程。就温度而言,理解为什么热量会增加漏电流是相当直观的。热量增加了电子载流子的迁移率,这将导致电子流量增加,从而导致更大的静态功耗。由于本章的重点是软件,静态功耗理论到此结束。

动态功耗 嵌入式处理器的动态功耗包括设备主动使用内核、内核子系统、外设(如 DMA、I/O(无线电、以太网、PCIe、CMOS 相机)、内存以及 PLL 和时钟)所消耗的功耗. 在低级别,这可以解释为动态功率是开关晶体管对电容充电和放电所消耗的功率。

随着我们使用更多的系统元素、更多的内核、更多的算术单元、更多的内存、更高的时钟速率或任何可能增加晶体管开关量或它们开关速度的任何东西,动态功耗也会增加。动态消耗与温度无关,但仍取决于电压供应水平。

值、平均值、坏情况和典型值。在测量功率或确定系统的功耗时,需要考虑四种主要的功率类型:功率、平均功率、坏情况功耗和典型功耗。

和平均功率是通用术语,用于描述功率测量本身,而不是软件或其他变量对设备功耗的影响。

简单地说,功率是在一段时间内测得的瞬时功率读数。这种测量有助于显示设备保持适当水平的信号完整性(可靠运行所需)所需的去耦电容量。

平均功率在这一点上很直观:技术上是一段时间内消耗的能量除以该时间(功率读数随时间平均)。工程师通过计算随时间消耗的平均电流并使用它来计算功率来做到这一点。平均功率读数是我们重点优化的内容,因为这是电池或电源必须能够为处理器提供多少功率才能随时间执行应用程序的决定性因素,并且这也用于了解热量分布装置。

坏情况和典型功率值均基于平均功率测量。坏情况功率或坏情况功率曲线描述了设备在给定时间段内以 100% 使用率消耗的平均功率。百分之一百的使用率是指处理器同时利用数量的可用处理单元(内核中的数据和地址生成块、加速器、位掩码等)、存储器和外设。这可以通过将内核置于一个无限循环中来模拟,每个循环执行 6 条或更多指令(取决于内核中可用的处理单元),同时具有多个 DMA 通道连续读取和写入内存,以及外围设备不断发送和接收数据。

在实际系统中,设备很少会消耗坏情况下的功率,因为应用程序不会长时间使用所有处理元件、内存和 I/O,如果有的话。通常,设备提供许多不同的 I/O 外围设备,尽管只需要其中的一部分,并且设备内核可能只需要在一小部分时间内执行繁重的计算,只访问一部分内存。然后,典型功耗可能基于假设的“一般用例”示例应用程序,该应用程序可能使用处理器可用硬件组件的 50% 到 70%。这是软件应用程序的一个主要方面,我们将利用它来优化功耗。

测量功耗 
测量功率取决于硬件:一些嵌入式处理器提供内部测量功能;处理器制造商也可能提供“功率计算器”,提供一些功率信息;有许多电源控制器 IC 提供不同形式的功率测量功能;一些称为 VRM(稳压器模块)的电源控制器具有这些内部功能,可以通过外围接口读取;,还有将电流表串联到电源的老式方法。

使用电流表测量功率。“老式”方法是通过使用串联连接到电流表正极端子的外部电源来测量功率,电流表通过负极连接器连接到 DSP 设备电源输入,如图 13.1所示。


图 13.1:通过电流表测量功率。

请注意,图 13.1 中显示了三种不同的设置,它们都是针对单个处理器的。这是因为处理器电源输入是隔离的,通常在内核(可能有多个电源)、外设和内存之间。这是通过硬件设计完成的,因为设备的不同组件具有不同的电压要求,这有助于隔离(并终优化)各个组件的电源配置文件。

为了正确测量功耗,必须正确隔离每个组件的电源,在某些情况下可能需要修改电路板、特定跳线设置等。理想的情况是能够将外部电源/电流表组合连接为尽可能靠近处理器电源输入引脚。

或者,可以测量与电源和处理器电源引脚串联的(分流)电阻两端的压降。通过测量电阻两端的电压降,只需计算 I = V/R 即可找到电流。

测量半个传感器 IC 的功率。为了简化高效的功率测量,许多嵌入式供应商正在构建使用基于霍尔效应的传感器的电路板。当霍尔传感器放置在设备电源电流路径中的电路板上时,它会产生一个电压,该电压等于电流乘以某个具有偏移的系数。

对于 Freescale 的 MSC8144 DSP 应用开发系统板,板上提供了一个 Allegro ACS0704 霍尔传感器,可实现此类测量。有了这个板,用户可以简单地在板上放置示波器,查看随时间变化的电压信号,然后使用 Allegro 的电流电压图计算平均功率,如图 13.2所示。

图 13.2:霍尔效应 IC 电压电流图 (www.allegromicro.com/en/Products/Part../0704/0704-015.pdf)。

使用图 13.2,我们可以根据测量 Vout 两端的电位来计算设备的输入电流:

我 = (V输出 – 2:5)*10A

使用 VRM IC。,一些电压调节器模块电源 IC (VRM) 用于将大输入电压分成多个较小的电压,以提供不同电位的各个电源,测量电流/功耗并将值存储在寄存器中以供读取用户。通过 VRM 测量电流不需要任何设备,但这有时会以精度和实时测量为代价。

例如,PowerOne ZM7100 系列 VRM(也用在 MSC8144ADS 上)提供每个电源的电流读数,但电流读数每 0.5 到 1 秒更新,读数精度在 ~20% 量级,所以瞬时读取功率是不可能的,并且使用此类设备可能无法进行微调和优化。

除了确定一般测量功率的特定方法外,还存在不同的方法来测量动态功率与静态泄漏消耗。静态漏电消耗数据有助于为我们的低功耗预期奠定基础,并了解实际应用消耗的功率与设备空闲时消耗的功率。然后我们可以从我们测量的总功耗中减去它,以确定处理器正在拉动的动态功耗,并努力将其化。行业中有各种工具可以在这方面提供帮助。静态功率测量当器件处于低功耗模式时,通常可以测量处理器的泄漏消耗,假设该模式关闭了所有子系统和外设的时钟。如果时钟在低功耗模式下未关闭,则应旁路 PLL,然后关闭输入时钟,从而关闭所有时钟并从静态泄漏测量中消除时钟和 PLL 功耗。

此外,应在不同温度下测量静态泄漏,因为泄漏会随温度而变化。基于温度(和电压)创建一组静态测量值可以提供有价值的参考点,用于确定应用在这些温度/电压点实际消耗了多少动态功率。

动态功率测量功率测量应区分设备中每个主要模块的贡献,以便为工程师提供有关特定配置对系统功耗有何影响的信息。如上所述,通过测量总功率(在给定温度下)然后使用上面的初始静态测量值减去该给定温度下的泄漏消耗,可以简单地找到动态功率。

初始动态测量测试包括运行睡眠状态测试、调试状态测试和 NOP 测试。睡眠状态和调试状态测试将使用户深入了解在系统中启用某些时钟的成本。NOP 测试,就像在 NOP 命令循环中一样,主要使用设备的获取单元时,将为您的内核消耗提供基线动态读取,但不使用算术单元、地址生成、位掩码、内存管理等。

在比较具体的软件功耗优化技术时,我们比较每种技术前后的功耗数字,以确定该技术的效果。

这种强大的测试用例生成可以通过使用高端分析器分析代码性能来完成,以获得对使用的处理元素和内存百分比的一些基本了解。我们可以通过在标准工具 IDE 中创建一个新项目来演示这一点(有许多可用的) 启用探查器,然后编译并运行项目。该应用程序将从头到尾运行,此时用户可以选择一个分析器视图并获取任意数量的统计信息。

使用相关数据,例如使用的 ALU 百分比、使用的 AGU、代码热点和正在访问的内存知识,我们可以大致了解我们的代码将在哪里花费多的时间(和消耗多的功率)。我们可以使用它来生成一个在无限循环中运行的基本性能测试,使我们能够分析重要代码段的平均“典型”功率。

例如,使用两个主要函数:func1 和 func2。剖析示例代码,我们可以从图 13.3中看出 ,绝大多数周期都被 func1 例程消耗了。


图 13.3:热点分析

该例程位于 M2 内存中,并从可缓存的 M3 内存中读取数据(这意味着可能导致对 L2 和 L1 缓存的写回访问)。通过使用分析器(如图 13.4 所示),可以提取有关百分比 ALU 和百分比 AGU 的信息。


图 13.4:组件(% ALU,% AGU)利用率 

我们可以通过将代码变成无限循环、调整 I/O 并在相同的优化级别编译,并验证我们看到相同的性能分解来有效地模拟这一点。另一种选择是用汇编代码编写示例测试,以强制某些 ALU/AGU 使用模型与我们的配置文件相匹配,尽管这不是那么,并且使测试单个优化更加困难。

然后我们可以设置一个断点,重新运行我们的应用程序,并确认设备使用配置文件与我们的原始代码一致。如果不是,我们可以调整编译器优化级别或我们的代码,直到它与原始应用程序匹配。

这种方法可以快速有效地测量各种负载的功耗,如果我们通过正确使用分析器来镜像原始应用程序,这应该可以解决停顿和其他管道问题,因为分析器提供了有关总周期数以及指令和 VLES 利用率的信息。通过无限循环,测试变得更加容易,因为我们只是比较优化和非优化代码的稳态电流读数,希望获得更低的数字。我们可以使用它来测量许多指标,例如一段时间内的平均功率、每条指令的平均功率、每个周期的平均功率以及一段时间 t 内以焦耳为单位的能量(功率 * 时间). 为了测量特定算法和节能技术,我们将使用类似的方法形成小例程,然后优化和测量随时间推移的节能情况。

使用这些工具将能够有效地测量和确认本文下一节中共享的知识,其中涵盖了用于优化功耗的软件技术。

上一篇:传感器融合支持复杂的下一代应用
下一篇:物联网中的直接设备连接

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料