【问题标题】:Will all ARM compilers produce the same Assembly code and run on various CPUs?所有 ARM 编译器都会生成相同的汇编代码并在不同的 CPU 上运行吗?
【发布时间】:2021-12-14 01:34:51
【问题描述】:

我一直在为具有基于 ARM 的 NXP i.MX28 单核 CPU 的旧设备开发代码。该设备运行嵌入式 Linux。

我现在正在升级到更好的设备,它具有 NXP i.MX6UL 四核处理器,当然也是基于 ARM 的,并且还运行嵌入式 inux。

我用于构建 i.MX28 代码的相同工具链是否也适用于 i.MX6UL,即使 i.MX6UL 更先进,具有更多内核等,这是否正常?

我现在已经构建了我的代码以使用相同的编译器进行测试,甚至在似乎运行正常的 Rasberry Pi 上运行它。 Rasberry Pi 使用带有 ARM Cortex-A72 处理器的 Broadcom BCM2711 SoC,这又是一个不同的 CPU。

因此我必须问,任何 ARM 工具链都可以构建代码并能够在任何类型的 ARM 设备上运行吗?

【问题讨论】:

  • 编译/链接后,您会从标准化指令集中获得一堆指令。在您的情况下,指令集是 aarch32。只要您不要求特定 SoC 上可能存在或不存在的可选扩展(如 Neon、Crypto),为什么会有差异?
  • @user3124812 i.MX28 是单核而 i.MX6UL 是四核这一事实,这会对指令等产生影响吗?
  • 请在您的问题中说明您是在为 Linux 编写和构建软件,还是它是一个简单的实现(没有操作系统)。这对于您的问题和答案至关重要。
  • “这会对说明产生影响吗” - 当然不会。

标签: arm cross-compiling imx6 nxp-microcontroller gnu-toolchain


【解决方案1】:

CPU 因核心架构(包括指令集)和外设集而异。外设的差异由驱动程序和 HAL 解决。核心拱门的差异由工具链解决。

如果工具链“知道”新架构,它将发出相应的汇编代码,该代码将在新 CPU 上运行。因此,编译器不会产生相同的程序集,但在重建后会运行相同的源代码,这就是高级语言的思想。

当旧代码包含内联汇编或使用某些特定的 DSP 指令或库时会出现问题

【讨论】:

  • 到目前为止,使用用于 i.MX28 的编译器编译的代码似乎适用于不同的目标。但是,如果一个 CPU 具有单核而其他 CPU 具有多个核,情况会如何呢?它在哪里决定跨不同内核运行应用程序的哪一部分?或者是吗?谢谢
  • 核心利用率取决于所使用的操作系统。如果您的应用程序是准系统(没有操作系统,或者非常基本的),那么使用多个内核必须手动实现,否则所有代码都将在第一个内核上运行。
  • 那么在这种情况下,针对单核 CPU 的 Linux 代码与针对多核 CPU 的代码会有所不同吗?至少是内核的一些低级部分?
  • 涉及到 linux 内核选项,本身就是一个庞大的话题。内核可以(并且通常是)被构建来检测 CPU 内核的数量并采取相应的行动(即在不同的内核上运行不同的应用程序或驱动程序)。更高级别的应用程序可以使用 num_online_cpus() 函数来查找可用内核的数量。或许你应该在 linux 标签下提问,以引起更多有资格的它这个领域用户的注意。
  • 感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 2012-11-24
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多