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 崩溃了。
- 我尝试了 sprintf,结果相同
- 将我的浮点数转换为 uint32_t 并将我的函数中的 arg 类型更改为 uint32_t,有效。 (我正在失去精度,所以这不是解决方案,但无论如何都试过了)
- 我有相同版本的整数函数,它们也能正常工作
- 哦,我在 uint8_t 和 char 之间有点像米老鼠,它可能既丑又丑,但我还没有找到更好的方法
无论如何感谢您提供的任何帮助
干杯
编辑:
针对第一个回复进行编辑。
我在项目属性(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”。然后我的警告消失了。
我已经阅读了一些关于这个问题的旧线程,坦率地说,讨论有点让我头疼。所以我希望能得到一些帮助。
我正在使用 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 崩溃了。
- 我尝试了 sprintf,结果相同
- 将我的浮点数转换为 uint32_t 并将我的函数中的 arg 类型更改为 uint32_t,有效。 (我正在失去精度,所以这不是解决方案,但无论如何都试过了)
- 我有相同版本的整数函数,它们也能正常工作
- 哦,我在 uint8_t 和 char 之间有点像米老鼠,它可能既丑又丑,但我还没有找到更好的方法
无论如何感谢您提供的任何帮助
干杯
编辑:
针对第一个回复进行编辑。 我在项目属性(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”。然后我的警告消失了。