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

Cou*_*phy 0 c arm

我试图简单地将一个double转换为C中的字符串

?char printable[9];

snprintf(printable, 9, "%f", 30.356145);
Run Code Online (Sandbox Code Playgroud)

应将printtable设置为"30.35614".当我在在线c编译器上运行此代码时,它正确输出.当我在我的微控制器上输出它时,打印等于这个废话:

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

Max*_*rdt 5

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

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

在微控制器上,Flash是宝贵的,printf相关功能是库中最大的功能之一.因此,对嵌入式微控制器,我们倾向于去掉像不必要的东西floatdouble格式说明处理代码.

该问题通过显式激活浮点printf支持来解决newlib-nano,正如此处此处的官方资源中所指示的那样.激活支持的一种方法是添加链接器标志

-u _printf_float
Run Code Online (Sandbox Code Playgroud)

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