高效软件编码

时间:2020-03-05 18:53:09  来源:igfitidea点击:

在典型的手持/便携式嵌入式系统设备中,电池寿命是H / W,S / W和设备可以支持的功能设计中的主要问题。从软件编程的角度来看,人们知道MIPS,内存(数据和程序)优化的代码。
我知道H / W深度睡眠模式,即待机模式,可用于以较低的周期为硬件计时或者将时钟整体转向一些未使用的电路以节省功耗,但是我正在从这一角度寻找一些想法:

在我的代码正在运行且需要继续执行的地方,鉴于此,我如何才能高效地编写代码"电源"以消耗最小的瓦特?

我是否应该查看任何特殊的编程结构,数据结构,控制结构,以实现给定功能的最低功耗。

在进行代码结构设计时或者在进行低级设计时,是否应牢记一些高级软件设计注意事项,以使代码尽可能高效(省电)?

解决方案

回答

不要轮询。使用事件和其他操作系统原语等待可报告的事件。轮询可确保CPU保持活动状态并使用更长的电池寿命。

回答

考虑最少使用网络接口。我们可能希望收集信息并突发发送,而不是不断发送。

回答

Zeroith,请使用可以在空闲时停止的全静态计算机。我们不能击败零赫兹。

首先,切换到无滴答的操作系统调度程序。唤醒每一毫秒都会浪费能量。如果不能,请考虑减慢调度程序中断的速度。

其次,确保空闲线程是节能的,等待下一个中断指令。
我们可以通过大多数小型设备所拥有的,被监管不足的"用户区"来执行此操作。

第三,如果我们必须轮询或者执行用户信心活动(例如更新用户界面),
睡觉,去做,然后重新入睡。

不要信任尚未检查"睡眠和旋转"类代码的GUI框架。
特别是事件计时器,我们可能很想在#2中使用。

在读取时阻止线程,而不是使用select()/ epoll()/ WaitForMultipleObjects()进行轮询。
给线形scheuler(和大脑)施加压力,但是设备通常还可以。
最终会稍微改变高级设计。它变得更整洁!
轮询我们可能做的所有事情的主循环最终会在CPU上缓慢而浪费,但可以保证性能。 (保证速度很慢)

缓存结果,懒惰地创建事物。用户希望设备运行缓慢,因此不要让他们失望。跑步越少越好。尽可能少地奔跑。
当我们不再需要单独的线程时,可以将它们杀死。

尝试获取比我们所需更多的内存,然后可以将其插入多个哈希表中并保存以前的搜索。如果内存是DRAM,则这是直接的折衷方案。

查看比我们认为可能需要的实时性更高的系统。这样可以节省时间(原文如此)。
他们也更好地处理线程。

回答

  • 就像" 1800 INFORMATION"所说的那样,避免轮询;订阅事件并等待事件发生
  • 仅在必要时更新窗口内容-让系统决定何时重绘窗口内容
  • 更新窗口内容时,请确保代码尽可能少地重新创建无效区域
  • 使用快速代码,CPU可以更快地返回深度睡眠模式,并且这样的代码更有可能保留在L1缓存中
  • 一次处理小数据,因此数据也保留在缓存中
  • 确保应用程序在后台运行时不执行任何不必要的操作
  • 使软件不仅高效节能,而且还具有节能意识-电池供电时更新图形的频率降低,禁用动画,减少硬盘抖动

并阅读其他指南。 ;)

最近,一系列名为"为电源优化软件应用程序"的文章开始出现在英特尔软件博客上。可能对x86开发人员有用。

回答

从我使用智能手机的工作来看,我发现保留电池寿命的最佳方法是确保禁用程序在特定时间点所需的一切。

例如,仅在需要时打开蓝牙,类似电话功能,在不需要时降低屏幕亮度,降低音量等。

这些功能使用的功能通常将远远超过代码使用的功能。

回答

查看编译器生成的内容,特别是对于代码的热门区域。

回答

如果我们具有低优先级的间歇操作,请不要使用特定的计时器唤醒以处理它们,而要在处理其他事件时进行处理。

使用逻辑避免愚蠢的情况,在这种情况下,应用程序可能会休眠10毫秒,然后必须为下一个事件再次唤醒。对于所提到的那种平台,两个事件是否同时处理并不重要。
拥有自己的计时器和回调机制可能适合这种决策。需要权衡的是代码的复杂性和维护与可能的节能。

回答

简而言之,要做的越少越好。

回答

同样不容易的事情是降低数学运算的精度,选择可用的最小数据集,如果开发环境打包数据和聚合运算可用,请使用最小的数据集。

knuth书可以为我们提供节省内存或者cpu所需的特定算法的所有变体,或者降低精度以最大程度地减少舍入误差

同样,花了一些时间检查所有嵌入式设备api,例如大多数symbian手机可以通过专用硬件进行音频编码

回答

好吧,就代码可以完全在处理器高速缓存中执行的程度而言,总线活动将减少,并节省电源。如果程序足够小,可以完全将代码和数据容纳在缓存中,那么我们将获得"免费"的好处。 OTOH,如果程序太大,并且可以将程序划分为彼此独立的模块,则可以通过将其划分为单独的程序来节省一些电能。 (我想也可以制作一个工具链,将相关的代码和数据包扩展为缓存大小的块...)

我想,从理论上讲,我们可以通过减少指针取消引用的次数以及重构跳转以使最可能的跳转首先执行而节省一些不必要的工作,但这对于程序员来说是不现实的。

Transmeta的想法是让机器即时执行一些指令优化以节省功耗。但是,这似乎并没有提供足够的帮助。

回答

避免轮询是一个很好的建议。

微处理器的功耗大致与其时钟频率及其电源电压的平方成正比。如果我们可以通过软件调整这些设置,则可以节省一些电量。另外,关闭不需要的处理器部分(例如浮点单元)可能会有所帮助,但这在很大程度上取决于平台。无论如何,我们都需要一种方法来测量处理器的实际功耗,以便找出有效的方法和无效的方法。就像速度优化一样,功率优化也需要仔细分析。

回答

将未使用的内存或者闪存设置为0xFF,而不是0x00。对于flash和eeprom,当然确实如此,不确定s或者dram。对于舞会,存在一个反转,因此0被存储为1并消耗更多的能量,而1被存储为零而消耗较少的能量。这就是为什么在擦除一个块后读取0xFFs的原因。

回答

尽快完成工作,然后进入一些空闲状态,等待中断(或者事件)发生。尝试使代码用尽缓存,并尽可能减少外部存储器流量。

回答

在Linux上,安装powertop以查看哪个软件多久唤醒一次CPU。并遵循powertop站点链接的各种技巧,其中一些技巧也可能适用于非Linux。

http://www.lesswatts.org/projects/powertop/

回答

选择快速的高效算法,这些算法具有很小的基本块和最少的内存访问。

了解处理器的缓存大小和功能单元。

不要访问内存。如果对象,垃圾收集或者任何其他高级构造将工作代码或者数据集扩展到可用缓存之外,请不要使用它们。如果我们知道缓存的大小和关联性,请在低功耗模式下布置所需的全部工作数据集,然后将其全部放入dcache中(忘记一些将数据分散在单独对象或者数据中的"适当"编码做法结构(如果这会导致缓存垃圾)。与所有子例程相同。如有必要,将所有工作代码集放在一个模块中,以将其全部分拆到icache中。如果处理器具有多个高速缓存级别,请尝试使用最低级别的指令或者数据高速缓存。除非可以很好地证明使用这些指令会大大缩短CPU进入睡眠模式的时间,否则不要使用浮点单元或者任何可能会为其他可选功能单元加电的指令。

等等。