gpt4 book ai didi

c - 如何为ARMCC声明全局浮点寄存器

转载 作者:太空狗 更新时间:2023-10-29 15:07:58 24 4
gpt4 key购买 nike

对于电源转换应用,我们需要在 ARM Cortex-M4 平台上尽快进行各种浮点计算。

我们正在使用 Keil uVision 进行开发。

我们想将一些变量声明为寄存器变量,但除了编译器的错误之外什么也得不到。

这似乎是非常有用的东西,因为 FPU 有 32 个寄存器,我们可以通过将数据存储在这些寄存器中来节省大量周期,而不是每次调用 ISR 时都从 RAM 中重新加载。

我们尝试使用:

register float a1 __asm__("s0");

但收到错误:未知的寄存器名称“s0”

这看起来很奇怪,因为在调试器界面中我可以看到编译器正在使用 s0 寄存器。如果我改为将寄存器声明为“r0”,则没有错误,因此似乎某处缺少 FPU 支持,但不确定在哪里。

我查看了汇编程序控制字符串,似乎支持 float :

--cpu Cortex-M4.fp --pd "__EVAL SETA 1" -g --apcs=interwork 
-I D:\my_project
-I D:\Keil_v5\ARM\PACK\ARM\CMSIS\4.4.0\CMSIS\Include

我们也试过:

__global_freg(1) float a1;

这也没有用。

有什么想法吗?

最佳答案

您需要遵守 EABI,详见此处:http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf

仔细阅读后,您似乎可以使用(如上面评论中所述)s16-s31。其余部分不保证会被其他代码保留。

如果您的应用程序处理允许,您可以通过只编译带有 VFP 支持的 ISR 而其他所有不支持的 ISR 来解决这个问题。这将防止您不知道的任何代码使用 VFP 寄存器并破坏它们。

关于c - 如何为ARMCC声明全局浮点寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32887236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com