2012-10-03 8 views
6

Sto scrivendo un programma C per microcontrollore a corteccia da braccio cortex-M3 SAM3N. Quando provo a stampare numeri float, stampa solo "f". Esempio: printf("%f",43.12); stampe solo f, non 43.12.arm-none-eabi-gcc: numero float di stampa utilizzando printf

Ma la stampa con numeri interi funziona correttamente.

Come abilitare la stampa completa dei galleggianti? So che il compilatore, per impostazione predefinita, disabilita la stampa flottante per ridurre la dimensione del codice (ad esempio, hanno collegato la versione ridotta). Si noti inoltre che non è disponibile CFLAGS=-Dprintf=iprintf nel makefile.

Strumenti dettagli:

  • ARM/GNU C Compiler: (CrossTool-NG 1.13.1 - Atmel costruire: 13) 4.6.1
  • Sopra strumento venire con Atmel Studio 6.0.
+0

AFAIK questo microcontrollore non ha FPU. Quindi è necessario fare riferimento alla documentazione del compilatore su libc su come abilitare la piena capacità printf. Ad esempio su AVR era "-Wl, -u, vfprintf -lprintf_flt -lm". Un altro modo, dovresti contattare il tuo fornitore di strumenti, forse è un problema noto. –

+0

Sfortunatamente, questo -lprintf funziona solo per AVR-GCC, ma NON per ARM. – Prabhu

risposta

0

Nei compilatori in cui i float sono disabilitati per impostazione predefinita, è insolito che le librerie predefinite possano gestirli. Osserva i tuoi riferimenti e troverai informazioni su come ricompilare le librerie appropriate con il supporto float o (più probabilmente) dove trovare una versione che è già stata costruita con esso.

+0

Questo è esattamente il punto in cui sono bloccato. Sembra, ho bisogno di sostituire libc da qualche altra libreria C. Sembra che la libc predefinita non abbia printf in grado di stampare float. Qualche aiuto/suggerimento su come posso farcela? – Prabhu

+0

È la libreria che non supporta i float di stampa, a destra - gcc non dovrebbe preoccuparsene? Se stai cercando una diversa libc, prova newlib, http://sourceware.org/newlib/ – auselen

1

Può essere che la piattaforma/libs non supporti l'identificatore di formato %f per printf/sprintf. Come primo approccio si può rotolare il proprio printf per carri/doppie:

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

Grazie per l'idea, ma l'ho già implementata come soluzione (usando modf, lround). E volevo una stampa corretta in modo che il codice fosse più pulito. – Prabhu

6

Puoi provare, aggiungendo l'opzione in basso nelle impostazioni di linker

-lc -lrdimon -u _printf_float

e ha funzionato per me in ARM-CORTEXM0

+0

Funziona anche su un ARM Cortex-M4. –