FPU

smallcracker 2021-01-30 00:00:00
Categories: Tags:

FPU

简介

FPU指的是浮点运算单元。默认情况下,我们不能使用浮点数,只有使能了FPU才能浮点数。如果不打开浮点运算单元就用浮点数的话,单片机就会产生一个NOCP错误。(RTOS可以利用这个特性判断哪一项任务使用了浮点运算单元,以此只在涉及到这些任务的task switch中执行FPU。)

当处理器执行一条中断命令时,有三种办法处理浮点运算内容:1.不去算 2.总是存下来浮点运算内容 3.对浮点运算内容执行一个 lazy save/restore 。

如果不去算的话,中断栈帧就和没有浮点运算单元的Cortex-M 处理器的就一样了。(当那些主程序用到浮点运算,中断函数不用浮点运算时,这种方法会特别好用)(没看出来)(我们像这样不存储浮点运算内容的话,就能减少对栈的使用,降低中断延迟)

除此以外,我们还能把浮点运算内容存储总是到栈里面。这种方法允许在中断函数里面使用浮点运算,代价是栈的使用会增加,中断延迟会增加(因为我们还要向栈里面多写一些东西)。这种方法还有一个优点,那就是在中断函数的栈帧内一直存着浮点运算单元。

对浮点运算内容的默认处理是执行一个lazy save/restore。当我们开始一个中断时,在栈里面我们为浮点运算内容预留出一部分空间(留着一会往里面写内容)。这种方法能降低中断的延迟,因为一会我们就只用去声明整数了。然后如果要执行一个浮点运算的话,我们就把浮点运算内容写到这个浮点运算指令前面。最终,当从中断返回的时候,浮点运算内容就会留在栈里面,直到它被复写。这种方法既保证了中断的快速反应,用能让我们在中断函数 里面使用浮点运算指令。

FPU在异常出现时会产生一个中断(比如说向下、向上溢出、除以零、无效操作,非法输入等情况下)。我们可以利用这些中断搞事情。

FPU也是可以被改造的。我们可以改造半精度浮点数值得格式,对无穷大数的处理,清零模式(这会牺牲完整的IEEE规范来提升速度)以及结果的循环模式。

头文件是driverlib/fpu.h