ARM Cortex-M编译器的差异

15

我即将使用C语言为我的项目开发Cortex-M芯片上STM32处理器的固件,搜索网络时发现了许多不同的编译器:Keil、IAR、Linaro、Yagarto和GNU ARM嵌入式处理器工具

我想知道这些编译器之间有哪些功能差异可能会影响我的选择?例如,作为一位爱好者,我不需要供应商的支持或帮助,而对代码大小的限制暂时也没有问题。此外,易用性不是主要关注点,因为我喜欢学习(而且我目前已经拥有Keil Lite和配置好的Eclipse与GNU ARM)。

这些编译器生成的代码在大小/速度方面是否有很大差异?是否有任何比较表格?(我只在网上找到过时的信息)


你的主要关注点是学习吗?那么你为什么要关心编译器的性能?Linaro和Yagarto是gcc的两个版本(不同的库)。我会选择你链接的最后一个(https://launchpad.net/gcc-arm-embedded)。速度/大小数字总是基于综合基准测试。拿取/制作你的代码并使用不同的编译器进行编译。通常,你编写代码的方式将反映出结果,而不是编译器。也就是说,采用不同的“C”实现方式得到的相同算法可能会有所不同。 - artless noise
我的主要关注点显然是学习,但性能也不是一个坏的目标(并且在其中工作也很有趣)。然而,我会遵循您的建议,将相同的代码运行在不同的编译器上,并检查哪个更容易上手。感谢您的评论。 - Fabio Angeletti
1
这个问题在学习环境之外同样适用,请不要以“如果你正在学习,选择哪一个都无所谓”来轻描淡写地回答它。我并不是在学习,但我的问题非常相似,例如我想知道商业选项是否与GNU ARM工具链相比提供了显著的性能或代码大小差异。 - Jan Rychter
Raisonance AN0052有一个比较。由于编译器不断发展,这个问题将会有过时的信息(为什么会被驳回)。在许多方面,GCC在性能上接近(或更好)商业编译器。有许多不同的方法来进行“基准测试”。 - artless noise
3个回答

6
基准测试本身就是一门艺术,通常很容易操纵结果以展示你想要的任何东西。我不会期望编译器生成相同的结果,除非是非常小的测试案例,有时在这些小的测试案例中,它们的结果要么完全相同,要么差别非常大,因为你的测试暴露了一个编译器知道/使用的优化,而另一个编译器则不知道/不使用。
例如,我曾经用dhrystone来跟踪这些事情(编译器性能数字),但在已知的基准测试案例中(虽然dhrystone现在意义不大,但其他基准测试案例可能更好),你可能会发现一些编译器正在调整自己以在基准测试中表现良好,可能会牺牲其他方面的性能。
没有正确答案,也没有普适的“最佳”解决方案,这都取决于个人的喜好。哪种工具对您来说更容易使用?您更喜欢哪种GUI、漂亮的颜色或声卡声音等等。然后再从那里开始。
我测试过的应用程序中,GNU编译器通常不会产生与其他编译器相比“更快”的代码,但使用免费的GNU工具的人数更多,因此由于网页、论坛和示例的数量,对其的支持要广得多。GNU也没有大小限制,但可能需要更多的学习或其他操作才能开始使用。
Cortex-M被分为armv6m和armv7m两个系列,v6m(cortex-m0)只有少量的thumb2扩展,而armv7m有约150个thumbv2扩展到thumb,因此您需要知道您的工具支持什么,不要在错误的芯片上使用错误的东西。然后,如果编译器知道所有这些内容,它们可能会从相同的源代码中生成不同的指令混合。在同一编译器或系列内,使用不同的命令行选项,您可以获得截然不同的代码。此外,在带有缓存的cortex-m4上,如果您拥有这样的设备,并且取决于代码在缓存行中的位置,您可能会获得截然不同的性能,因此基准测试对于每个C代码块来说都是一个研究项目。单个编译器内的性能范围可能会掩盖另一个编译器,或者重叠部分足以不起作用。
如果您可以访问这些工具,通过学习使用竞争工具并能够进入一份工作或在工作中选择您认为是正确的工具,您将为自己的职业生涯增加价值。如果您只会GNU并且工作需要Kiel,则可能会失去工作机会。

非常感谢您提供如此详细的评论!我将检查Thumb2扩展的兼容性和编译器支持情况,待我取得进展后会告知您。 - Fabio Angeletti

5
我们已经进行了一些比较;IAR和Keil通常在默认设置下表现更出色。但是,通过一些编译器标志,你可以使GCC的结果非常接近IAR和Keil的结果。
你提到的一些编译器是集成开发环境,其他的只是简单的编译器。有些人喜欢集成了编译器、编辑器和调试器的开发环境,而另一些人则喜欢自己搭建环境。这是一种个人口味问题。
除了Yagarto之外,还有一个“Code Sourcery”分发版的ARM GCC。

3

除非在生产环境下出现性能问题,否则性能不应该是你的首要考虑因素。原因在于,大多数 ARM 编译器已经足够好了,实际上你只需要选择 GCC、Keil 和 IAR 之一。其次,大多数 ARM 微控制器都非常快,并且内存很充足(这些与 AVR/PIC 等 8 位微控制器以及旧 PC 相比)。一个像样的 Cortex-M4 微控制器运行速度可以达到 100MHz ,并且拥有 256K 的闪存。再次说明,这个内存量和时钟速率比原始的 Macintosh 要高得多,而我们更少的内存就曾去过月球 ;-)

现在,特别是 IDE 和调试器的性能差异很大。例如,流行的 Eclipse 是用 Java 编写的,可能对较慢或内存不足的计算机有点迟缓。最好的做法是安装 GCC+Eclipse 和供应商的演示,并自行体验。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接