【问题标题】:Compiling for Cortex M3 bare metal为 Cortex M3 裸机编译
【发布时间】:2014-02-11 19:44:24
【问题描述】:

是否有指南描述了如何让 LLVM 为 Cortex-M3 发出二进制文件,我可以将其按摩到运行的裸机中?我花了相当多的时间在 Windows 和 Ubuntu 上使用 LLVM,但无济于事。我可以得到类似 ARM 的程序集。我可以获取位代码,但我真正需要的是 ELF、DWARF、霍比特人、甘道夫或任何其他具有文件格式规范的指环王生物。任何和所有的帮助表示赞赏!我正在 Ubuntu、Windows 和/或 OS X 上使用 CLANG 编译 LLVM 3.4。

【问题讨论】:

  • 您需要 LLVM 吗?因为如果你不这样做,你可以只使用 ARM 支持的这个 GCC 工具链:launchpad.net/gcc-arm-embedded
  • +1 给大卫;在嵌入式开发中,您通常从支持的工具链中进行选择。
  • 你需要 ELF... DWARF 是为了你的调试信息,而不是代码本身。
  • github.com/dwelch67 我有很多 llvm 裸机交叉编译器构建的示例。 LLVM 本质上始终是一个交叉编译器,但汇编器/链接器阶段是特定于主机的。所以我使用 binutils (gnu) 作为最终的链接状态。从 3.2 或 3.3 开始,llc 可以生成一个对象,因此您不必使用 llc 进行组装,然后进行气体组装,您可以直接前往对象然后链接。

标签: c++11 llvm native cortex-m3


【解决方案1】:

可以使用从http://llvm.org/builds 提取的clang++,以https://launchpad.net/gcc-arm-embedded 为基础,至少在编译步骤中是这样。

需要的额外参数是硬编码到 gcc 中的包含路径和某些 arm-none-eabi 默认值:

--target=arm-none-eabi -fshort-enums  -isystem "../arm-none-eabi/include/c++/5.2.1" [-isystem ...]

【讨论】:

    【解决方案2】:

    我创建了一个固件框架——PolyMCU https://github.com/labapart/polymcu——它基于支持 GCC 和 LLVM 的 CMake。因为它基于 CMake,您可以在 Linux/Windows/MacOS 上构建您的固件。 它还使用 Newlib 并支持 Baremetal/CMSIS RTOS (RTX)/FreeRTOS。

    使用 PolyMCU 的好处是该框架不会在 libc 和 MCU 供应商的 SDK 之上添加任何软件层。 另一个好处是您可以轻松切换工具链。我使用此功能通过许多编译器测试我的代码来获得更多反馈。

    我还写了一篇博客,比较了 ARM Cortex-M 上的 GCC 和 LLVM 构建大小:http://labapart.com/blogs/3-the-importance-of-the-toolchain-version-in-embedded-space 有趣的结果,Clang 生成的代码并不比 Cortex-M 上的 GCC 大多少...

    【讨论】:

    • 对我来说,clang 实际上生成的代码比 gcc 更小。
    【解决方案3】:

    我所知道的最好的指南在这里:http://wiki.osdev.org/LLVM_Cross-Compiler。它主要是关于构建 LLVM 交叉编译器,但它确实显示了“使用”部分。但是,该部分专门展示了一个 Cortex-A 处理器的示例,但您应该能够大致了解。

    我创建了一个简单的 clang 裸机 Cortex-M3“hello world”程序,但我面前没有它。 IIRC,我需要的唯一选项是 -march=thumb -mcpu=cortex-m3,只要 LLVM 编译器后端是使用 ARM thumb 后端支持构建的(同样,请参阅 http://wiki.osdev.org/LLVM_Cross-Compiler)。但是,我确实需要在此处 (http://launchpad.net/gcc-arm-embedded) 与 GCC 工具链中的 arm-none-eabi-ld 链接,我相信这就是您获取 ELF 二进制文件的方法。

    我已经转向 D 编程语言,我在这里有一个使用 LDC(LLVM D 编译器)的简单示例 (http://wiki.dlang.org/Extremely_minimal_semihosted_%22Hello_World%22)

    所以,我相信用 LLVM 编译裸机 ARM Cortex-M3 软件是可以做到的,但似乎没有多少人尝试过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 2010-12-02
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多