虽然你可能认为低功耗设计只对电池供电的设备至关重要,但连接到电网的设备数量之多可能导致每年 10 – 15% 的发电量被浪费。因此,设计低功率的嵌入式系统对于最大限度地延长电池寿命和减少电网压力至关重要。(更不用说对环境的影响了)。在本文中,我们将探讨低功耗设计的实用技巧,帮助你开发节能的嵌入式系统。
低功耗技巧一、尽早测量和反复测量
首先让一个嵌入式系统工作,然后再回头优化代码和能源使用,这是一种明智之举。如果你不能让产品满足客户的需求,那么花在优化上的时间可能是一种浪费。
然而,我发现,当涉及到能源使用时,通常更好的做法是尽早开始测量你的消耗,并经常了解你的系统在执行过程中的能量消耗情况。
我尽早和反复测量是因为一旦发现如果设计走错了方向,就更容易进行调整或小的路线修正。
例如,做一个电池供电的医疗传感器,硬性要求需要电池续航14小时。故在开发周期的早期,开始进行能源使用测量,发现了两件事。首先,由于美观原因,所选择的电池不足以满足应用的需要。第二,我们决定的软件架构不足以达到所需的能量要求。
尽早了解这些信息,我们可以及早调整软件架构,而不必重写整个项目。了解了电池的限制,我们也能够对硬件进行细微调整,以改善其能量状况,在项目结束时,我们成功实现了两次充电之间的操作寿命。如果我们等到最后,我相信该产品至少需要六个月来重新设计,这可能会使他们失去业务。
低功耗技巧二、微控制器的选择并不像你想象中的那样关键
几年前,芯片供应商之间展开了一场战争。这场战争是为了使微控制器达到最低功率的睡眠状态。一个供应商声称他们可以达到100uA的睡眠电流。另一家则说他们可以达到50uA。供应商增加了各种低功耗外设、睡眠模式和类似DMA的功能,旨在让CPU保持睡眠状态。这场战争似乎很高尚,但其中充斥着许多虚假的营销废话,例如能够让一台设备通过纽扣电池供电十年(杰克-甘斯勒在几篇文章和讲座中对此做了很好的反驳)。
虽然你会看到很多关于微控制器节能程度的数字和数据被抛出来,但在大多数情况下,这些数字不是基于工程,而是基于营销数字。今天,许多微控制器使用类似的技术(例如 Arm 内核),并使用类似的制造技术。一个供应商的Cortex-M4与另一个供应商的Cortex-M4没有什么不同,至少在能耗方面是如此。
当涉及到硬件选择时,诀窍在于为其选择合适的处理器类别。例如,使用Cortex-M0+或Cortex-M23而不是Cortex-M4或Cortex-M33。CPU的功能越强,微控制器中添加的硬件功能就越多,这些功能可能会泄漏或消耗电流。虽然安全功能在许多应用中是必需的,但安全功能可能会增加额外的内核、TrustZone、MPU 等,从而增加整体能耗。这些都是问题所在,而不是低功耗电流状态下的差异。
低功耗技巧三、采用事件驱动的软件架构
影响嵌入式产品能耗的一个重要因素是软件架构。我见过出色的、简洁的软件架构因为无法满足系统的低功耗要求而崩溃和烧毁。这些架构的问题通常在于它们的实时响应能力。它们很简洁,但存在较大的延迟或低效的通信机制,会消耗时钟周期和功率。
当设计一个低功耗的嵌入式系统时,必须把系统开发成事件驱动的。系统的默认状态是微控制器的睡眠模式之一。然后,事件会触发系统唤醒并做有价值的工作。
例如,低功耗定时器到期,系统醒来,检索传感器值,对其执行某些操作,然后再回到睡眠状态。在这种情况下,系统保持在低功耗状态,只有在执行工作时才会被唤醒。当执行工作时,它尽可能快地完成工作,然后再回到睡眠状态。
事件驱动着系统的整个行为,使其尽可能长时间地保持在睡眠模式。事实上,前面的例子可以得到极大的改进。例如,一个低功耗的定时器到期,DMA 通道检索传感器样本,唤醒处理它的 CPU,然后返回睡眠状态。在事件驱动架构中,我们使用外设、DMA和所有可用的工具来尽可能长时间地保持 CPU 休眠。原因是CPU一般是处理器中最大的能源消耗者。
低功耗技巧四、利用 多核
我们正试图设计一个低功耗的系统,要求尽可能地保持CPU的关闭,而我却建议增加更多的内核。有一些应用,如机器学习或数字信号处理应用,无法摆脱使用高性能微控制器。你需要Cortex-M4或Cortex-M33。你可能会发现,即使是睡眠模式或你的基准能耗也比你想要的要高。这时,第二个内核就可以派上用场了。
你可以使用一个多核微控制器,其中包括一个低功耗的微控制器,如Cortex-M0+和一个高性能的Cortex-M4。当不需要高性能的内核时,你把它关掉,只让低功耗的Cortex-M0+运行。当一个事件需要高性能处理时,Cortex-M0+将Cortex-M4打开,让它快速完成工作,然后将其恢复到关闭状态。
这方面的一个很好的例子可能是机器学习应用中的关键词检测。Cortex-M0+可能会搜索一个初始关键词,一旦发现,就会启动高性能内核来处理整个短语。在这种情况下,在初始关键词发现阶段,设备的整体能耗可能相当低。我想你会明白的。将低功耗内核与高性能内核一起使用可能会降低你的总体能耗。
低功耗技巧五、优化速度,而不是优化代码大小
当为低功耗设备编写软件时,需要进行必要的权衡:更快的处理和更大的代码,或更慢的处理和更小的代码。如果需要能源效率,那么你要优化代码的速度,而不是大小。当你的处理器被唤醒来处理数据时,你希望它尽可能快地处理,然后回到睡眠状态。睡眠的时间越长,设备的整体能耗就越低。
关于速度优化,我可以给你一个额外的小建议,那就是商业编译器比gcc做得更好。如果你不相信我,看看EMBCC CoreMark MCU Benchmark的公开数据。当你浏览数据时,看看在闪存中运行代码与从RAM中运行代码之间的差异。你会注意到,你可以从RAM中挤出一些额外的周期,所以如果你有频繁运行的代码,则可以通过将这些算法放入 RAM 来减少系统的能耗。
结论
设计一个低功耗的嵌入式系统不仅是对电池供电设备的要求,也是对并网设备的要求。正如你在这篇文章中所看到的,低功耗设计不仅仅是选择合适的硬件,还包括选择和实现正确的软件架构。目前,微控制器领域的大多数硬件具有类似的能源使用概况。诀窍是编写能够最有效地利用内部硬件的软件,以尽可能地保持CPU的禁用状态。