PRINTF support for Scientific Notation, "e" specifier in KSDK 2.0

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

PRINTF support for Scientific Notation, "e" specifier in KSDK 2.0

Jump to solution
954 Views
marks
Contributor IV

Hello,

How do you get the "e" specifier to work with PRINTF in KSDK 2.0? Using IAR. 

 

For example, this code:

#include "fsl_debug_console.h"

#define PRINTF DbgConsole_Printf

float a_float_number = 123456.78;
PRINTF(" a_float_number = %e\n", a_float_number);
PRINTF(" a_float_number = %f\n", a_float_number);

 

generates this output:

 

a_float_number = e
a_float_number = 123456.781250

 

The same code works as expected in a KDSK 1.3 project with lower case printf. This is the output with KDSK 1.3:

 

a_float_number = 1.234568e+05
a_float_number = 123456.781250

 

I put #include <stdio.h> in the file but this made no difference. 

 

Maybe it is just not supported. The e specifere is not listed in the Kinetis SDK v.2.0 API Reference Manual in section 12.1.2 Advanced Feature. However, the e specifier is mentioned when discussing the # flag "Used with e, E and f, it forces the written output to contain a decimal point even if no digits would follow."

 

If e is not supported maybe it could be added next rev.

 

Any help would be greatly appreciated!

 

Thanks,

Mark

Labels (1)
Tags (1)
0 Kudos
1 Solution
612 Views
egoodii
Senior Contributor III

ASSUMING you are using the IAR-library (and not an explicit printf handler routine in your project) what size 'printf formatter' have you got selected on 'project-options-general_options-library_options' tab --- tiny, small, large, or full?  Each 'bigger' version gives more runtime formatting options (at the expense of size and speed, of course).

I am not personally familiar with "fsl_debug_console.h", but if it were ME I would let the IAR tool-library support true 'printf', and do the proper tie from their output as __write() to 'whatever' console stream this is ending up on.

View solution in original post

0 Kudos
3 Replies
612 Views
DavidS
NXP Employee
NXP Employee

Hi Mark,

Looking into the source code for PRINTF the "%e" format is not supported.  The formats I see in fsl_debug_console.c are:

if ((c == 'd') || (c == 'i') || (c == 'f') || (c == 'F') || (c == 'x') || (c == 'X') || (c == 'o') || (c == 'b') || (c == 'p') || (c == 'u'))

I took KSDK_v2 hellow_world example for FRDM-K64F and made the following changes to create a workaround for you:

#include <stdio.h> //DES test for "e" format support in sprintf

#if 1 //DES 1=change output format, 0=default code
float a_float_number = 123456.78;
char my_string_buffer[60];

sprintf(my_string_buffer, "%e", a_float_number);
PRINTF(" a_float_number = %s\n\r", my_string_buffer);
PRINTF(" a_float_number = %e\n\r", a_float_number);
PRINTF(" a_float_number = %f\n\r", a_float_number);
#endif

Terminal Output:

a_float_number = 1.234568e+05      <-- This used sprintf then PRINTF %s to get desired result
a_float_number = e
a_float_number = 123456.781250

Source hellow_world.c attached.

Regards,

David 

612 Views
marks
Contributor IV

Hi David, Tried your method first (before Earls above) and it did not work first pass. Then changed project-options-general_options-library_options' tab --- to full and your solution, as well as the lower case printf, now work!

Thank you for the help!!

Best regards,

Mark

0 Kudos
613 Views
egoodii
Senior Contributor III

ASSUMING you are using the IAR-library (and not an explicit printf handler routine in your project) what size 'printf formatter' have you got selected on 'project-options-general_options-library_options' tab --- tiny, small, large, or full?  Each 'bigger' version gives more runtime formatting options (at the expense of size and speed, of course).

I am not personally familiar with "fsl_debug_console.h", but if it were ME I would let the IAR tool-library support true 'printf', and do the proper tie from their output as __write() to 'whatever' console stream this is ending up on.

0 Kudos