如何在基于ARM的嵌入式Linux系统上进行省电设置?

18
我计划开发一个小型应用程序,可以在基于arm的嵌入式Linux平台上运行;然而,由于该平台将由电池供电,因此我正在寻找有关如何处理省电的相关信息。
获得良好的电池续航时间相当重要。
我认为Linux内核实现了一些支持,但我找不到任何关于这个主题的文档。
任何关于如何设计我的程序和系统的输入都受欢迎。
任何关于Linux内核如何解决这种类型问题的输入也是受欢迎的。
其他问题:
用户空间中的程序需要做多少?
您需要修改内核吗?
哪些内核系统调用或API值得了解?

更新:

看起来“Free Electrons”网站的相关人员已经制作了一些关于这个主题的精美演示。

但也许有其他人对这个主题有更多的信息吗?


更新:

看起来Adam Shiemke去查看MeeGo项目的想法可能是迄今为止最好的提示。

它可能是目前最好的电池供电嵌入式Linux项目。

而诺基亚通常在这方面做得相当不错。


更新:

在处理Android时需要小心,因为它在底层使用了“修改过的”Linux内核,Google团队做的一些事情并不使用基线/普通的Linux内核。我认为他们的一些电源管理想法可能对其他项目的重用造成麻烦。

4个回答

11

我实际上并没有这样做过,但是我对 Linux 和嵌入式电源管理有经验。在考虑电源管理时,脑海中浮现出两个主要的 Linux 发行版,即 Android 和 MeeGo。据我所知,MeeGo 使用未经修改的 2.6 内核,并带有一些额外的组件。我没有找到关于他们的电源管理策略的详细信息,尽管随着产品逐渐成熟,我认为会有更多信息公布。

然而,在 Android 上有更多的信息可用。他们运行一个相当大量修改的 2.6 内核。您可以在 http://elinux.org/Android_Power_Management(以及内核问题)中看到许多不同策略的好处。其他链接:

https://groups.google.com/group/android-kernel/browse_thread/thread/ee356c298276ad00/472613d15af746ea?lnk=raot&pli=1

http://www.ok-labs.com/blog/entry/context-switching-in-context/

我相信您可以找到更多类似的链接。由于这两个项目都是开源的,您可以获取内核代码,并可能从在论坛和群组中真正知道正在谈论什么的人那里获得更多信息。

在驱动程序级别上,您需要确保驱动程序可以正确处理暂停和关闭未使用的设备。针对移动市场的大多数设备都提供非常细粒度的支持,以关闭单个组件并调整时钟设置(请记住,功率与时钟的平方成正比)。

希望这可以帮助到您。


6
假设您正在编写(或至少拥有应用程序和驱动程序的源代码),并且不需要操作系统的任何特殊支持,您就可以进行相当多的省电操作。
您的驱动程序需要能够在无需重新启动或引入系统不稳定性的情况下禁用其关联设备并使其重新启动。如果您的设备连接到PCI/PCIe总线,请研究它们支持的电源状态(D0-D3)以及驱动程序需要执行的操作以在这些低功耗模式之间进行转换。如果您正在选择要使用的硬件设备,请寻找遵守PCI电源管理规范或具有类似功能(如睡眠模式和“唤醒”中断信号)的设备。
当您的设备启动时,每个具有检测是否连接到任何内容的能力的设备都需要这样做。如果任何端口或总线检测到它们未被使用,则将它们关闭或使其进入睡眠状态。一个运行在全功率但未使用的端口可能会浪费比您想象的更多的电力。根据您特定的硬件和用例,还可能有用的是拥有监视设备使用情况、识别未使用/空闲资源并采取适当措施的后台应用程序(类似于硬件的“屏幕保护程序”)。
您的应用程序软件应确保在尝试使用它们之前检测硬件设备是否已上电。如果需要访问可能处于低功耗模式的设备,则您的应用程序需要能够处理等待设备唤醒和响应的潜在延迟。您的应用程序还应考虑到设备的休眠需求。如果需要向硬件设备发送一系列命令,请尝试将它们缓冲起来并一次性发送,而不是将它们间隔开并要求多次唤醒-发送-睡眠循环。
不要害怕略微降低系统组件的时钟频率。除了节省电力外,这也有助于使它们运行更加凉爽(从而需要更少的冷却功率)。我见过一些设计,它们使用比必要更强大的CPU,然后将其降频高达40%(将性能降至原始水平,但功耗只有一小部分)。此外,不要害怕花费电力来节省电力。也就是说,不要害怕使用CPU时间监视硬件设备以寻找禁用/休眠它们的机会(即使这会导致CPU使用更多的电力)。大多数情况下,这种权衡会导致净节能。

2
作为一名注重功耗的应用程序开发人员,避免不必要的定时器是最重要的事情之一。如果可能的话,应该使用中断驱动的解决方案而不是轮询解决方案。如果必须使用定时器,则应尽可能使用较长的轮询间隔。
例如,如果在特定的室温下需要执行某些特殊操作,则每100毫秒检查一次温度是不必要的,因为房间内的温度变化缓慢。更合理的轮询间隔可能是60秒。
这会以多种方式影响功耗。在Linux中,CPUIDLE子系统将CPU(SOC)带入尽可能深的省电状态,具体取决于它预测下一次唤醒何时发生。在系统中有很多定时器会导致睡眠碎片化,使其无法进入更深的睡眠状态较长时间。CPUIDLE的典型深度睡眠状态会关闭CPU但保持RAM处于自刷新状态。当定时器触发时,CPU将启动并为应用程序服务。

-3

这并不是你的主题,但记录进展可能会有所帮助:我正在寻找测试/测量嵌入式Linux系统的方法。来自该论坛的Chris Desjardins向我推荐了这个:

我过去成功地使用过Bootchart:

http://elinux.org/Bootchart

以下是其他可能有所帮助的事项清单:

http://elinux.org/Boot_Time


2
-1,这个回答对问题没有任何帮助。这是应该作为评论吗? - aditya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接