2

我正在使用不同的 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 之外的所有格式说明符。

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

我需要对 printf 的全面支持。我知道我的产品上的 MSP430 将支持这一点,因为这个 C 程序已经使用了多年。

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

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

4

2 回答 2

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 ;
于 2012-09-22T16:43:22.903 回答
4

我同意 Clifford 的观点,如果您不需要花车(或只需要它们用于打印),请不要使用它们。

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

于 2012-09-22T17:13:44.467 回答