2012-10-03 27 views
6

Estoy escribiendo un programa en C para el microcontrolador de la corteza del brazo SAM3N-M3. Cuando intento imprimir números flotantes, solo imprime 'f'. Ejemplo: printf("%f",43.12); imprime f solamente, no el 43.12.arm-none-eabi-gcc: Impresión del número de flotación usando printf

Pero la impresión con enteros funciona bien.

¿Cómo habilitar la impresión completa de flotadores? Sé que el compilador, de forma predeterminada, deshabilitó la impresión flotante para reducir el tamaño del código (es decir, que vincularon la versión reducida). También tenga en cuenta que no hay CFLAGS=-Dprintf=iprintf utilizado en el archivo MAKE.

Herramientas detalles:

  • ARM/GNU C Compiler: (crosstool-NG 1.13.1 - Atmel construcción: 13) 4.6.1
  • Por encima de la herramienta vienen con Atmel Studio 6.0.
+0

AFAIK este microcontrolador no tiene FPU. Por lo tanto, debe consultar la documentación del compilador para saber cómo habilitar la capacidad de impresión completa. Por ejemplo, en AVR era "-Wl, -u, vfprintf -lprintf_flt -lm". Otra forma, debe ponerse en contacto con su proveedor de herramientas, tal vez es un problema conocido. –

+0

Desafortunadamente, este -lprintf funciona solo para AVR-GCC, pero NO para ARM. – Prabhu

Respuesta

0

En los compiladores donde los flotantes están deshabilitados por defecto, es inusual que las bibliotecas predeterminadas puedan manejarlos. Mire a través de sus referencias y encontrará información sobre cómo recompilar las bibliotecas apropiadas con soporte flotante, o (más probable) dónde encontrar una versión que ya se haya creado con ella.

+0

Esto es exactamente donde estoy atrapado. Parece, necesito reemplazar libc por alguna otra biblioteca C. Parece que, por defecto, libc no tiene printf que pueda imprimir floe. ¿Alguna ayuda/sugerencia sobre cómo puedo hacerlo? – Prabhu

+0

Es la biblioteca que no admite flotadores de impresión derecha: ¿a gcc no le debería importar eso? Si está buscando una libc diferente, pruebe newlib, http://sourceware.org/newlib/ – auselen

1

Puede ser que su plataforma/libs no sea compatible con el especificador de formato %f para printf/sprintf. Como primera aproximación se puede rodar su propia printf de flotadores/dobles:

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

Gracias por la idea, pero ya lo implementé como una alternativa (usando modf, lround). Y quería printf adecuado para que el código sea más limpio. – Prabhu

6

Se puede tratar, añadiendo la opción más adelante en la configuración del vinculador

-lc -lrdimon -u _printf_float

y funcionó para mí en ARM-CORTEXM0

+0

También funciona en un ARM Cortex-M4. –

Cuestiones relacionadas