snprintf在微控制器上打印giberish,但在其他环境中也很好

时间:2018-05-06 20:13:30

标签: c arm

我正在尝试简单地将双精度转换为C中的字符串。


char printable[9];

snprintf(printable, 9, "%f", 30.356145);

应将printable设置为“30.35614”。当我运行此代码on an online c compiler时,它会正确输出。当我在我的微控制器上输出它时,打印等于这个废话:

"\000\033\000\000\001\000\000\000\024"
  1. 为什么我得到这个垃圾数据?
  2. 这是什么垃圾数据?
  3. 如何让snprintf正常运行?

1 个答案:

答案 0 :(得分:5)

从输出中可以看出snprintf立即终止了带有\0字符的字符串,其余部分保持不变。由于数组是在堆栈上分配的而不是零初始化的,因此其余的数组值是不确定的。

正如@ CountMurphy评论所证实的那样,问题在于使用了C库newlib-nano

在微控制器上,Flash很珍贵,printf和相关功能是库中最大的功能之一。因此,在嵌入式微控制器上,我们倾向于删除不必要的事情,如floatdouble格式说明符处理代码。

通过明确激活printf中的浮点newlib-nano支持解决了该问题,正如官方资源herehere中所指示的那样。激活支持的一种方法是添加链接器标志

-u _printf_float

到最后的arm-none-eabi-gcc命令。这将强制包含符号/函数_printf_float,随后使%f格式说明符按预期工作。