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

Dav*_*lin 5 c floating-point assembly arm cortex-m

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

我们正在与Keil uVision合作开发.

我们想将一些变量声明为寄存器变量,但只能得到编译器的错误.

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

我们尝试使用:

register float a1 __asm__("s0");
Run Code Online (Sandbox Code Playgroud)

但收到错误:未知的注册名称"s0"

这看起来很奇怪,因为在调试器接口中我可以看到编译器正在使用s0寄存器.如果我将寄存器声明为"r0",则没有错误,所以似乎某些地方缺少FPU支持,但不确定在哪里.

我看看Assembler控件字符串,似乎支持浮点:

--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 
Run Code Online (Sandbox Code Playgroud)

我们还尝试过:

__global_freg(1) float a1;
Run Code Online (Sandbox Code Playgroud)

这也不起作用.

有任何想法吗?

Rus*_*ltz 1

您需要遵守 EABI,详细信息如下: http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf

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

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