STM32F4处理器中的FPU

时间:2013-09-12 19:29:45

标签: assembly floating-point embedded cpu-registers stm32

相关规范

  • STM32F407IG处理器,带FPv4-SP FPU(Cortex M4F);
  • STM32F40G-EVAL开发板;
  • IAR Embedded Workbench - ARM,v6.50

问题:如何在FP计算之前以编程方式打开FPU,并在完成后再将其关闭?

  • IAR EWARM提供在构建
  • 之前关闭/打开项目选项中的FPU的功能
  • SystemInit()之前调用的main中,执行以下代码:

    #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)    
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));    /* set CP10 and CP11 Full Access */
    #endif
    

    请注意,这会将CPACR位[23:20]设置为1.这是必需的,否则将在下一个FPU汇编器指令上调用HardFault IRQ。 但禁用此功能会产生任何其他影响,例如降低功耗等,或者此注册只是警告协处理器(FPU)?

  • 如果没有进一步的含义,那么可能通过CPACR“关闭它”并没有完成任何事情,这表明FPU在执行FPU指令集命令时仅获取额外的功率。

    谢谢,

1 个答案:

答案 0 :(得分:1)

如果某条指令试图访问协处理器(如FPU)并且它被禁用,您将收到使用故障(或在禁用使用故障时提升硬故障)。您可以检查使用故障状态寄存器中的NOCP位,以查看它是否是故障源。然后,您可以将Usage Fault用作陷阱来启用FPU并继续执行。

我的方法如下:

  • 在IAR项目中启用FPU(认为将允许IAR以FPU为目标)
  • 启动时启用FPU(您希望在配置故障处理程序之前启用它)
  • 配置并启用故障处理程序后,禁用FPU以节省电量。
  • 故障(使用或硬故障)检查使用故障状态寄存器中的NOCP位。
  • 如果设置了NOCP,则启用FPU,从故障返回。
  • 在后台应用程序中,在完成计算时禁用FPU或使用计时器定期禁用它。

如果您使用RTOS,则需要查看其上下文切换的实现,因为如果它使用延迟堆叠(请参阅参考)而不是主动堆叠,它也可能尝试挂钩使用故障/硬故障。 / p>

如果需要考虑功率,需要考虑的一件事是需要浮点数。如果您可以将数字空间表示为32位值中的固定点,则使用定点数学而不是浮点可能会导致整体功耗降低,因为启用/禁用FPU或堆叠FPU寄存器不会产生任何开销上下文切换。权衡是固定点数学可能是每次操作更长的指令

参考:ARM AppNote 298