【问题标题】:FPU in STM32F4 ProcessorsSTM32F4 处理器中的 FPU
【发布时间】:2013-09-12 19:29:44
【问题描述】:

相关规格

  • STM32F407IG 处理器,带 FPv4-SP FPU (Cortex M4F);
  • STM32F40G-EVAL 开发板;
  • IAR 嵌入式工作台 - ARM,v6.50

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

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

    #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 指令集命令时消耗额外的功率。

    谢谢,

【问题讨论】:

  • 您应该能够从数据表中确定这一点,或者通过测量设备的实际电流消耗来确定。
  • 它是一个微控制器,因此它可能会断电/时钟使 fpu 饿死以节省电力。你试过检查耗电量吗?
  • 是的,我在不同的迭代中使用 Q31 和 F32 运行了 CMSIS DSP 测试。对于每种格式,我在 FPU 打开和 FPU 关闭的情况下重新构建、闪烁和测量电流消耗。如果实际使用 FPU(例如,在调用 F32 DSP 函数时),似乎只有额外的功耗。即使在 FPU 开启的情况下,Q31 构建的电流也相同。然而,仅凭这些测试,我并不相信情况总是如此。而且我没有捕捉到任何试图关闭任何 clk 的汇编程序命令。
  • 此外,当主 clk 配置为电路板的高速外部时,对于 FPU 与Q31,FPU 开启和关闭。但是,当主 clk 配置为高速内部时,差异是相当大的。
  • 已经很久了,你还有结果吗?我一直在寻找一些这样的数据,但链接不再有效。谢谢。

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


【解决方案1】:

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

我的方法如下:

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

如果您使用 RTOS,则需要查看它们的上下文切换实现,因为如果它使用惰性堆栈(请参阅参考资料)而不是主动堆栈,它也可能会尝试挂钩使用故障/硬故障。

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

参考:ARM AppNote 298

【讨论】:

  • 感谢您的意见。是的,使用 FPU 似乎确实需要更多的瞬时功率消耗,尽管我发布的结果(在上面的 cmets 中)表明速度/功率权衡对于我的给定用例来说是值得的,从而导致总体上更少的 mAh。此外,除了在启动时屏蔽一个寄存器之外,启用/禁用它似乎没有任何开销。我使用的是裸机,所以我想我还不必担心上下文切换。再次感谢
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 2015-08-26
  • 2022-08-11
  • 1970-01-01
相关资源
最近更新 更多