【问题标题】:arm-none-eabi-gcc : Printing float number using printfarm-none-eabi-gcc :使用 printf 打印浮点数
【发布时间】:2012-10-03 06:53:19
【问题描述】:

我正在为 SAM3N arm cortex-M3 微控制器编写 C 程序。当我尝试打印浮点数时,它只打印'f'。 示例:printf("%f",43.12); 仅打印 f,而不是 43.12

但使用整数打印效果很好。

如何启用浮点数的完整打印?我知道编译器默认禁用浮点打印以减少代码大小(即,它们似乎链接了缩减版本)。另请注意,makefile 中没有使用CFLAGS=-Dprintf=iprintf

工具详情:

  • ARM/GNU C 编译器:(crosstool-NG 1.13.1 - Atmel 版本:13)4.6.1
  • Atmel studio 6.0 附带上述工具。

【问题讨论】:

  • AFAIK 这个微控制器没有 FPU。因此,您需要参考编译器文档来了解 libc 如何启用完整的 printf 功能。例如在 AVR 上它是“-Wl,-u,vfprintf -lprintf_flt -lm”。另一种方式,您应该联系您的工具供应商,也许这是已知问题。
  • 不幸的是,这个 -lprintf 仅适用于 AVR-GCC,但不适用于 ARM。

标签: c gcc arm printf


【解决方案1】:

你可以试试,在链接器设置中添加以下选项

-lc -lrdimon -u _printf_float

它在 ARM-CORTEXM0 中对我有用

【讨论】:

  • 也适用于 ARM Cortex-M4。
  • -lrdimon 需要什么?这似乎会导致我的应用程序出现不良行为。
  • -lrdimon 是不必要的,并导致了一些奇怪的行为。我从来不知道这个标志的效果是什么......
  • 替代数据点:在我的例子中,printf 调用在没有 -lrdimon 参数的情况下崩溃。
【解决方案2】:

可能是您的平台/库不支持printf/sprintf%f 格式说明符。 作为第一种方法,您可以将自己的 printf 用于浮点数/双精度数:

void printDouble(double v, int decimalDigits)
{
  int i = 1;
  int intPart, fractPart;
  for (;decimalDigits!=0; i*=10, decimalDigits--);
  intPart = (int)v;
  fractPart = (int)((v-(double)(int)v)*i);
  if(fractPart < 0) fractPart *= -1;
  printf("%i.%i", intPart, fractPart);
}

【讨论】:

  • 感谢您的想法,但我已经将其实现为解决方法(使用 modf、lround)。而且我想要正确的 printf,这样代码会更干净。
【解决方案3】:

在默认情况下禁用浮点的编译器中,默认库可以处理它们是不寻常的。查看您的参考资料,您将找到有关如何重新编译具有浮点支持的适当库的信息,或者(更有可能)在哪里可以找到已经使用它构建的版本。

【讨论】:

  • 这正是我卡住的地方。看来,我需要用其他 C 库替换 libc。似乎,默认的 libc 没有可以 printf 浮动的 printf。任何帮助/建议我怎么做?
  • 这是不支持 printfing 浮动的库 - gcc 不应该关心这个吗?如果您正在寻找不同的 libc,请尝试使用 newlib,sourceware.org/newlib
猜你喜欢
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 2020-07-16
  • 2019-09-21
相关资源
最近更新 更多