我正在为Cortex-M3开发程序。它没有浮点协处理器。标准C库可以模拟浮点运算,但由于它的大小,我不使用它。
是否有任何优秀且免费的c库,可以模拟浮点运算,针对ARM处理器? 目前,当我使用浮点运算符时,我有这样的链接错误:
undefined reference to `__adddf3'
undefined reference to `__subdf3'
undefined reference to `__divdf3'
undefined reference to `__extendsfdf2'
undefined reference to `__muldf3'
所以可能这样的库应该实现它们。
答案 0 :(得分:5)
使用固定点会不会更好(性能和尺寸方面)?对于简单的算术,直接或使用函数接口实现这一点很简单。如果你不能使用C ++,那么使用运算符重载可以使得几乎无缝的固定使用(与C函数接口相比没有运行时开销)。
如果你有更复杂的要求(触发,根等),this Dr. Dobb's Article中会出现一个好的定点库。
答案 1 :(得分:3)
如果你想使用内置的运算符执行浮动算术,那么你需要提供编译器期望的库例程,所以你最终得到的东西可能和你来的库一样大。用编译器。
您可能拥有编译器浮动支持例程的源代码,因此如果您想查看它们以查看是否可以改进它们,这可能是您的最佳机会。如果您认为无论出于何种原因这样做,您应该与编译器供应商讨论编译器对浮动支持例程的要求以及替换供应商库的最佳方法。
如果要绕过编译器的要求,则可能需要避免使用内置运算符并使用显式函数调用执行算术运算。我没有使用第三方浮点库例程的经验,所以不幸的是我不能指出一个可能的好选择。
答案 2 :(得分:1)
应该在编译器的运行时支持库中定义它们。这些名称看起来像libgcc(gcc的支持库)中的浮点函数,它非常小。您应该能够通过适当设置链接标记来提取这些功能。
答案 3 :(得分:1)
或许newlib在这里有用吗?设置工具链可能会很痛苦,但我已经成功地减少了嵌入式闪存的使用,而不是gcc及其标准库。
答案 4 :(得分:0)
任何值得盐的静态链接器都会删除未使用的调用。对于嵌入式编译器尤其如此。
答案 5 :(得分:0)
gcc具有所有这些功能,有gcc build voodoo(multilib,thumb,thumb2和soft float),你可以用它来自动显示它。我几年前放弃了,只是从gcc源码抓取文件将它们修剪成一个干净的源,然后将它们构建到我的项目中。几年前看了一两个商业编译器,然后查看newlib和gcc,至少在他们使用几乎相同的数学库的时候。我想说这是来自Sun.
答案 6 :(得分:0)
假设您使用gcc尝试使用-static-libgcc标志进行编译并检查最终的二进制大小。我不知道链接器是否会优化未使用的调用,但我认为它会。
答案 7 :(得分:0)
以下所有消息代表一些算术运算
未定义对__adddf3'
undefined reference to
__ subdf3'的引用
对__divdf3'
undefined reference to
__ extendsfdf2'的未定义引用
未定义对__muldf3的引用
因此,在链接时,如果您在两种不同的数据类型中进行某些伪操作,编译器将给出链接错误。例如: 浮点数x; 浮动y;
y = x * 0.45;
因此,如果您在链接时编译此代码,则会显示以下消息 未定义对__muldf3的引用
要解决此问题,请明确指定“ 0.45”以使其浮动 y = x * 0.45F;
在大多数情况下,使用c ++编译器编译c文件时会出现这种类型的链接错误。