【发布时间】:2021-06-01 06:36:14
【问题描述】:
我想为我的嵌入式 C 代码创建一个版本,专门检查浮点运算是否不会被意外引入其中。我尝试将+nofp 添加到我的 [cortex-m3] 处理器架构中,但 ARM 的 GCC 不喜欢这样(可能是因为 cortex-m3 没有浮点单元)。我试过指定-mfpu=none,但这不是一个允许的选项。我已经尝试将-lm 离开链接器命令行,但链接器似乎太聪明了,不会被它愚弄,并且正在编译带有double 的代码并解析pow()。
这篇帖子:https://gcc.gnu.org/legacy-ml/gcc-help/2011-07/msg00093.html 从 2011 年开始暗示 GCC 没有这样的选择,因为没有人对它感兴趣,这让我感到惊讶,因为至少从嵌入式的角度来看,这似乎是一种常见的想要避免的事情意外的 C 库膨胀。
有谁知道用 GCC/newlib 做到这一点的方法,而我不必经历并从它选择的 C 库文件中手动破解内容?
【问题讨论】:
-
C 库膨胀并不是没有 FPU 的目标中软件浮点的最重要问题。性能和非确定性时序通常更为重要。但是,一般来说,您应该只提出问题而不提出您的理由。
-
在我的特殊情况下这是一个膨胀:我没有实时做任何事情,但在只有 128 KB 的代码空间中,我的核心代码约为 90 KB,其中大约一半是 C 库浮点版本,然后添加我的单元测试违反了 128 KB 的边界。我很希望他们回来:-)。
-
是浮点数学运算导致浮点格式化 I/O 支持膨胀吗?如果您不执行任何 fp 数学运算,则不应链接任何 fp 数学库代码。 Newlib 支持不带浮点的类似 stdio 的函数,例如
iprintf(),或者您可以在定义它的每个标头中使用#undef FLOATING_POINT重建库。但是,您无法从scanf()删除 fp 支持。 -
是的,我想是的:我正在使用
iprintf()、sniprintf()、siscanf()、viprintf(),已经检查了double和%f(以防万一)和math.h的出现,并删除了pow()的少数实例,但我无法降低闪存大小。如果我只能以某种方式在它上面打一个nofp,它会告诉我哪里出错了,我可以保持这种状态。想使用 ARM GCC 附带的 newlib 的内置版本来做到这一点,但也许这是不可能的。 -
我的回答中建议的技术将花费您更少的时间来编写您的问题。此外,地图文件会告诉你什么占用了空间,如果你怀疑它不支持浮点,我会说它。您还可以使用它来检查打印机等,并且比搜索代码库要简单得多。
标签: gcc floating-point arm embedded fpu