相关规范:
问题:如何在FP计算之前以编程方式打开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指令集命令时仅获取额外的功率。
谢谢,
答案 0 :(得分:1)
如果某条指令试图访问协处理器(如FPU)并且它被禁用,您将收到使用故障(或在禁用使用故障时提升硬故障)。您可以检查使用故障状态寄存器中的NOCP位,以查看它是否是故障源。然后,您可以将Usage Fault用作陷阱来启用FPU并继续执行。
我的方法如下:
如果您使用RTOS,则需要查看其上下文切换的实现,因为如果它使用延迟堆叠(请参阅参考)而不是主动堆叠,它也可能尝试挂钩使用故障/硬故障。 / p>
如果需要考虑功率,需要考虑的一件事是需要浮点数。如果您可以将数字空间表示为32位值中的固定点,则使用定点数学而不是浮点可能会导致整体功耗降低,因为启用/禁用FPU或堆叠FPU寄存器不会产生任何开销上下文切换。权衡是固定点数学可能是每次操作更长的指令