用于MSP430微控制器支持的printf(printf support for MSP430 mi

2019-09-22 19:39发布

我升级完全测试C程序使用不同的C编译器的德州仪器(TI)MSP430微控制器,从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 = [全文| 最小| nofloat]允许你使用更小,功能的printf / sprintf的有限的,变的,做出这样的选择在构建时。

有效值为:

全面:支持所有格式说明。 这是默认的。

nofloat:不包括打印浮点值的支持。 支持除%F,%克,%G,%e和%E所有格式说明。

最小:支持整数,char或字符串值的无宽度或精度标志的印刷。 具体而言,只有%%,%d,%O,%C,%s和%×格式说明支持

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

我的问题是,我无法弄清楚1)如果VisualGDB必须设置为全printf的保障手段和2)如果是这样,这里并设置它。

任何和所有的意见和答案将不胜感激。

Answer 1:

我建议浮点既是不必要的,不明智的,全面的支持。 它是大量的代码来解决一个小问题; 并且没有浮点硬件,浮点运算通常最好在任何情况下的性能,代码空间和内存使用情况的原因可以避免的。

所以看来duration是在十二万五千分之一秒为单位,并且要输出的值的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 ;


Answer 2:

我和克利福同意,如果你不需要花车(或只需要其中用于打印),不使用它们。

但是,如果你的程序已经在使用花车广泛,你需要一种方法来打印出来,考虑改变一个公共领域的printf如从SQLite的一个 。



文章来源: printf support for MSP430 micro-controller