# 软件设计

对于资源稀缺的可穿戴平台和低功耗的移动平台，很多重要的想法需要从应用程序设计的角度进行评估。毫无疑问，新的应用程序会考虑这些因素。但是，也可以修改现有的应用程序从而使其从中受益。

鉴于大多数的低功耗设备提供了各种省电机制，因此应用程序应适当利用这些省电机制。例如，允许网络设备在较长时间内处于较低功耗的状态，从而避免不必要的网络流量。但是，接下来会讲一些额外的省电建议。

## 智能电量意识

低功耗设计通常使用诸如电压缩放或频率缩放之类的技术来权衡性能以节省功耗，从而降低电压或频率以降低动态功耗。但是，必须提供最低电压电平才能使电路工作。此外，降低电源电压会增加电路延迟，从而限制了处理器的工作频率；延迟不能太大以至于无法满足特定工作频率下的内部时序。因此，如Intel（R）Speed Step（TM）电压缩放技术所证明的那样，必须采取一种谨慎的方法来确定适当的电压缩放量。

不幸的是，现代处理器对系统性能的要求太高，无法使电压缩放成为一种有吸引力的节能解决方案。而且，处理器频率并不是影响复杂多媒体应用的功耗-性能（*power-performance*）的唯一因素。内存访问延迟和内存带宽也是重要因素。此外，多媒体应用具有实时的截止期限，这进一步限制了电压缩放的用处。因此，在实际系统中，需要沿电压-频率曲线动态调节电压和频率。

电压和频率的动态调整通常应由操作系统来完成。但是，操作系统不了解预期的工作量，尤其是在涉及突发多媒体应用程序时。而且，这样的工作负载不容易以合理的准确性进行预测，并且基于时间间隔的调度程序是不够的。操作系统充其量可以使用一些试探法更改处理器频率并尝试控制功耗。但是，这种试探的方案不适用于突发工作负载，例如视频解码，编码或处理。

但是，如果应用程序关注电量，就可以动态地、更好地预测实际的工作负载，进而将典型的视频解码器的功耗降低30％以上。应用程序的功耗在很大程度上取决于指令和存储器所需的时钟周期数。如果应用程序可以将未来需要的信息提供给OS，则OS可以执行更高效的任务调度，并且不需要进行不置信的预测。

如上的应用程序和OS联合起来降低功耗的方式对于资源匮乏的移动设备而言特别有用。应用程序必须了解其处理的任务的要求，尤其是应用程序处理的当前任务所需的时钟数，并且必须将这些信息通知给OS。然后，OS可以利用周期计数以及功耗-频率曲线来调节并达到可以满足应用截止期限的最小频率，从而实现最佳功耗。

例如，对于H.263解码，编码帧中使用的位数与解码时间成正比。根据Pouwelse等人的报告，利用每个帧中使用的位数的提示，应用程序可以确定视频的预期频率要求，并节省大约25％的功耗。

通常，会有省电的固件逻辑来控制主机系统的功耗。固件必须依靠测量来确定功耗节省的策略。然而，固件又不了解应用程序正在尝试做的工作，因此无法优化功耗。另一方面，具备功耗意识的智能应用通常可以利用对任务的了解以及内存使用模式将相关信息发送给固件，以帮助固件进一步节省功耗。

在一个类似的性能-省电的例子中，Steigerwald等人提出了一个在线事务处理应用程序，该应用程序监视事务处理的性能计数器以确定性能影响。然后将性能信息提供给中间件，中间件学习并更新系统上的最佳功耗限制策略。最后，电源控制器固件来限制系统的功耗。

## 对质量的要求

尽管会为了节省功耗而牺牲性能和视觉质量，但是大多数现代游戏和媒体应用程序的用户对质量的期望都很高。虽然CPU可以以更低频率运行并降低功耗，但对于各种游戏和视频编解码器应用是不可接受的，因为降低CPU频率就意味着无法在规定的时间内处理完响应的任务，进而导致出现卡顿，丢帧等影响体验的行为。但是，如果在设计和优化软件时仔细考虑这些因素的话就可以在满足质量要求的同时节省功耗。

## 硬件加速模

最新的移动手持设备的低功耗处理器带有各种能够执行特定任务的硬件模块，例如：相机图像信号处理，视频解码。与通用CPU执行任务相比，这些硬件模块会对任务进行优化以降低功耗。应用程序应利用这些硬件模块的优势，并尽可能减少工作量，以减轻计算负担并节省功耗。

## 高效能的用户接口

从前面描述的各种使用模型中可以明显看出，显示器是最耗电的单元。但是，可以以节能的方式设计图形用户界面（*GUI*），特别是对于LCD或OLED的显示器。对于这些显示器而言，不同的颜色、颜色模型、颜色序列，其消耗的电量也不同。因此，可以使用低功耗的配色方案降低功耗。例如，通常在PDA中使用的TFT（*thin film transistor*） LCD在黑色时比白色消耗更少的电量。

高效节能GUI设计的另一种方法是通过使用更少和更大的按钮改善用户的交互的延迟，以提供更好的用户便利性。

## 代码密度和内存占用量

在智能手机等低功耗的移动平台上，较差的代码密度意味着在处理器上运行所需的固件和驱动程序的代码太大。与优化固件相比，设备制造商必须使用更多的RAM和闪存来存储固件。因此，使用更多的存储器会导致更高的成本并会增大电池的耗电量。

由于内存成本在整个设计的成本和功耗中占主导地位，因此固件优化和代码密度可以发挥很大的作用。编译器级别的优化以及可能的指令集体系结构（*ISA，instruction set architecture*）可以实现密度更高的固件二进制文件，从而有助于降低功耗。

减少二进制文件的内存占用量的另一种方法是在写入内存时执行无损压缩，并在从内存读回时进行相应的解压缩。但是，节电还取决于工作负载的性质。由于媒体工作负载具有良好的局部性，因此将内存压缩用于某些媒体使用可能会有所帮助。

## 优化数据传输

专为低功耗设备设计的现代移动应用程序通常会利用Internet来处理云端的大量数据，在设备上则仅维护一个瘦客户端。尽管这种方法可以提高性能，但大量的数据传输意味着较高的功耗。利用要传输的数据的模式，可以减少数据带宽的使用，从而降低数据传输带来的功耗。此外，应用程序可以利用新的S0iX状态进行通知，从而允许处理器更频繁地进入到低功耗状态。

## 并行化和批处理

任务调度是多任务环境的一个挑战。长时间的任务序列化不会为处理器提供进入低功耗状态的机会。任务的并行化，流水线处理和批处理可以使得处理器有机会进入到低功耗状态，从而降低功耗。如果任务没有特定的处理速度，则以最高频率运行处理器以尽快完成任务，然后让处理器在尽可能长的时间内处于闲置状态，这样可能会更有效。
