【发布时间】:2021-01-14 23:57:36
【问题描述】:
两天以来,我试图让 printf\sprintf 在我的项目中工作...... 单片机:STM32F722RETx
我尝试使用 newLib、heap3、heap4 等,但没有任何效果。 HardFault_Handler 每次都会运行。
现在我正在尝试使用来自this link 的简单实现,但仍然是同样的问题。我想我的设备有一些双数问题,因为程序在 _ftoa 函数中从这一行 if (value != value) 运行 HardFault_Handler。(奇怪的是,这个 stm32 支持 FPU)
你们有什么想法吗? (现在我使用的是 heap_4.c)
我的编译器选项:
target_compile_options(${PROJ_NAME} PUBLIC
$<$<COMPILE_LANGUAGE:CXX>:
-std=c++14
>
-mcpu=cortex-m7
-mthumb
-mfpu=fpv5-d16
-mfloat-abi=hard
-Wall
-ffunction-sections
-fdata-sections
-O1 -g
-DLV_CONF_INCLUDE_SIMPLE
)
链接器选项:
target_link_options(${PROJ_NAME} PUBLIC
${LINKER_OPTION} ${LINKER_SCRIPT}
-mcpu=cortex-m7
-mthumb
-mfloat-abi=hard
-mfpu=fpv5-sp-d16
-specs=nosys.specs
-specs=nano.specs
# -Wl,--wrap,malloc
# -Wl,--wrap,_malloc_r
-u_printf_float
-u_sprintf_float
)
链接器脚本:
/* Highest address of the user mode stack */
_estack = 0x20040000; /* end of RAM */
/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x200; /* required amount of heap */
_Min_Stack_Size = 0x400; /* required amount of stack */
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 256K
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
}
更新: 我不认为这是堆栈问题,我已将 configCHECK_FOR_STACK_OVERFLOW 设置为 2,但从未调用过钩子函数。我发现奇怪的想法:这个解决方案有效:
float d = 23.5f;
char buffer[20];
sprintf(buffer, "temp %f", 23.5f);
但这个解决方案不是:
float d = 23.5f;
char buffer[20];
sprintf(buffer, "temp %f",d);
不知道为什么要通过副本传递变量,生成一个 HardFault_Handler...
【问题讨论】:
-
检查堆栈指针是否在导致硬故障的任何时候溢出堆栈。
-
我相信 STM32F722 有一个单精度 FPU,这意味着一个软件库可以用于任何双精度操作。我不知道这是否重要,但你提到了双打,所以我想我会提到它。
-
如果可以重现,可以尝试使用 CubeMX 生成一个简单的项目,并使用 STM32CubeIDE 中的“硬故障分析器”。如果不能,我会怀疑编译器或链接器选项错误。
标签: embedded printf stm32 freertos stm32f7