我准备在我的项目中使用C语言为STM32处理器上的Cortex-M内核开发一些固件,在网上搜索我发现了很多不同的编译器: Keil、IAR、Linaro、Yagarto和GNU Tools for ARM Embedded Processors。
我想知道,这些编译器之间有哪些功能差异可能会影响我的选择?例如,作为一个发烧友,我不需要供应商的支持或帮助,目前对代码大小的限制是可以的。此外,易用性也不是一个主要问题,因为我喜欢学习(目前我已经配置了Keil Lite和Eclipse以及GNU ARM,并且可以正常工作)。
这些编译器之间生成的代码在大小/速度方面有这么大的不同吗?有没有比较表?(我在网上只找到了陈旧的信息)
发布于 2015-01-13 06:41:59
基准测试本身就是一种艺术形式,通常很容易操纵结果来显示您想要的任何内容。我不期望编译器生成相同的结果,除了非常小的测试用例,有时在这些小测试用例中,它们的结果要么相同,要么非常不同,因为您的测试暴露了一个编译器知道/使用而另一个不知道的优化。
例如,我曾经使用dhrystone跟踪这样的事情(编译器性能数字),但在已知基准测试的情况下( dhrystone不再意味着太多,而是其他的),你可能会发现一些编译器正在调整自己,以便在基准测试下看起来更好,这可能是以牺牲其他东西为代价的。
没有正确的答案,也没有万能的“最好”,一切都在旁观者的眼中,你。哪个工具对你来说更容易使用,你更喜欢哪个图形用户界面,或漂亮的颜色或声卡声音或其他任何东西。然后从那里开始。
对于我测试过的应用程序来说,gnu编译器通常不会产生像我的基准测试那样“快速”的代码,但使用免费gnu工具的人要多得多,因此由于网页、论坛和示例的数量,对它的支持也相当广泛。gnu也没有大小限制,但它可能需要更多的学习或任何东西才能启动和运行……
cortex-ms分为armv6m和armv7m系列,v6m (cortex-m0)只有少量的thumb2扩展,armv7m有大约150个thumbv2扩展,所以你需要知道你的工具支持什么,不要在错误的芯片上使用错误的东西。然后,如果编译器知道所有这些,他们可能会从相同的源代码中产生不同的指令混合。此外,在相同的编译器或系列中,使用不同的命令行选项,您可以/将获得截然不同的代码。除此之外,如果你有一个带有缓存的cortex-m4,如果你有一个这样的东西,取决于代码在缓存线中的位置,你可能会获得非常不同的性能,所以基准测试本身就是一个研究项目,对于你想要基准测试的每个C代码斑点来说。单个编译器内的性能范围可能会遮蔽另一个编译器,或者重叠可能足以无关紧要。
如果你可以使用这些工具,你可以通过学习使用竞争对手的工具来专业地增加自己的价值,并且能够走进一份工作,或者在你的工作中,选择你认为适合这项工作的合适工具,或者走进基尔的房子,能够立即工作,或者走进gnu房子,立即工作。在那里,如果你只是gnu,而且工作是为了基尔的房子,你可能会失去一份工作。
发布于 2015-04-11 06:14:57
我们做了一些比较;IAR和Keil通常在默认设置下优于GCC。但是使用一些编译器标志,您可以使GCC非常接近IAR和Keil的结果。
您提到的一些编译器是集成开发环境。其他的只是普通的编译器。有些人更喜欢具有编译器、编辑器和调试器的集成环境。其他人则更喜欢建立自己的环境。这是一个品味问题。
除了Yagarto之外,还有针对ARM的GCC的"Code Sourcery“发行版。
发布于 2019-04-27 04:16:50
性能不应该是您首先关心的问题,除非它在生产环境中变得如此重要。原因是首先,大多数ARM编译器已经足够好了,实际上你只能使用基于GCC、Keil和IAR的编译器。其次,大多数ARM MCU是“惊人的速度”和“如此多的内存”(这些是与8位MCU相比,如AVR/PIC,但也与较老的PC相比)。一个像样的Cortex-M4 MCU运行在100 MCU,有256K的闪存。再说一次,这比原来的Macintosh等有更多的内存和10倍的时钟频率。我们去月球的时候带的内存要少得多;-)
现在,工具本身的性能,特别是IDE和调试器,有很大的不同。例如,流行的Eclipse是用Java编写的,对于速度较慢或内存不足的PC来说可能有点慢。最好的办法是安装GCC+Eclipse和供应商的演示程序,然后自己看一看。
https://stackoverflow.com/questions/27908760
复制相似问题