优化嵌入式软件的7个技巧

在“ 每个工程师都应监控的5种嵌入式系统特性”,我讨论了许多情况下需要优化的关键嵌入式系统特性。这些特征包括系统时序,代码大小,RAM使用率和能耗。优化每个特征通常需要不同的方法和技术,但是开发人员可以遵循一些通用技巧来优化其嵌入式软件。

提示1 –始终创建比较基准

创建一个基准以比较优化结果是显而易见的,但是,这让您感到惊讶的是,我急切地遇到了多少次没有任何基准就直接进入优化的团队。基线测量很重要,因为每个优化周期的收益都会递减。例如,针对能量进行优化的第一遍可导致20%的改善。第二个是10%,然后是5%,依此类推。开发人员需要能够看到这种趋势并量化他们在系统中看到的时间投入。

提示2 –设定最佳化目标

每个优化过程都需要越来越多的时间来压缩系统中最小的改进。团队需要仔细平衡他们的时间投入,并确定由此带来的改进是否值得。尝试降低到最低可能会上瘾,并且在人们意识到之前,他们可能花了数周的时间来优化不再需要优化的系统。在优化开始之前,团队应该设置一个目标级别,一旦达到目标水平,该目标级别对于当前应用程序就足够了,并指示优化过程已完成。

提示#3 –获取正确的工具进行测量

如果没有合适的测量工具,优化系统将非常困难。如果没有准确的方法来测量系统和微控制器的能耗,就无法进行能量优化。在许多情况下,我会看到团队无法将这两种不同的能量测量结果分开,并试图在微控制器的能量无法降低时将其最小化。对性能进行优化感兴趣的开发人员可能会找到Seggar System View Utility,这是我在其中撰写的 动手:Seggar System View实用程序,对于了解哪些功能在独占CPU至关重要。如果没有能够准确衡量或允许开发人员了解系统行为的工具,那么尝试优化系统毫无意义。

提示4 –使用优化工具

为了减小代码大小或提高性能,可以在很多方面优化嵌入式软件,并且在某些情况下,可以使用单独的或附加的工具链来执行优化。一个优化工具示例是Somnium DRT优化器,可以与GCC一起使用以优化代码大小,能耗和性能。有时可能不需要外部工具,而只是选择正确的工具链。我最近写过 开源与商业编译器 我探讨了一个事实,即在Coremark测试中,在相同的测试条件下,使用相同的微控制器,与GCC之类的开源编译器相比,商业编译器产生了更高的分数。

技巧5 –使用编译器属性和#pragma

通常,我强烈不喜欢使用#pragmas或编译器属性。更改编译器后,突然之间,开发人员不得不返回并重新处理所有这些代码行。属性和#pragmas通常是不可移植的,并且在更改编译器时可能会导致软件错误。但是,当涉及到微调嵌入式软件时,开发人员通常没有选择的余地。使用属性和#pragma可以提高速度,选择性地将优化应用于单个函数,等等。因此,出于这些原因,打算优化软件的开发人员应该熟悉它们,但也请阅读 用C编写可移植的优化

这样他们就可以了解如何编写仍可移植的优化程序,而不会回头再咬它们。

提示#6 –毫不犹豫地尝试

在优化系统方面没有固定的惯例,开发人员不应受制于采用任何技术。有时,学习和优化系统的最佳方法是将实验放在一起,然后看看会发生什么。当我第一次开始针对低功耗优化系统时,它伴随着很多试验和错误。但是,通过实验和记录结果,我能够弄清楚什么有效,什么无效以及什么浪费资源和时间。一个简单的例子是如何 充分利用printf。

通过尝试不同的驱动程序模型,有多种方法可以极大地提高开发人员在使用printf时获得的实时性能,通常认为它要比实际情况要好得多。

技巧7 –深入了解编译器生成的指令

在某些资源非常有限的应用程序中,有时候开发人员只需要大声疾呼,深入研究编译器生成的指令。在if / else上选择三元运算符可能是执行的三个或四个额外指令之间的差异,这会导致应用程序内爆。尽管诸如C之类的语言是标准语言,但是每个编译器在优化和生成机器指令方面都略有不同,而知道编译器正在做什么的唯一真实方法是检查程序集。 (查看 三元运算符与if / else 如果您对底层外观感兴趣)。

结论

应用程序的优化需求将大相径庭。小批量生产中的某些应用可能根本不需要优化。在其他情况下,纳秒级的每个时钟周期都很重要,可能会花费大量时间来尝试压缩系统的性能或能耗的每一个下降。尽管每个系统都不同,但是这些技巧为开发人员和团队提供了一个起点,可以使他们迈向更高效的系统。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.