三、e2studio VS STM32CubeIDE之瑞萨RA FSP5.0.0裸机printf重定向

2023-12-21 01:30

本文主要是介绍三、e2studio VS STM32CubeIDE之瑞萨RA FSP5.0.0裸机printf重定向,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、概述/目的
二、fsp4.6.0之前printf重定向方法
三、fsp5.0.0之后printf重定向方法
    3.1 升级后编译报错
    3.2 分析原因
        3.2.1 newlib和gcc版本
        3.2.2 参考stm32cube ide
    3.3 处理办法
        3.3.1 方法一
        3.3.2 方法二

三、e2studio VS STM32CubeIDE之瑞萨RA FSP5.0.0裸机printf重定向

一、概述/目的

在嵌入式系统中,实现printf函数重定向输入日志,这是优秀代码的前提,或者说是基础。
瑞萨RA升级到fsp5.0.0之后,原fps4.6.0及之前的版本的printf重定向功能编译报错。
所以,我们分析报错的原因和解决办法

二、fsp4.6.0之前printf重定向方法

引用野火瑞萨RA系列FSP19.5.2.6. 重定向printf输出到串口
https://doc.embedfire.com/mcu/renesas/fsp_ra/zh/latest/doc/chapter19/chapter19.html?highlight=printf

  • fsp 4.0.0

  • gcc 10.3

  • --specs=nano.specs

  • -u _printf_float/-u_scanf_float

  • --specs=nosys.specs(disable)

  • --specs=rdimon.specs(disable)

图片

图片

/* 重定向 printf 输出 */
#if defined __GNUC__ && !defined __clang__
int _write(int fd, char *pBuffer, int size); //防止编译警告
int _write(int fd, char *pBuffer, int size)
{(void)fd;R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t *)pBuffer, (uint32_t)size);while(uart_send_complete_flag == false);uart_send_complete_flag = false;return size;
}
#else
int fputc(int ch, FILE *f)
{(void)f;R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t *)&ch, 1);while(uart_send_complete_flag == false);uart_send_complete_flag = false;return ch;
}
#endif

三、fsp5.0.0之后printf重定向方法

3.1 升级后编译报错

图片

图片

3.2 分析原因

  • 差分源码

  • 分析newlib:
    文章:
    嵌入式科普(5)ARM GNU Toolchain相关概念和逻辑
    嵌入式科普(6)你听说过FreeRTOS heap6吗?
     

    图片

    图片

3.2.1 newlib和gcc版本

  • The Red Hat newlib C Library
    https://sourceware.org/newlib/libc.html#sprintf

  • Arm GNU Toolchain
    https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads

    图片

3.2.2 参考stm32cube ide

  • gcc 10.3

  • --specs=nano.specs

  • -u _printf_float/-u_scanf_float

  • --specs=nosys.specs
     

    图片

    图片

3.3 处理办法

  • 测试fsp5.1.0printf重定向

  • gcc 12.2
     

    图片

    图片

3.3.1 方法一

  • --specs=nosys.specs

  • 可用,但有警告
     

    图片

    图片

3.3.2 方法二

  • 增加syscall.c解决警告

    图片

    图片

  • 解决未定义警告

    图片

  • bsp_sbrk.c文件

    图片

  • 完美解决,新旧兼容
    源码整理:printf重定向、syscall函数声明、例程ra6m5_log

//fsp5.0.0
#ifdef __GNUC__
int __io_putchar(int ch);
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
int fputc(int ch, FILE *f);
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{fsp_err_t err = R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)ch, 1);if(FSP_SUCCESS != err) __BKPT();while(uart_send_complete_flag == false);uart_send_complete_flag = false;return ch;
}
#if 1
void initialise_monitor_handles();
int _getpid(void);
int _getpid(void);
int _kill(int pid, int sig);
void _exit (int status);
__attribute__((weak)) int _read(int file, char *ptr, int len);
__attribute__((weak)) int _write(int file, char *ptr, int len);
int _close(int file);
int _fstat(int file, struct stat *st);
int _isatty(int file);
int _lseek(int file, int ptr, int dir);
int _open(char *path, int flags, ...);
int _wait(int *status);
int _unlink(char *name);
int _times(struct tms *buf);
int _stat(char *file, struct stat *st);
int _link(char *old, char *new);
int _fork(void);
int _execve(char *name, char **argv, char **env);
#endif

这篇关于三、e2studio VS STM32CubeIDE之瑞萨RA FSP5.0.0裸机printf重定向的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/518217

相关文章

如何使用Nginx配置将80端口重定向到443端口

《如何使用Nginx配置将80端口重定向到443端口》这篇文章主要为大家详细介绍了如何将Nginx配置为将HTTP(80端口)请求重定向到HTTPS(443端口),文中的示例代码讲解详细,有需要的小伙... 目录1. 创建或编辑Nginx配置文件2. 配置HTTP重定向到HTTPS3. 配置HTTPS服务器

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

nginx中重定向的实现

《nginx中重定向的实现》本文主要介绍了Nginx中location匹配和rewrite重定向的规则与应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 目录一、location1、 location匹配2、 location匹配的分类2.1 精确匹配2

Python实现文件下载、Cookie以及重定向的方法代码

《Python实现文件下载、Cookie以及重定向的方法代码》本文主要介绍了如何使用Python的requests模块进行网络请求操作,涵盖了从文件下载、Cookie处理到重定向与历史请求等多个方面,... 目录前言一、下载网络文件(一)基本步骤(二)分段下载大文件(三)常见问题二、requests模块处理

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

【vue3|第28期】 Vue3 + Vue Router:探索路由重定向的使用与作用

日期:2024年9月8日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉在这里插入代码片得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083;0.98365 = 0.0006 说

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置:  // launch.json{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information,

在struts.xml中,如何配置请求转发和请求重定向!

<span style="font-size:18px;"><span style="white-space:pre"> </span><!--<strong>下面用请求转发action </strong>,<strong>这样过去id不会丢</strong>,如果用重定向的话,id会丢 --><result name="updatePopedom"<span style="color:#ff00

请解释JSP中的九大内置对象及其作用。什么是Java Web中的请求转发和重定向?它们有什么区别?

请解释JSP中的九大内置对象及其作用。 JSP(JavaServer Pages)中的九大内置对象(也称为隐式对象或自动对象)是JSP容器为每个页面提供的Java对象,这些对象在JSP页面被转换成Servlet时自动可用,无需显式声明。这些对象极大地简化了JSP页面的开发,因为它们提供了对Web应用程序中常见功能的直接访问。以下是九大内置对象及其作用的详细解释: request:javax.

解决服务器VS Code中Jupyter突然崩溃的问题

问题 本来在服务器Anaconda的Python环境里装其他的包,装完了想在Jupyter里写代码验证一下有没有装好,一运行发现Jupyter崩溃了!?报错如下所示 Failed to start the Kernel. ImportError: /home/hujh/anaconda3/envs/mia/lib/python3.12/lib-dynload/_sqlite3.cpython-