Assembly STM32F4处理器中的FPU
相关规范:Assembly STM32F4处理器中的FPU,assembly,floating-point,embedded,cpu-registers,stm32,Assembly,Floating Point,Embedded,Cpu Registers,Stm32,相关规范: 带FPv4 SP FPU(Cortex M4F)的STM32F407IG处理器 STM32F40G-EVAL开发板 IAR嵌入式工作台-ARM,v6.50 问题:如何在FP计算之前以编程方式打开FPU,并在完成FP计算后再次将其关闭 IAR EWARM提供在构建之前关闭/打开项目选项中FPU的能力 在SystemInit()(在main之前调用)中,执行以下代码: #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
- 带FPv4 SP FPU(Cortex M4F)的STM32F407IG处理器李>
- STM32F40G-EVAL开发板李>
- IAR嵌入式工作台-ARM,v6.50
- 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
#如果(uu-FPU-PRESENT==1)和(u-FPU-USED==1)
如果指令试图访问协处理器(如FPU),则SCB->CPACR |=((3UL您将获得一个使用错误(或如果禁用使用错误,则为升级硬错误)并且它被禁用。您可以检查使用故障状态寄存器中的NOCP位,以确定这是否是故障源。然后,您可以将使用故障用作陷阱,以启用FPU并恢复执行 我的做法如下:- 在IAR项目中启用FPU(think将允许IAR以FPU为目标)
- 在启动时启用FPU(您希望在配置故障处理程序之前启用FPU)
- 配置并启用故障处理程序后,禁用FPU以节省电源
- 故障(使用或硬故障)检查使用故障状态寄存器中的NOCP位
- 如果设置了NOCP,启用FPU,从故障返回
- 在后台应用程序中,在完成计算时禁用FPU或使用计时器定期禁用FPU
一个需要考虑的问题是功率是否需要浮点。如果你可以将你的数字空间表示为32位值的固定点,使用定点数学而不是浮点可能会导致整体功耗更低,因为在C上没有启用或禁用FPU或堆叠FPU寄存器的开销。上文本开关。折衷的办法是,每次操作的定点运算可能要长一些指令
参考资料:您应该能够通过数据表或通过测量设备的实际电流消耗来确定这一点。它是一个微控制器,因此可能会断电/时钟耗尽fpu以节省电源。您是否尝试过检查功耗?是的,我已经在不同的迭代中使用Q31和F32运行了CMSIS DSP测试。对于在FPU开启和FPU关闭的情况下,我重新构建、闪存和测量了每种格式的电流消耗。如果FPU实际正在使用(例如,在调用F32 DSP功能时),似乎只有额外的功耗。即使FPU开启,Q31版本也消耗了相同的电流。但是,仅从这些测试来看,我并不确信情况总是如此。我没有发现任何汇编程序命令试图关闭任何时钟。此外,当主时钟配置为板的高速外部时,没有/几乎没有额外的功耗跨MCU_VDD(处理器电源)测量对于FPU与Q31,FPU打开和关闭。但是,当主时钟配置为高速内部时,差异相当大。这已经很长时间了,但您仍然有结果吗?我一直在寻找类似的数据,但链接不再工作。谢谢。感谢您的想法。是的,使用FPU似乎需要更多瞬时功率消耗,尽管我发布了结果(在上面的评论中)指出对于我给定的用例来说,速度/功率的权衡是值得的,这样可以减少总的mAh。此外,除了在启动时屏蔽一个寄存器之外,在启用/禁用它时似乎没有任何开销。我使用的是裸机,所以我想我还不必担心上下文切换。Thx