2012-10-03 15 views
6

SAM3N arm cortex-M3 mikro denetleyicisi için bir C programı yazıyorum. Kayan sayıları yazdırmaya çalıştığımda, sadece 'f' yazdırır. Örnek: printf("%f",43.12); baskılar f değil, yalnızca 43.12.arm-none-eabi-gcc: printf kullanarak yazdırma float numarası

Ama tamsayılar yazdırmaya çalışıyor.

Nasıl şamandıraların tam yazdırmayı etkinleştirmek için? Derleyicinin, varsayılan olarak, kod boyutunu azaltmak için float yazdırmayı devre dışı bıraktığını biliyorum (yani, kesilmiş versiyona bağlılar). Ayrıca, makefile'de kullanılan CFLAGS=-Dprintf=iprintf olduğunu unutmayın.

Araçlar ayrıntıları:

  • ARM/GNU C derleyicisi: (crosstool-NG 1.13.1 - Atmel inşa: 13) Atmel stüdyosu 6.0 ile gelen aracı Üstü 4.6.1
  • .
+0

afaik çalıştı. Bu nedenle, tam baskı yeteneğini nasıl etkinleştireceğinizi öğrenmek için derleyici belgelerine başvurmanız gerekir. Örneğin AVR'de "-Wl, -u, vfprintf -lprintf_flt -lm" idi. Başka bir şekilde, araç satıcınıza başvurmalısınız, belki de bilinen bir konudur. –

+0

Ne yazık ki, bu -lprintf sadece AVR-GCC için çalışır, ancak ARM için DEĞİL. – Prabhu

cevap

0

Floatların varsayılan olarak devre dışı bırakıldığı derleyicilerde, varsayılan kitaplıkların bunları işleyebilmesi alışılmadık bir durumdur. Referanslarınıza bakın ve uygun kütüphaneleri float desteğiyle yeniden derleme veya (daha büyük olasılıkla) halihazırda oluşturulmuş bir sürümü nerede bulacağınız hakkında bilgi edineceksiniz.

+0

Tam olarak nerede takılıyorum. Görünüşe göre, başka bir C kütüphanesi tarafından libc'yi değiştirmem gerekiyor. Görünüşe göre, varsayılan libc, şamandıraları basabilen printf içermiyor. Nasıl yardım edebilirim? – Prabhu

+0

Baskı şamandıralarını doğru desteklemeyen kütüphane doğru - gcc bunun umurunda olmamalı mı? Farklı bir libc arıyorsanız, newlib'i deneyin, http://sourceware.org/newlib/ – auselen

1

Platform/lib'leriniz printf/sprintf için %f biçim belirtecini desteklemeyecek şekilde olabilir. bir ilk yaklaşım olarak size yüzer/çiftlerde için kendi printf dönebilirsiniz:

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

Fikir için teşekkürler, ancak bunu zaten bir çalışma olarak uyguladım (modf, lround kullanarak). Ve düzgün printf istedim, böylece kod daha temiz olacak. – Prabhu

6

sen deneyebilir miyim, bağlayıcı ayarlarında aşağıdaki seçeneği ekleyerek

-lc -lrdimon -u _printf_float

ve o ARM-CORTEXM0 benim için bu mikrodenetleyici hiçbir FPU sahiptir

+0

Bir ARM Cortex-M4 üzerinde de çalışır. –