2

相关规格

  • STM32F407IG 处理器,带 FPv4-SP FPU (Cortex M4F);
  • STM32F40G-EVAL 开发板;
  • IAR 嵌入式工作台 - 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 指令集命令时消耗额外的功率。

    谢谢,

4

1 回答 1

1

如果一条指令尝试访问协处理器(如 FPU)并且它被禁用,您将获得使用错误(或如果使用错误被禁用,则升级为硬错误)。您可以检查使用故障状态寄存器中的 NOCP 位,看看这是否是故障源。然后,您可以使用 Usage Fault 作为陷阱来启用 FPU 并恢复执行。

我的方法如下:

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

如果您使用 RTOS,则需要查看它们的上下文切换实现,因为如果它使用延迟堆叠(参见参考资料)而不是主动堆叠,它也可能会尝试挂钩使用错误/硬错误。

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

参考:ARM AppNote 298

于 2013-09-24T15:05:44.717 回答