我正在STM32F437上编程。我正在使用 SafeRTOS。编译器是GCC。
在一项任务中,我使用
snprintf()
准备一个带有值的字符串。
问题是
snprintf()
无法处理浮点数。当它到达格式化字符串中的任何 '\0'
或 %f
时,它只会结束结果字符串(使用 %g
)。
但是,这很奇怪。如果我在启动 RTOS 之前添加对
snprintf()
中的 snprintf()
的虚拟调用,任务中的 main()
就可以正常工作。
虚拟呼叫:
char dummy[20];
snprintf(dummy, sizeof(dummy), "%g", 3.14159);
我找到了类似的解决方案这里
但没有回答为什么它有效。
有什么想法吗?
一些小型实现中的 printf 库不包括浮点支持。 也许虚拟调用以某种方式导致使用更完整(和更大)的库?
虚拟调用可能会被编译器优化掉。因为您只打印常量。尝试查看反汇编或尝试使用 -O0 标志集进行编译。
浮点支持通常很大,特别是在没有可用硬件 FPU 的平台上,所有计算操作都必须通过调用库来完成。很多标准库都会忽略它,除非您明确指定要启用它。
如果您在任务中使用 snprintf(...) 并最终进入 HardFault_Handler,则堆栈大小可能是问题。增加它并重试。