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