首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为ARMCC声明全局浮点寄存器

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

Stack Overflow用户
提问于 2015-10-01 20:07:51
回答 1查看 383关注 0票数 5

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

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

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

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

我们尝试使用:

代码语言:javascript
复制
register float a1 __asm__("s0");

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

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

我看了看汇编器控制字符串,似乎支持浮点:

代码语言:javascript
复制
--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 

我们还尝试了:

代码语言:javascript
复制
__global_freg(1) float a1;

这也不管用。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2015-10-06 20:49:03

你需要遵守EABI,详细信息在这里:http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf

仔细阅读它,你似乎可以使用s16-s31 (正如你在上面的评论中提到的)。其余的代码不能保证被其他代码保留。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32887236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档