作为开发人员和管理者,我们都喜欢免费软件。开源软件运动推动了标准软件功能的普及,而成本很低甚至免费。这些功能,如TCP/IP协议栈、MQTT、驱动程序、文件系统等等,如果企业自己开发,可能要花费数万甚至数十万美元。此外,在许多情况下,开源软件还能帮助团队更快地交付产品。
虽然开源为行业提供了很大的价值,但我经常在想,我们是否过于相信炒作了。老话说得好“一分钱一分货”。 我们是否忽视了嵌入式软件团队正在产生的成本或其他问题?
在这篇文章中,我将探讨最近引起我注意的关于开源编译器的几个有趣的观点,我想你会觉得很有意思。
注:我和大多数团队一样使用GCC等开源编译器。我并不是要贬低它们的价值,而是要阐明使用它们时您可能会忽略的内容。完成工作的最佳工具取决于您的需求和要求。
现代的开源编译器很容易找到并让人惊叹于它们的强大。大约20年前,我刚进入嵌入式系统行业时,编译器还很糟糕。我经常手动优化代码,以获得最佳性能、速度或目标代码大小。
编译器技术发展到今天已经非常先进,以至于人们很容易相信编译器已经足够智能,可以为您优化一切。在了解了技术现状后,我们也很容易相信GCC或其他用于嵌入式开发的编译器中也有这样的技术。
剧透警告:事实并非如此!
最近,我对各种流行的RTOS供应商的RTOS性能指标进行了基准测试。目的之一就是进行同类比较。最初的想法是使用商业编译器IAR来编译和比较它们。不幸的是,我发现一些开源RTOS与其工具链GCC的耦合非常紧密,以至于使用某些RTOS是一项耗时且可能无法完成的工作。
解决方案很简单:我尽可能使用适用于IAR Embedded Workbench for Arm,但我也使用GCC收集数据并进行比较。当我收集数据并开始进行一些比较时,发现了一个趋势。
与GCC相比,使用IAR编译的RTOS指标性能要好得多。不同的指标测试结果略有不同,但通常要好约20–40%!
下面是一个例子,将IAR指标结果除以ThreadX(现在是Eclipse ThreadX)的GCC指标结果。
RTOS测试 | ThreadX |
基准测试 | 74% |
协同调度 | 3% |
内存分配测试 | 28% |
消息处理 | 41% |
抢占式调度 | 19% |
同步处理 | 32% |
如果将付费使用的商业编译器与免费编译器进行比较,你会认为商业编译器的结果会更好。真正的问题是,使用免费编译器会带来哪些隐性成本?
注:此数据仅按原样提供,您可自行得出结论。使用不同的RTOS或其他代码、设置等可能会得到不同的结果。提供它是为了让读者了解比较的结果。
您当然可以争辩说,编写代码的质量将决定性能的好坏。在某种程度上,我并不反对。您可以在编写代码时一丝不苟,或者花时间手动优化代码。但这不就等于延长了开发时间,增加了成本吗?
表面上看,多几个额外的周期似乎没什么大不了。如果您正在设计电池供电的物联网设备怎么办?难道您不希望代码运行得越快越好吗?假设,使用GCC平均会增加20%的处理时间。这意味着当您的设备不处于睡眠状态时,您使用的处理能力比您需要的多20%。这将消耗电池中更多的能量,缩短电池寿命!
虽然我主要将执行速度视为一个重要指标,但商业编译器也会为您的代码提供更小的编译占用空间。如果使用GCC会导致您需要选用比你实际要用的更大的内存呢?或者更稳健的部件?亦或者是200MHz而不是120MHz?
也许这只需花费1美元,没什么大不了的。但是,如果您每年发货10万件怎么办?如果您的出货量达到一百万或更多怎么办?突然之间,许多人认为过于昂贵的商业编译器的成本就变得很便宜了!
GCC是软件行业的福音。它使初创企业和团队可以免费使用编译器、工具等。我们可以在不产生大量额外开销的情况下开始运行并构建产品。然而,在某些时候,我们需要摘掉占便宜的心态,放眼全局。
使用GCC是否适合该应用?它是否会影响代码大小或速度,从而影响产品的使用寿命或成本?
答案将取决于您的产品、客户和最终目标。但是,我恳请您不要忽视这些问题。对结果进行调查,尽职尽责。不要因为您的芯片提供商提供GCC或者它是最简单的入门方式就跟风。
可以从它开始,但要做足功课,了解设计决策的影响。这可能就是公司盈利与亏损的差别。
注意:此博客的灵感没有任何利益相关。我预计使用Keil MDK、Green Hills Integrity或其他商业工具也能得到类似的结果。我只是碰巧使用IAR进行了指标分析。我的这一观察结果,希望能引起您对设计的更广泛的影响的思考。
(原文刊登于EDN姊妹网站Embedded,参考链接:The hidden costs of open-source compilers,由Ricardo Xie编译。)