ARM Cortex-M 编译器差异

Posted

技术标签:

【中文标题】ARM Cortex-M 编译器差异【英文标题】:ARM Cortex-M compiler differences 【发布时间】:2015-03-10 14:51:24 【问题描述】:

我即将在我的项目中使用 C 为 STM32 处理器上的 Cortex-M 内核开发一些固件,并在网上搜索我发现了很多不同的编译器: Keil、IAR、Linaro、Yagarto 和GNU Tools for ARM Embedded Processors。

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

这些编译器之间生成的代码在大小/速度方面是否有很大差异?有对照表吗? (我在网上只找到过时的信息)

【问题讨论】:

你主要关心的是学习吗?那你为什么关心编译器的性能呢? Linaro 和 Yagarto 是 gcc 的两个版本(不同的库)。我会选择最后一个one you linked to。速度/尺寸数字始终基于综合基准。获取/制作您的代码并使用不同的编译器进行编译。通常,它们的编码方式将比编译器更能反映结果。即,具有不同“C”实现的相同算法。 我主要关心的显然是学习,但要达到性能并不是一件坏事(而且工作很有趣)。但是,我会按照您的建议将相同的代码用于不同的编译器,我会检查哪个我更熟悉。感谢您的评论 这个问题在学习环境之外同样有效,所以请不要用“如果你正在学习,你选择哪一个并不重要”来忽略它。我不是在学习,但我的问题非常相似,例如,我想知道商业选项是否在 GNU ARM 工具链上提供显着的性能或代码大小差异。 Raisonance AN0052 有一个比较。随着编译器的不断发展,这个问题将包含陈旧的信息(为什么会被忽略)。 GCC 在很多方面都比商业编译器性能接近(或更好)。 “基准测试”有很多不同的方法。 【参考方案1】:

基准测试本身就是一种艺术形式,通常很容易操纵结果以显示您想要的任何内容。我不希望编译器生成相同的结果,除了非常小的测试用例,有时在那些小的测试用例中,它们的结果要么相同,要么有时大不相同,因为您的测试暴露了一个编译器知道/使用的优化,而一个其他没有。

例如,我曾经使用 dhrystone 跟踪此类事情(编译器性能数据),但在已知基准的情况下(不是 dhrystone 不再意味着什么,而是其他),您可能会发现一些编译器正在调整自己以看起来在基准下表现不错,也许以牺牲其他东西为代价。

没有正确的答案,没有普遍的“最佳”,这一切都在旁观者的眼中,你。哪个工具更容易使用,你更喜欢哪个工具,无论是 gui 还是漂亮的颜色或声卡声音等等。然后从那里出发。

与其他的相比,我测试过的应用程序的 gnu 编译器通常不会生成“快速”的代码,这是我的基准,但是有更多的人使用免费的 gnu 工具,因此对它的支持要广泛得多到网页和论坛和示例的数量。 gnu 也没有大小限制,但它可能需要更多的学习或其他任何东西来启动和运行......

cortex-ms 分为 armv6m 和 armv7m 系列,v6m (cortex-m0) 只有少量的 thumb2 扩展,armv7m 有大约 150 个 thumbv2 扩展,所以你需要知道你的工具是什么支持而不是在错误的芯片上使用错误的东西。然后,如果编译器知道所有这些,他们可能并且将会从相同的源代码产生不同的指令混合。在同一个编译器或系列中使用不同的命令行选项,您可以/将获得截然不同的代码。除此之外,如果你有一个带缓存的 cortex-m4,如果你有这样的东西,取决于代码在缓存行中的位置,你可能会获得截然不同的性能,因此基准测试本身就是一个针对每个 blob 的研究项目您要进行基准测试的 C 代码。单个编译器内的性能范围可能会影响另一个编译器,或者重叠可能足以无关紧要。

如果您可以使用工具,您可以通过学习使用竞争工具并能够进入工作岗位和/或在您的工作范围内选择您认为适合该工作的工具或进入工作岗位,从而为自己增加专业价值Kiel 房子可以立即工作,或者 gnu 房子可以立即工作。如果你只是 gnu 并且这份工作是为 Kiel 房子工作的,那么你可能会失去工作。

【讨论】:

感谢非常详细的评论!我会检查 thumb2 扩展的兼容性和对编译器的支持,我会告诉你我会在哪里登陆【参考方案2】:

我们做了一些比较; IAR 和 Keil 在默认设置下的性能通常优于 GCC。但是通过一些编译器标志,您可以使 GCC 非常接近 IAR 和 Keil 的结果。

您提到的一些编译器是集成开发环境。其他的只是普通的编译器。 有些人更喜欢为您精心打包的编译器、编辑器和调试器的集成环境。其他人更喜欢建立自己的环境。这是一个品味问题。

除了 Yagarto,还有 GCC for ARM 的“Code Sourcery”发行版。

【讨论】:

【参考方案3】:

性能不应该是您首先关心的问题,除非它在生产环境中变得如此。原因是首先,大多数 ARM 编译器都足够好,实际上你只能使用基于 GCC、Keil 和 IAR 的编译器。其次,大多数 ARM MCU 都“非常快”并且具有“如此多的内存”(这些与 AVR/PIC 等 8 位 MCU 以及较旧的 PC 相比)。一个不错的 Cortex-M4 MCU 运行频率高达 100MHz,并拥有 256K 的闪存。再说一次,换个角度看,这比原来的 Macintosh 等更多的内存和快 10 倍的时钟速率。我们用更少的东西登上了月球 ;-)

现在工具本身的性能,特别是 IDE 和调试器,差别很大。例如,流行的 Eclipse 是用 Java 编写的,对于速度较慢或内存不足的 PC 来说可能有点迟钝。最好的办法是安装 GCC+Eclipse,以及供应商的演示,自己看看。

【讨论】:

以上是关于ARM Cortex-M 编译器差异的主要内容,如果未能解决你的问题,请参考以下文章

ARM探索之旅 | 一带你认识ARM Cortex-M阵营

ARM探索之旅 | 二ARM Cortex-M 用什么指令集?

ARM Cortex-M底层技术—编译内核的原理及其应用

ARM Cortex-M7 长分支在编译时出现错误“relocation truncated to fit: R_ARM_PREL31”

ARM编译器那些事

小熊派开发环境准备——MDK软件安装介绍