7
votes

I am writing a C program for SAM3N arm cortex-M3 microcontroller. When I try to print float numbers, it just prints 'f'. Example: printf("%f",43.12); prints f only, not the 43.12.

But printing with integers works fine.

How to enable full printing of floats? I know that the compiler, by default, disabled float printing to reduce code size (i.e. seems, they linked cut-down version). Also please note that, there is no CFLAGS=-Dprintf=iprintf used in makefile.

Tools details:

  • ARM/GNU C Compiler : (crosstool-NG 1.13.1 - Atmel build: 13) 4.6.1
  • Above tool come with Atmel studio 6.0.
3
AFAIK this microcontroller is has no FPU. So you need to refer to compiler documentation to libc how to enable full printf capability. For example on AVR it was "-Wl,-u,vfprintf -lprintf_flt -lm". Another way, you should contact your tools vendor perhaps it is known issue.Sergei Nikulov
Unfortunately, this -lprintf works only for AVR-GCC, but NOT for ARM.Prabhu

3 Answers

9
votes

Can you try, adding the below option in linker settings

-lc -lrdimon -u _printf_float

and it worked for me in ARM-CORTEXM0

4
votes

It can be so that your platform/libs does not support %f format specifier for printf/sprintf. As a first approach you can roll your own printf for floats/doubles:

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
votes

In compilers where floats are disabled by default, it is unusual that the default libraries can handle them. Look through your references and you will find information on how to recompile the appropriate libraries with float support, or (more likely) where to find a version that has already been built with it.