为 Cortex M3、M4、M23 和 M33

问题描述

我目前正在研究一个相当通用的通信堆栈。它在一端获取字节,解析数据包并调用回调。 我想在静态库(即 libcommstack.a)中使用此堆栈。

该库面向嵌入式 ARM Cortex-M 设备。目前我们已经指定至少应该使用 Cortex-M3(但它也应该适用于 M4 或 M33)。

现在我正在将它集成到另一个应用程序中,以验证是否可以进行链接。未来的想法是,我们会将这个 .a 文件发送给客户,以便他们可以围绕它构建应用程序,而无需直接访问我们的资源(以封装我们的 IP)。

我们使用 GCC ARM v7.2.1 来编译库和链接到它的应用程序。 我尝试与它集成的应用程序是为带有 -mfloat-abi=hard -mfpu-fpv6-sp-d16 的 Cortex M33 编译的。

该库的代码使用任何浮点数,而是使用 -march=archv7-m 编译(两者都有 -mthumb 标志)。

链接似乎一切顺利,直到我实际上从库中调用一个函数。那时链接器开始抱怨:

application.elf uses VFP register arguments,libcommstack.a(somefile.c.obj) does not
Failed to merge target specific data of file libcommstack.a(somefile.c.obj)

因为我没有在库中使用浮点数,而且我不知道(预先)目标应用程序是否有 FPU(甚至使用浮点数),所以我不知道如何处理这个问题. 我认为会有两种方法

  1. 使用所有微控制器都能理解的指令集编译单个版本的库。我希望 ARMv7 也是这种情况(尽管我还不能 100% 确信 M23/M33 也支持这一点)。
  2. 根据不同的架构、FPU 等为不同的风格编译很多不同的库。

如您所想,我更愿意保持简单并选择选项 1,但我不确定如何“说服”链接器将这两个链接起来(或者也许如何说服编译器不关心lib 的浮点数)。

有谁知道选项 1 是否可行以及如何实现?

如果不可行,要记住哪些变量来确定不同的构建风格?

解决方法

有谁知道选项1是否可行

嗯,可能可行。

如何实现?

获取您想要支持的所有处理器并确定所有这些处理器上可用的指令集。然后针对该指令集进行编译。

但是,请不要这样做,这是一种解决方法。

如果不可行,要记住哪些变量来确定不同的构建风格?

Gcc 有类似“multilib 配置文件”的东西。请参阅 arm-none-eabi-gcc --print-multi-lib 输出。如果您安装了 newlib,您可以转到 /usr/arm-none-eabi/lib/thumb/ 并查看那里的目录 - newlib 为每个配置文件编译并为其安装单独的库,并根据配置选择不同的库。为这些配置文件中的每一个进行编译,并通过将库放入适当的 /usr/arm-none-eabi/lib/proper/directory/here 来打包您的库,编译器将自行选择它们(库搜索路径请参见 gcc -v 输出)。例如在它发生的地方搜索 newlib 源,找不到它。 (Here's my example)。以cmake作为后端为例,您可以按如下方式编译和安装:

arm-none-eabi-gcc --print-multi-lib |
while IFS=';' read -r dir opts; do
     cmake -B builddir CMAKE_C_FLAGS="$opts" CMAKE_INSTALL_LIBDIR="$dir"
     cmake --build builddir
     cmake --install builddir --prefix "/usr/arm-none-eabi/"
done

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...