当CPU没有(或错误)浮点单元时,软件如何执行浮点运算?例如PIC,AVR和8051微控制器架构。
答案 0 :(得分:3)
"仿真" 是PIC,AVR和8051上下文中的错误术语。浮点仿真是指FPU硬件的仿真在具有FPU选项的架构上,但并非所有部件都包含FPU。这允许包含浮点指令的二进制文件在没有FPU的变量上运行。使用时,FPU仿真实现为无效指令异常处理程序;当遇到FPU指令但没有FPU时,会发生异常,处理程序读取指令值并在软件中执行操作。
但是,您列出的所有体系结构都没有定义FPU或FPU指令,因此无需模拟。相反,在这些情况下,浮点运算完全用软件实现,编译器生成代码以根据需要调用浮点例程。例如,表达式x = y * z ;
将生成与函数调用x = _fmul( y, z ) ;
等效的代码。实际上,如果从包含浮点运算的构建中查看链接器映射输出,您可能会看到常规符号名称,例如_fmul
,_fdiv
等 - 这些函数是内在的到编译器。
答案 1 :(得分:0)
浮点数只是基数2的科学记数法。尾数和指数都是整数,softfloat库会将浮动部分操作分解为影响尾数和指数的操作,这些操作可以使用CPU整数支持。
例如,(x 2 n )*(y 2 m )= x * y 2 n + m 。
通常还需要规范化步骤来保持浮点表示规范,但可以在规范化之前执行多个操作。此外,由于IEEE-754存储了具有偏差的指数,因此必须予以考虑。
答案 2 :(得分:-1)
浮点不是“模拟”的。通常,它们按照IEEE754中的说明进行存储。
固定点是一种不同的实现类型。数字2,54可以在固定点或浮点上实现。
软件实施VS FPU(浮点单元)
一些像ARM cortex M4 F 这样的现代MCU有一个浮点单元,可以在硬件中点浮点运算(如乘法,除法,加法),比软件更快。
在AVR,PIC和8051等8位MCU中,操作仅在软件中完成(分区可能需要数百次操作)。它必须分别将尾数(分数)部分和指数部分加上所有特殊情况(例如NaN)。编译器通常有许多例程来威胁同一操作(例如除法),并将根据优化(大小/速度)和其他参数进行选择(例如,如果它知道数字总是正数...)
答案 3 :(得分:-1)
有一个another SO question涵盖了浮点数所需的C / C ++标准。因此,严格地说,float可以表示编译器喜欢的任何形式。但实际上,如果浮点实现与IEEE754显着不同,那么您可以预期由习惯IEEE754的程序引起的许多错误。并且编译器必须是程序员友好的,不应该使用麻烦来利用未指定的标准位置。因此,在大多数情况下,浮点数将以相同的方式表示,因为它们在所有其他体系结构(包括x86)上表示。定点运算太不同了。
如果AVR和PIC的编译器知道没有可用的fpu,那么它会将每个操作转换为CPU支持的一堆命令。它必须将两个操作数归一化为一个公共指数,然后像对整数一样对尾数进行操作,然后调整指数。这是很多操作,因此模拟浮点很慢。除此之外,如果您针对大小进行优化,则每个浮点运算都可能成为函数调用。
在ARM拱门上,事情可能很奇怪。有FPU和没有ARM的ARM。而且您可能希望拥有可在两者上运行的通用应用程序。在这种情况下,有一个棘手(和缓慢)的方案。应用程序使用FPU命令。如果你的CPU没有FPU,那么这样的命令将触发一个中断,在它中OS将模拟指令,清除错误位并将控制返回给应用程序。但该方案发生得非常缓慢,并不常用。