2012-10-03 132 views
6

我正在爲SAM3N arm cortex-M3微控制器編寫一個C程序。當我嘗試打印浮點數時,它只打印'f'。 例如:printf("%f",43.12);僅打印f,而不是43.12arm-none-eabi-gcc:使用printf打印浮點數

但用整數打印工作正常。

如何啓用浮動的完整打印?我知道,默認情況下,編譯器禁用浮動打印以減少代碼大小(即,看起來,它們鏈接了裁減版本)。另請注意,makefile中沒有使用CFLAGS=-Dprintf=iprintf

工具細節:

  • ARM/GNU C編譯器(的crosstool-NG 1.13.1 - 愛特梅爾構建:13)4.6.1
  • 以上工具來與Atmel Studio 6.0中。
+0

AFAIK這個微控制器沒有FPU。因此,您需要參考編譯器文檔以瞭解如何啓用完整的printf功能。例如在AVR上,它是「-Wl,-u,vfprintf -lprintf_flt -lm」。另一種方法,你應該聯繫你的工具供應商或許是已知的問題。 –

+0

不幸的是,這個-lprintf僅適用於AVR-GCC,但不適用於ARM。 – Prabhu

回答

0

在默認情況下停用浮動的編譯器中,默認庫可以處理它們是很常見的。仔細查看你的參考資料,你會發現有關如何用float支持重新編譯適當的庫的信息,或者(更可能)找到已經用它構建的版本的位置。

+0

這正是我卡住的地方。似乎,我需要用其他C庫替換libc。似乎,默認的libc沒有可以printf浮動的printf。任何幫助/建議om我如何可以做到這一點? – Prabhu

+0

這是不支持printfing浮動的庫 - gcc不應該在乎這個嗎?如果你正在尋找一個不同的libc,請嘗試newlib,http://sourceware.org/newlib/ – auselen

1

它可能會使您的平臺/庫不支持格式說明符printf/sprintf。 作爲第一個方法,你可以滾你自己的printf進行花車/雙打:

void printDouble(double v, int decimalDigits) 
{ 
    int i = 1; 
    int intPart, fractPart; 
    for (;decimalDigits!=0; i*=10, decimalDigits--); 
    intPart = (int)v; 
    fractPart = (int)((v-(double)(int)v)*i); 
    if(fractPart < 0) fractPart *= -1; 
    printf("%i.%i", intPart, fractPart); 
} 
+0

感謝您的想法,但我已經實現了這個作爲解決方法(使用modf,lround)。我想要正確的printf,以便代碼更清晰。 – Prabhu

6

你可以試試,在添加鏈接器設置下面的選項

-lc -lrdimon -u _printf_float

和它在我的ARM-CORTEXM0

+0

也適用於ARM Cortex-M4。 –