|
SEGGER_RTT_vprintf函数中添加代码如下:
[C] 纯文本查看 复制代码 case 'f':
case 'F':
{
float fv = (float)va_arg(*pParamList, double); // Retrieves the input floating point value
v = (int)fv; // Take the positive integer part
_PrintInt(&BufferDesc, v, 10u, FieldWidth, FieldWidth, FormatFlags); // According to an integer
if ((NumDigits == 0) || (NumDigits > 6)) // 最高打印6位小数
NumDigits = 6;
_StoreChar(&BufferDesc, '.'); // Display decimal point
unsigned int powN = _pow(10, NumDigits);
fv = fv - v; // 取小数部分
fv = fv < 0 ? -fv : fv; // 取小数的绝对值
fv *= powN; // 根据显示精度取整
v = (int)(fv);
if (fv - v >= 0.5f) // 四舍五入
v += 1;
_PrintUnsigned(&BufferDesc, (unsigned)v, 10u, NumDigits, FieldWidth, FormatFlags | FORMAT_FLAG_LEFT_JUSTIFY | FORMAT_FLAG_PAD_ZERO); // Display three decimal places
}
break;
其中依赖的函数与数组:
[C] 纯文本查看 复制代码 static unsigned int _powBuf[] = {1, 10, 100, 1000, 10000, 100000, 1000000};
/*********************************************************************
*
* _pow
*/
static unsigned int _pow(unsigned char base, unsigned char index)
{
(void)base;
if (index <= 6)
return _powBuf[index];
else
return 1;
}
测试浮点的代码:
[C] 纯文本查看 复制代码 float data_float = 1234.12595f;
double data_double = 1234.12595f;
float short_pi = 3.14f;
float pi = 3.1415926535f;
SEGGER_RTT_printf(0, "data_float = %.0f\n", data_float);
SEGGER_RTT_printf(0, "data_float = %.1f\n", data_float);
SEGGER_RTT_printf(0, "data_float = %.2f\n", data_float);
SEGGER_RTT_printf(0, "data_float = %.3f\n", data_float);
SEGGER_RTT_printf(0, "data_float = %.4f\n", data_float);
SEGGER_RTT_printf(0, "data_float = %.5f\n", data_float);
SEGGER_RTT_printf(0, "data_float = %.6f\n", data_float);
SEGGER_RTT_printf(0, "data_float = %.7f\n", data_float);
SEGGER_RTT_printf(0, "-data_float = %f\n", -data_float);
SEGGER_RTT_printf(0, "-data_float = %03.5f\n", -data_float);
SEGGER_RTT_printf(0, "-data_float = %6.5lf\n", -data_float);
SEGGER_RTT_printf(0, "data_double = %.0lf\n", data_double);
SEGGER_RTT_printf(0, "data_double = %.1lf\n", data_double);
SEGGER_RTT_printf(0, "data_double = %.2lf\n", data_double);
SEGGER_RTT_printf(0, "data_double = %.3lf\n", data_double);
SEGGER_RTT_printf(0, "data_double = %.4lf\n", data_double);
SEGGER_RTT_printf(0, "data_double = %.5lf\n", data_double);
SEGGER_RTT_printf(0, "data_double = %.6lf\n", data_double);
SEGGER_RTT_printf(0, "data_double = %.7lf\n", data_double);
SEGGER_RTT_printf(0, "-data_double = %lf\n", -data_double);
SEGGER_RTT_printf(0, "-data_double = %03.5lf\n", -data_double);
SEGGER_RTT_printf(0, "-data_double = %6.5lf\n", -data_double);
SEGGER_RTT_printf(0, "pi = %f\n", short_pi);
SEGGER_RTT_printf(0, "pi = %f\n", pi);
打印效果:
对比电脑端C语言的效果:
占用的flash大小:
增加前:
增加后:
flash占用2964Bytes,约2.9KB。
存在的问题:
1. %.0f 处理的不好,正确逻辑应该不打印小数,这里打印了六位最高精度。
原因是想尽量减少修改,如果想正确处理这部分逻辑,需要判断"."的时候添加标志位。而且应该也没什么人打浮点数不打小数吧。
2. double 的精度不够。
可以看到float的精度符合预期,但是double的精度与float相同。比较奇怪的是电脑端的c语言也是一样。
最后吐槽一下CubeIDE:
本来没想在这里添加浮点支持的,但是神奇的CubelIDE使能了-u _printf_float后,flash神奇的增加了十几KB,各位有兴趣的话可以试试。
|
评分
-
查看全部评分
|