在许多情况下需要优化嵌入式系统特性,这些特性包括系统时序、代码大小、RAM 使用和能耗。优化每个特性通常需要不同的方法和技术,但嵌入式开发人员可以遵循几个通用技巧来优化他们的嵌入式软件。
技巧1 – 始终创建一个基线进行比较
创建一个基线来比较优化结果是显而易见的。基线测量很重要,因为每个优化周期的回报都会递减。例如,第一次优化能源可能会导致 20% 的改进。第二个,10%,然后是 5%,以此类推。开发人员需要能够看到这一趋势,并量化他们在系统中看到的改进,以投入时间。
技巧2 – 设置优化目标
每一次优化都需要越来越多的时间来从系统中挤出最小的改进,团队需要仔细平衡他们的时间投入,并确定由此产生的改进是否值得花时间。在优化开始之前,团队应该设定一个目标水平,一旦达到就足以满足当前应用程序的需要,并表明优化过程已经完成。
技巧3 – 使用正确的工具进行测量
如果没有正确的测量工具,优化系统可能会非常困难。如果没有准确的方法来测量系统和微控制器的能量消耗,就无法进行能量优化。在许多情况下,团队无法将这两种不同的能量测量值分开,并在微控制器能量无法降低时尝试将其最小化。如果没有可以准确测量或允许嵌入式开发人员查看系统行为的工具,那么尝试优化系统是没有意义的。
技巧4 – 使用优化工具
嵌入式软件可以在许多领域进行优化,以减少代码大小或提高性能,在某些情况下,可以使用单独的或附加的工具链来执行优化。一个示例优化工具是 Somnium DRT 优化器,可与 GCC 一起使用以优化代码大小、能源使用和性能。有时可能不需要外部工具,而只是选择正确的工具链。
技巧5 – 使用编译器属性和#pragma
更改编译器,开发人员突然不得不返回并重新处理所有这些代码行。属性和#pragmas 通常是不可移植的,并且在更改编译器时可能导致软件错误。但是,在微调嵌入式软件时,开发人员通常别无选择。使用属性和#pragma 可以提高速度,选择性地将优化应用于单个函数等等。因此,出于这些原因,打算优化软件的开发人员应该熟悉它们,同时阅读用 C 编写可移植优化,这样他们就能明白自己是如何写出仍然可移植的优化。
技巧6 – 不要犹豫去尝试
优化系统没有一成不变的做法,嵌入式开发人员不应该感到受限于遵循任何技术。有时学习和优化系统的最佳方法是将实验放在一起,然后看看会发生什么。通过实验和记录结果,能够弄清楚什么有效,什么无效,什么是资源和时间的浪费。一个简单的例子是如何充分利用 printf。
通过尝试不同的驱动程序模型,有一些方法可以显着提高开发人员在使用 printf 时获得的实时性能,这通常被认为比实际情况要好得多。
技巧7 – 深入了解编译器生成的指令
在一些资源极度受限的应用程序中,有时开发人员只需要深入研究编译器生成的指令。选择三元运算符而不是 if/else 可能是正在执行的三个或四个额外指令之间的差异,这会导致应用程序崩溃。虽然 C 等语言是标准语言,但每个编译器优化和生成机器指令的方式略有不同,了解编译器在做什么的唯一真正方法是查看程序集。
结论
应用程序的优化需求将大不相同,一些小批量生产的应用程序可能根本不需要优化。在其他情况下,纳安的每个时钟周期都很重要,可能会花费大量时间来试图从系统中榨取每一滴性能或能量。虽然每个系统都不同,但这些技巧为嵌入式开发人员和团队提供了一个起点,可以让他们走上更高效的系统之路。