代码之家  ›  专栏  ›  技术社区  ›  Johan

如何在基于ARM的嵌入式Linux系统上实现节能?

  •  14
  • Johan  · 技术社区  · 14 年前

    我计划开发一个很好的小应用程序,它将在基于ARM的嵌入式Linux平台上运行;但是,由于该平台将由电池供电,所以我正在寻找有关如何处理节电的相关信息。

    获得合适的电池时间是很重要的。

    我认为Linux内核实现了对此的一些支持,但是我找不到关于这个主题的任何文档。

    • 欢迎输入有关如何设计我的程序和系统的信息。

    • 任何有关Linux内核如何解决这类问题的输入都是受欢迎的。

    其他问题:

    • 用户空间中的程序需要做多少?

    • 您需要修改内核吗?

    • 哪些内核系统调用或API是很好了解的?


    更新 :

    似乎参与“自由电子”网站的人就这个问题做了一些很好的介绍。

    但也许其他人对这个问题有更多的了解?


    更新 :

    It seems like Adam Shiemke's idea to go look at the MeeGo project may be the best tip so far.

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

    诺基亚通常擅长这种类型的产品。


    更新 :

    我们必须小心安卓系统,因为它的底部有一个“修改过的”Linux内核,而谷歌的员工所做的一些事情并没有使用基线/正常的Linux内核。我认为他们的一些电源管理想法可能会很麻烦,无法再用于其他项目。

    4 回复  |  直到 6 年前
        1
  •  9
  •   Adam Shiemke    14 年前

    我还没有真正做到这一点,但我有两个方面的经验(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/

    我相信你能找到更多这种性质的链接。由于这两个项目都是开放源码的,所以您可以获取内核代码,并可能从真正了解他们在表单和组中谈论的内容的人那里获得进一步的信息。

    在驱动程序级别,您需要确保您的驱动程序能够正确处理未使用的挂起和关闭设备。大多数面向移动市场的设备都提供非常精细的支持,以关闭单个组件,并调整时钟设置(记住,功率与时钟^2成比例)。

    希望这有帮助。

        2
  •  5
  •   bta    14 年前

    如果您正在编写(或者至少拥有)您的应用程序和驱动程序,那么您可以在不需要操作系统提供任何特殊支持的情况下节省大量的电源。

    您的驱动程序需要能够禁用其关联的设备并将其恢复,而无需重新启动或引入系统不稳定。如果您的设备连接到PCI/PCIe总线,请研究它们支持的电源状态(D0-D3)以及驱动程序在这些低功耗模式之间转换时需要做什么。如果选择要使用的硬件设备,请查找符合PCI电源管理规范或具有类似功能的设备(例如休眠模式和“唤醒”中断信号)。

    当您的设备启动时,每个能够检测它是否连接到任何设备都需要这样做。如果任何端口或总线检测到它们没有被使用,请关闭它们的电源或使它们休眠。一个满功率运行但未使用的端口会比您想象的浪费更多的能量。根据具体的硬件和用例,有一个后台应用程序来监视设备使用情况、识别未使用/空闲的资源并采取适当的行动(就像硬件的“屏幕保护程序”)可能也很有用。

    在尝试使用硬件设备之前,应用软件应确保检测硬件设备是否已通电。如果需要访问可能处于低功耗模式的设备,则应用程序需要能够处理等待设备唤醒和响应的可能长时间延迟。您的应用程序还应该考虑设备的睡眠需求。如果需要向硬件设备发送一系列命令,请尝试对它们进行缓冲,并立即将它们全部发送出去,而不是将它们隔开,并需要多次唤醒->发送->睡眠周期。

    不要害怕稍微低估系统组件的时钟。除了省电外,这还可以帮助他们运行冷却器(冷却需要的电力更少)。我见过一些设计使用了一个比所需更强大的CPU,并且有一个相当大的裕度,然后低于40%的时钟(将性能降低到原来的水平,但只降低了一小部分的电源成本)。另外,不要害怕用电来节电。也就是说,不要害怕使用CPU时间监控硬件设备以获得禁用/休眠它们的机会(即使这会导致CPU使用更多的电源)。大多数情况下,这种折衷会导致净节能。

        3
  •  1
  •   ria    6 年前

    作为一个有能力的应用程序开发人员,最重要的事情之一就是避免不必要的计时器。如果可能,使用中断驱动的解决方案而不是轮询的解决方案。如果必须使用计时器,则使用尽可能长的轮询间隔。

    例如,如果在某个室温下需要做一些特殊的工作,则不必每隔100毫秒检查一次温度,因为室内温度变化缓慢。更合理的轮询间隔可以是60秒。

    这在几个方面影响了功耗。在Linux中,cpuildle子系统将CPU(soc)置于尽可能深的节能状态,这取决于它预测下一次唤醒发生的时间。在一个系统中有大量的计时器会使睡眠碎片化,从而使长时间无法进入更深层次的睡眠状态。cpuildle的典型深度睡眠状态会关闭CPU,但会使RAM保持自刷新状态。当计时器触发时,CPU将引导并服务于应用程序的计时器。

        4
  •  -1
  •   user3085931    10 年前

    这实际上不是你的主题,但是记录你的进展可能会很方便:我正在寻找测试/测量我的嵌入式Linux系统。来自本论坛的Chris Desjardins向我推荐了:

    我曾经成功地使用过引导图:

    http://elinux.org/Bootchart

    以下列出了其他可能有帮助的事情:

    http://elinux.org/Boot_Time

    推荐文章