如何在基于 ARM 的嵌入式 Linux 系统上进行节电?
Posted
技术标签:
【中文标题】如何在基于 ARM 的嵌入式 Linux 系统上进行节电?【英文标题】:How to do power save on a ARM-based Embedded Linux system? 【发布时间】:2011-03-06 18:29:08 【问题描述】:我计划开发一个不错的小应用程序,它将在基于 arm 的嵌入式 Linux 平台上运行;但是,由于该平台将由电池供电,因此我正在搜索有关如何处理节电的相关信息。
获得适当的电池使用时间很重要。
我认为 Linux 内核对此实现了一些支持,但我找不到有关此主题的任何文档。
欢迎任何关于如何设计我的程序和系统的意见。
也欢迎任何关于 Linux 内核如何尝试解决此类问题的意见。
其他问题:
用户空间的程序需要做多少?
你需要修改内核吗?
需要了解哪些内核系统调用或 API?
更新:
似乎参与“Free Electrons”网站的人已经就这个主题制作了一些不错的演示文稿。
http://free-electrons.com/services/power-management/ http://free-electrons.com/docs/power http://free-electrons.com/docs/optimizations但也许其他人有更多关于这个主题的信息?
更新:
看来,Adam Shiemke 去看看 MeeGo 项目的想法可能是迄今为止最好的建议。
它可能是目前最好的电池供电嵌入式 Linux 项目。
而诺基亚通常擅长这类事情。
更新:
人们必须小心 android,因为它在底部有一个“修改过的”Linux 内核,而且 Google 的人所做的一些事情并不使用基线/普通 Linux 内核。我认为他们的一些电源管理想法可能难以用于其他项目。
【问题讨论】:
【参考方案1】:我实际上并没有这样做,但我对这两者(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】:假设您正在编写(或至少有源代码)您的应用程序和驱动程序,您可以在不需要操作系统的任何特殊支持的情况下实现相当多的省电。
您的驱动程序需要能够禁用其关联设备并将其恢复,而无需重新启动或引入系统不稳定。如果您的设备连接到 PCI/PCIe 总线,请研究它们支持哪些电源状态 (D0 - D3) 以及您的驱动程序需要做什么才能在这些低功耗模式之间进行转换。如果您正在选择要使用的硬件设备,请寻找符合 PCI 电源管理规范或具有类似功能(例如睡眠模式和“唤醒”中断信号)的设备。
当您的设备启动时,每个能够检测其是否连接到任何设备的设备都需要这样做。如果任何端口或总线检测到它们没有被使用,请将它们关闭或使其进入睡眠状态。以全功率运行但未使用的端口会浪费比您想象的更多的功率。根据您的特定硬件和用例,拥有一个后台应用程序来监控设备使用情况、识别未使用/空闲资源并进行适当操作(如硬件的“屏幕保护程序”)也可能很有用。
您的应用软件应确保在尝试使用硬件设备之前检测它们是否已通电。如果您需要访问可能处于低功耗模式的设备,您的应用程序需要能够处理等待设备唤醒和响应的潜在长时间延迟。您的应用程序还应该考虑设备的睡眠需求。如果您需要向硬件设备发送一系列命令,请尝试将它们缓冲并一次全部发送出去,而不是将它们间隔开并需要多个唤醒->发送->睡眠周期。
不要害怕稍微降低系统组件的时钟频率。除了节省电力外,这还可以帮助它们运行得更凉爽(冷却所需的电力更少)。我已经看到一些设计使用的 CPU 比所需的功能更强大,而且有相当大的余量,然后时钟频率降低了 40%(将性能降低到原始水平,但功耗只是其一小部分) .另外,不要害怕用电来省电。也就是说,不要害怕使用 CPU 时间监控硬件设备来寻找禁用/休眠它们的机会(即使它会导致你的 CPU 使用更多的电源)。大多数情况下,这种权衡会导致净功率节省。
【讨论】:
【参考方案3】:作为具有功耗意识的应用程序开发人员,最重要的事情之一是避免不必要的计时器。如果可能,请使用中断驱动解决方案而不是轮询解决方案。如果必须使用计时器,则使用尽可能长的轮询间隔。
例如,如果应该在某个室温下进行特殊操作,则无需每 100 毫秒检查一次温度,因为房间内的温度变化缓慢。更合理的轮询间隔可以是 60 秒。
这会以多种方式影响功耗。在 Linux 中,CPUIDLE 子系统将 CPU (SOC) 带入尽可能深度的省电状态,具体取决于它预测下一次唤醒发生的时间。在系统中拥有大量计时器会使睡眠碎片化,从而无法长时间进入更深的睡眠状态。 CPUIDLE 的典型深度睡眠状态会关闭 CPU,但会使 RAM 保持自刷新。当定时器触发时,CPU 将启动并为应用程序的定时器提供服务。
【讨论】:
【参考方案4】:这实际上不是您的主题,但记录您的进度可能会派上用场:我正在寻找测试/测量我的嵌入式 linux 系统。这个论坛的 chris desjardins 向我推荐了这个:
我过去成功使用过bootchart:
http://elinux.org/Bootchart
这里列出了其他可能也有帮助的东西:
http://elinux.org/Boot_Time
【讨论】:
-1,这个答案对这个问题没有任何帮助。这应该是评论吗?以上是关于如何在基于 ARM 的嵌入式 Linux 系统上进行节电?的主要内容,如果未能解决你的问题,请参考以下文章
嵌入式arm linux环境中gdb+gdbserver调试
毕设教程:基于嵌入式Linux和Web实现的视频监控系统(Arm/树莓派/jetson)