snprintf 不工作浮动

问题描述 投票:0回答:3

我正在STM32F437上编程。我正在使用 SafeRTOS。编译器是GCC。

在一项任务中,我使用

snprintf()
准备一个带有值的字符串。

问题是

snprintf()
无法处理浮点数。当它到达格式化字符串中的任何
'\0'
%f
时,它只会结束结果字符串(使用
%g
)。

但是,这很奇怪。如果我在启动 RTOS 之前添加对

snprintf()
中的
snprintf()
的虚拟调用,任务中的
main()
就可以正常工作。

虚拟呼叫:

char dummy[20];
snprintf(dummy, sizeof(dummy), "%g", 3.14159);

我找到了类似的解决方案这里

但没有回答为什么它有效。

有什么想法吗?

c gcc printf stm32 rtos
3个回答
0
投票

一些小型实现中的 printf 库不包括浮点支持。 也许虚拟调用以某种方式导致使用更完整(和更大)的库?


0
投票

虚拟调用可能会被编译器优化掉。因为您只打印常量。尝试查看反汇编或尝试使用 -O0 标志集进行编译。

浮点支持通常很大,特别是在没有可用硬件 FPU 的平台上,所有计算操作都必须通过调用库来完成。很多标准库都会忽略它,除非您明确指定要启用它。


0
投票

如果您在任务中使用 snprintf(...) 并最终进入 HardFault_Handler,则堆栈大小可能是问题。增加它并重试。

© www.soinside.com 2019 - 2024. All rights reserved.