STM32 RTOS (H743) 使用带浮点格式的 sprintf 或 snprintf 时崩溃

STM32 RTOS (H743) Crashing when using sprintf or snprintf with float formatting

我已经阅读了一些关于这个问题的旧线程,坦率地说,讨论有点让我头疼。所以我希望能得到一些帮助。

我正在使用 RTOS 对 STM32 进行编程(需要两个线程)。这是一个传感器应用程序,对收集的数据进行了相当密集的计算(因此是 H7)。计算反馈以字符数组的形式通过 CDC 发送,大小为 12。没有什么困难。计算反馈是一个浮点数。这就是我遇到问题的地方。

在发送数据之前,我需要将浮点数转换为 char[]。

我的函数如下所示:

void ASCII_transmitFloat(float value) {
    uint8_t buffer[DEF_ASCII_TX_BUF];
    snprintf((char *)buffer, sizeof(buffer), "%11.9f\n", value);
    CDC_Transmit_FS(buffer, sizeof(buffer));
}

我没有收到错误,只是 snprintf 崩溃了。

无论如何感谢您提供的任何帮助

干杯

编辑:

针对第一个回复进行编辑。 我在项目属性(MCU 设置)中选择了“use float with printf”选项 - 请参见下面的屏幕截图(不确定此复选框是否与手动添加标志相同) 我尝试按照您的 link 中的建议在 linked 中添加行 -u _printf_float,但我得到了相同的结果。执行 snprintf 时崩溃。

可能是因为使用 newlib 默认不包含对浮点数的支持。 参见 printf floats with newlib on STM32

这是我解决问题的方法。 这个问题是已知的,自一年前首次在这里提出以来,ST 一直没有解决这个问题,请参阅: https://community.st.com/s/question/0D50X0000BB1eL7SQJ/bug-cubemx-freertos-projects-corrupt-memory 这是推荐的修复方法: http://www.nadler.com/embedded/newlibAndFreeRTOS.html

有点难以理解,所以我选择了使用 printf 函数的轻量级版本: https://github.com/mpaland/printf

我希望它能帮助其他人解决这个问题。

干杯

我也遇到过这个问题。我不确定你的和我的一样,但也许它可以帮助你。我刚刚修复了它,我唯一做的就是添加了“stdio.h”。然后我的警告消失了。