为 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 是否可行以及如何实现?

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)