AVR 如何执行浮点运算

How does an AVR perform floating point Arithmetic

我正在尝试在没有 FPU 的 CPU 上实现对 doublefloat 的支持以及相应的基本算法。

我知道在所有 AVR ATmega controllers 上都是可能的。 ATmega 也没有 FPU。那么问题来了:它是如何工作的?如果对文献或带有解释和示例的链接有任何建议?

在最好的情况下,我会为这样的代码提供支持:

double twice ( double x )
{
  return x*x;
}

非常感谢, 亚历克斯

这个 post 您可能会感兴趣:Floating point calculations in a processor with no FPU

如前所述:

Your compiler may provide support, or you may need to roll your own. There are freely-available implementations, too.

如果是用于 ATmega,您可能不必自己编写任何东西。所有已经可用的库可能已经优化得比你自己做的要远得多。如果您需要更高的性能,您可以考虑将浮点数转换为定点数。无论如何你应该考虑这一点。如果你能在定点完成工作,你应该远离浮点。

Avr 使用 AVR Libc,您可以下载并检查。

有一个数学图书馆,但这不是您要找的。其中包含 math.h.

中定义的标准函数

相反,您需要执行乘法之类的函数。这些也在 Libc 中,在 fplib 下并用汇编语言编写。但是用户不会直接调用它们。相反,当编译器遇到涉及浮点数的乘法时,编译器会选择正确的函数插入。

您可以浏览 AVR fplib 以了解要做什么,但您将不得不为您的处理器编写自己的汇编代码或位运算代码。

您需要找出您的处理器和语言使用的浮点标准。 IEEE,也许?你还需要知道系统是小端还是大端。

我假设您的系统还没有 C 编译器。否则,所有的浮点运算都已经实现了。 “twice()”函数(实际上是 square())可以正常工作。

以下是 AVR 相关链接,其中包含实现软替身的解释和示例:

  1. 你会找到一个双精度浮点库 here
  2. 另一个可以在上一条消息中找到here.
  3. Double 非常慢,所以如果担心速度,您可以选择定点数学。请阅读我在 this thread:
  4. 中的消息