printf支持MSP430微控制器

时间:2012-09-22 15:54:51

标签: c embedded printf msp430

我正在使用不同的C编译器升级经过全面测试的德州仪器(TI)MSP430微控制器C程序,从Quadravox,AQ430开发工具改为VisualGDB C编译器。

程序使用VisualGDB编译零错误和零警告。中断服务程序,定时器,UART控制等等都似乎正在工作。但是,sprintf的某些用途不起作用。例如:

unsigned int duration;
float msec;

msec = (float)duration;

msec = msec / 125.0;

sprintf(glb_response,"break: %3.1f msec",msec);

返回:break: %3.1f msec

这是预期的:break: 12.5 msec

我已经了解了以下内容(来自维基百科):

  

编译器选项--printf_support = [full |最小| nofloat]允许   您可以使用较小的,功能有限的printf / sprintf变体,以及   在构建时做出选择。

     

有效值为:

     

full:支持所有格式说明符。这是默认值。

     

nofloat:不包括对打印浮点值的支持。支持   除%f,%g,%G,%e和%E之外的所有格式说明符。

     

minimal:支持打印整数,字符或字符串值   没有宽度或精度标志。具体来说,只有%%,%d,%o,   支持%c,%s和%x格式说明符

我需要对printf的全力支持。我知道我的产品上的MSP430将支持这一点,因为这个C程序已服务多年。

我的问题是我无法弄清楚1)VisualGDB是否有办法将printf支持设置为full; 2)如果是这样,在哪里设置它。

任何和所有评论和答案将不胜感激。

2 个答案:

答案 0 :(得分:11)

我建议完全支持浮点是不必要的,也是不明智的。解决一个小问题需要大量的代码;在没有浮点硬件的情况下,出于性能,代码空间和内存使用的原因,通常最好避免使用浮点运算。

因此,duration似乎以1/125000秒为单位,并且您希望输出一个精度为0.1毫秒的值。所以:

unsigned msec_x10 = duration * 10u / 125u ;

sprintf( glb_response, 
         "break: %u.%u msec", 
         msec_x10 / 10,  
         msec_x10 % 10 ) ;

如果你想要舍入到最接近的十分之一(而不是四舍五入),那么:

unsigned msec_x10 = ((duration * 20u) + 125 ) / 250u ;

答案 1 :(得分:4)

我同意Clifford的说法,如果你不需要花车(或只需要它们进行印刷),请不要使用它们。

但是,如果您的程序已经广泛使用了浮点数,并且您需要一种方法来打印它们,请考虑调整公共域printf,例如the one from SQLite