floating point printf / sprintf in 3.8.1

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

floating point printf / sprintf in 3.8.1

3,069 次查看
keithtang
Contributor IV

I used to be able to compile and run perfectly the following simple C code in MQX 3.8:

float f = (float)temperature / 32.0 * 0.125;

printf("temp: %3.1f\n", f);

 

However it hangs in MQX3.8.1, which I had to modify to work using the div_t data type:

div_t n = div(f,1);

printf("temp: %02d.%d\n", n.quot, n.rem);

 

The same happens to the sprintf() function.

 

I am not sure, but I have a feeling it has to do with the PSP_HAS_FPU being enabled?

 

Anyone can help?

4 回复数

1,336 次查看
keithtang
Contributor IV

To add to this, the regular operand '%' does not work with this compiler for some reasons.

0 项奖励
回复

1,336 次查看
keithtang
Contributor IV

I think I have solved this. Apparently the floating point support was set to "software floating point" by default. I changed it to hardware, recompiled, and it seems to work.

0 项奖励
回复

1,336 次查看
dmarks_ls
Senior Contributor II

keith tang wrote:

I think I have solved this. Apparently the floating point support was set to "software floating point" by default. I changed it to hardware, recompiled, and it seems to work.

Not the correct solution.  Unless you're using a 120/150MHz Kinetis or some other CPU with a hardware FPU, you shouldn't set it to hardware floating point.  The correct solution is to put

#define MQX_INCLUDE_FLOATING_POINT_IO   1

in user_config.h and recompile your PSP.  This will include floating point code in _io_printf() and _io_scanf().  I'm guessing that maybe they defaulted that to 0 starting in MQX 3.8.1 to keep default code size down.

1,336 次查看
keithtang
Contributor IV

Thanks for the reply, David.

The hardware does support hardware FPU. In the earlier version of MQX (3.7) the hardware FPU was not implemented, and therefore it was turned off. When I first updated to the latest MQX (3.8), I did not turn it on.

0 项奖励
回复