三、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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/288607.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

❀My虚拟机上的ftp服务器搭建(centos)❀

❀My虚拟机上的ftp服务器搭建(centos)❀ 在CentOS上搭建FTP服务器可以使用vsftpd软件,下面是详细的搭建教程: ①安装vsftpd软件 在终端中输入以下命令进行安装: sudo yum install vsftpd ②配置vsftpd 打开vsftpd的配置文件,…

python医学科研中能做什么,python对医学专业的作用

大家好,小编为大家解答python在医学研究中的运用的问题。很多人还不知道python医学科研中能做什么,现在让我们一起来看看吧! 原标题:这个工具,可全网爬取科研圈中外文献! 作为「科研汪」,你是不…

基于YOLOv8的结核病预测系统设计与实现

一、项目背景 本系统的目的是通过痰液图像来检测出结核杆菌的携带者,及时采取治疗措施,在病情早期对其进行相关治疗减少结核病的传播。程序使用的样本是经过染色处理可以使得结核杆菌在显微镜拍摄的医学图像,通过检测医学图像中的结核杆菌诊…

python+torch线性回归模型机器学习

程序示例精选 pythontorch线性回归模型机器学习 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《pythontorch线性回归模型机器学习》编写代码,代码整洁,规则&#xf…

教师教育研究的意义有哪些

教师教育研究对于提高教育质量、推动教育改革的重要性。也有许多网友对教师教育研究的意义进行了深入探讨。 一、提高教师专业素养 教师是教育的核心力量,教师的专业素养直接影响到教育质量。教师教育研究通过对教育理论、教学方法、教育技术等方面的研究&#xff…

Nginx 实战闲谈第一讲:HTTP协议介绍

基本介绍 1.HTTP含义 HTTP 全称:Hyper Text Transfer Protocol 中文名:超文本传输协议 HTTP就是将用户的请求发送到服务器,将服务器请求到的内容传输回给浏览器,浏览器进行解析,解析后变成便于观看的页面。&#x…

数字逻辑触发器学习

1 触发器 1.1 概念 能够存储1位二值信号的基本单元电路, 是时序逻辑电路的基本单元。 1.2 电路构成 由门电路和反馈线构成。 1.3 特点 (1)有两个稳定的状态:1和0。 (2)在触发信号的作用下,根据…

程序员必知!开放封闭原则的实战应用与案例分析

开放封闭原则是面向对象设计中的重要原则之一,它要求软件实体(类、模块、函数等)应该对扩展开放,但对修改关闭。这意味着当需要添加新功能时,不应该修改现有的代码,而是应该通过扩展来实现。这可以通过使用…

【openwrt学习笔记】IPV6 ND协议学习和socket编程

目录 一、参考链接二、学习目标三、代码解析3.1 仅解析NA报文保存设备mac和ipv6地址信息3.1.1 open_ns_socket3.1.2 recv_ns_pack 3.2 解析NA和NS报文中DAD报文保存设备mac和ipv6地址信息3.2.1 open_ns_na_socket3.2.2 recv_ns_na_pack 四、代码优化4.1 BPF参考学习资料4.2 代码…

VCP-DCV VMware vSphere,12月23日即将开课~想了解点击查看

VCP-DCV VMware vSphere 本周开课~ 想报名的必须提前预约啦 👇👇👇 课程介绍 本课程重点讲授如何安装、配置和管理VMware vSphere 8.0(包括VMware ESXi™ 8.0和VMware vCenter Server™ 8.0) 本课程将帮助您做好为任…

【项目管理】redmine

Redmine是用Ruby开发的基于web的项目管理软件,是用ROR框架开发的一套跨平台项目管理系统,据说是源于Basecamp的ror版而来,支持多种数据库,有不少自己独特的功能,例如提供wiki、新闻台等,还可以集成其他版本…

故障排查:shell脚本输出乱码

博客主页:https://tomcat.blog.csdn.net 博主昵称:农民工老王 主要领域:Java、Linux、K8S 期待大家的关注💖点赞👍收藏⭐留言💬 目录 故障详情故障原因解决方法iconv命令介绍 故障详情 最近的工作中遇到一…