2015-10-01 57 views
4

對於電源轉換應用程序,我們需要儘快在ARM Cortex-M4平臺上進行各種浮點計算。如何聲明ARMCC的全局浮點寄存器

我們正在用Keil uVision進行開發。

我們想聲明一些變量作爲寄存器變量,但是除了編譯器的錯誤之外什麼也得不到。看起來像這樣是非常有用的,因爲FPU有32個寄存器,我們可以通過將數據存儲在這些寄存器中而不是每次調用ISR時從RAM中重新加載來節省很多週期。

我們嘗試使用:

register float a1 __asm__("s0"); 

但收到一個錯誤:未知的寄存器名「S0」

這似乎很奇怪,因爲在調試器接口,我可以看到,編譯器使用S0寄存器。如果我將寄存器聲明爲「r0」,那麼就沒有錯誤,所以似乎在某處丟失了一些FPU支持,但不知道在哪裏。

我看彙編控制字符串和看起來像浮點支持:

--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; 

這也不能工作。

任何想法?

+0

你在使用armcc嗎? [ARMCC手冊](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472k/chr1359125006491.html)列出了可以命名的FPU寄存器,列表不會不包括sX或dX寄存器。 – Jeremy

+0

是的,我正在使用ARMCC,我看到了。我們也嘗試使用gcc編譯並得到錯誤:爲'a1'指定的寄存器不適合數據類型 –

+0

儘管如此,gcc.godbolt.org工作上的gcc版本(http://goo.gl/iRXWtr)。 – Jester

回答

0

需要由EABI,這裏詳述遵守:http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf

從細讀它,它似乎可以使用(如上面的評論中提及),S16-S31。其餘的不能保證被其他代碼保存。

如果您的應用程序處理允許,您可以通過僅編譯具有VFP支持的ISR來解決此問題,而不需要其他任何操作。這可以防止任何你不知道使用VFP寄存器並破壞它們的代碼。

+0

這是一個非常有趣的想法!我會嘗試。 –