首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在stm32f7上使用freeRTOS的sprint/printf的问题

在stm32f7上使用freeRTOS的sprint/printf的问题
EN

Stack Overflow用户
提问于 2020-09-29 19:15:49
回答 3查看 807关注 0票数 1

两天以来,我一直在尝试让printf\sprintf在我的项目中工作……单片机: STM32F722RETx

我尝试使用newLib、heap3、heap4等,但都不起作用。HardFault_Handler是每一次运行的时间。现在,我尝试使用this link的简单实现,仍然存在同样的问题。我想我的设备有一些关于双数字的问题,因为程序在_ftoa函数中从这行if (value != value)运行HardFault_Handler。(什么是奇怪的,因为这个stm32支持if (value != value))你们知道吗?(现在我使用的是heap_4.c)我的计算器选项:

代码语言:javascript
复制
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
 )

连接器选项:

代码语言:javascript
复制
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
 )

链接器脚本:

代码语言:javascript
复制
/* 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,但是钩子函数从未被调用过。我发现了奇怪的想法:这个解决方案是有效的:

代码语言:javascript
复制
float d = 23.5f;
char buffer[20];
sprintf(buffer, "temp %f", 23.5f);

但是这个解决方案不是:

代码语言:javascript
复制
float d = 23.5f;
char buffer[20];
sprintf(buffer, "temp %f",d);

不知道为什么一个拷贝地传递变量,生成一个HardFault_Handler...

EN

回答 3

Stack Overflow用户

发布于 2020-10-01 00:08:02

您可以实现一个硬故障处理程序,该处理程序至少可以为您提供发生问题的SP位置。这应该会提供更多的见解。

https://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html

它应该让您知道问题是由于MCU中的浮点错误,还是由于可能由某些链接问题引起的分支错误造成的

票数 0
EN

Stack Overflow用户

发布于 2020-10-06 14:47:40

为了解决这个问题,我重写了_fstat_write函数来改变printf的输出函数

代码语言:javascript
复制
/*
 * Retarget functions for printf()
 */
#include <errno.h>
#include <sys/stat.h>

int _fstat (int file, struct stat * st) {
    errno = -ENOSYS;
    return -1;
}

int _write (int file, char * ptr, int len) {
    extern int uart_putc(int c);
    int i;

    /* Turn character to capital letter and output to UART port */
    for (i = 0; i < len; i++) uart_putc((int)*ptr++);
    return 0;
}

并为SiFive HiFive Rev B硬件的UART0创建另一个uart_putc函数:

代码语言:javascript
复制
void uart_putc(int c)
{
#define uart0_txdata    (*(volatile uint32_t*)(0x10013000)) // uart0 txdata register
#define UART_TXFULL             (1 << 31)  // uart0 txdata flag
    while ((uart0_txdata & UART_TXFULL) != 0) { }
    uart0_txdata = c;
}
票数 0
EN

Stack Overflow用户

发布于 2020-11-08 06:29:17

newlib C运行时库(在许多嵌入式工具链中使用)在内部使用它自己的malloc系列例程。newlib维护一些内部缓冲区,并需要一些线程安全支持:http://www.nadler.com/embedded/newlibAndFreeRTOS.html

未对齐的内存访问可能导致硬故障:https://www.keil.com/support/docs/3777.htm

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64118480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档