Mik*_*ski 2 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);
Run Code Online (Sandbox Code Playgroud)
返回: 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)如果是这样,在哪里设置它.
任何和所有的评论和答案将不胜感激.
Cli*_*ord 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 ) ;
Run Code Online (Sandbox Code Playgroud)
如果你想要舍入到最接近的十分之一(而不是四舍五入),那么:
unsigned msec_x10 = ((duration * 20u) + 125 ) / 250u ;
Run Code Online (Sandbox Code Playgroud)