电子产业一站式赋能平台

PCB联盟网

搜索
查看: 54|回复: 0
收起左侧

单片机使用printf打印编译出错,有哪些情况?

[复制链接]

503

主题

503

帖子

5658

积分

四级会员

Rank: 4

积分
5658
发表于 2025-2-7 12:16:00 | 显示全部楼层 |阅读模式
关注+星标公众,不错过精彩内容
作者 | strongerHuang
微信公众号 | 嵌入式专栏

不管是学习单片机,还是用单片机做项目,都会经常用串口重定向到printf打印信息。
有网友问,他基于瑞萨RA单片机、e2 studio开发环境下,添加了 printf 打印代码,然后编译出错了,问是什么情况?

dk0pa4mlnpq64017392223.png

dk0pa4mlnpq64017392223.png

重定向代码(代码是从网上找的):
  • /* 重定向 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_B_UART_Write(&g_uart3_ctrl, (uint8_t *)pBuffer, (uint32_t)size);
        while(uart_send_complete_flag == false);    uart_send_complete_flag = false;
        return size;}#elseint fputc(int ch, FILE *f){    (void)f;    R_SCI_B_UART_Write(&g_uart3_ctrl, (uint8_t *)&ch, 1);    while(uart_send_complete_flag == false);    uart_send_complete_flag = false;
        return ch;}#endif
    这个问题其实是大众常见的问题,今天就借助这个问题来开展开说说单片机使用printf打印编译出错的一些情况。
    一、编译器的原因
    以前,我们使用其他单片机,在 Keil 环境下,重定向是基于fputc函数。

    比如这样重定向:
  • int fputc(int ch, FILE *f){  USART_SendByte((uint8_t)ch);
      return ch;}
    而在 e2 studio 集成开环境下,使用的是 GCC编译器,是基于_write函数重定向。
  • int _write(int fd, char *pBuffer, int size){    (void)fd;    //重定向代码
        return size;}这里重定向代码根据自己项目情况自己编辑,网上也有很多可以参考。
    二、缺少包含头文件
    printf 函数是一种标准函数(接口),我们需要在你的源代码中包含头文件:

  • 三、工程设置的问题
    e2 studio开发环境下,需要对工程进行设置一下才能正常使用 printf 打印输出。

    也就是勾选Use float with nano printf (-u _printf float),如下图:

    3kgammbqzpq64017392323.jpg

    3kgammbqzpq64017392323.jpg

    u4hiu3kkxzn64017392423.png

    u4hiu3kkxzn64017392423.png

    网上还有一种说法,由于 e2 studio开发环境是基于GCC编译,添加_write函数后,还必须添加gcc编译命令:
  • --specs=nano.specs --specs=nosys.specs
    这个方法,我在上面设置的位置找到了,测试发现还是可以使用,也就是勾选下面的【Do not use syscalls(--specs=nosys.specs)】,如下图:

    l0gvt0of41j64017392524.png

    l0gvt0of41j64017392524.png

    还有其他的情况,比如编译器优化或警告/错误级别、格式化字符串问题等。
    关于e2studio 中使用printf打印编译出错的问题,大家还遇到哪些,欢迎留言区交流讨论,也可以参看 e2studio官方文档或社区论坛,从中找到答案。
    ------------ END ------------
    推荐阅读:
    瑞萨RA8系列教程 | 初识瑞萨 RA8 系列单片机
    瑞萨RA8系列教程 | 瑞萨 RA8 开发环境搭建,并点亮一个LED
    瑞萨RA8系列教程 | 基于 Keil 开发 RA8单片机
    瑞萨RA8系列教程 | 学习RA8常用哪些文档手册?
    瑞萨RA8系列教程 | 瑞萨RA8单片机IO中断配置
    瑞萨RA8系列教程 | 基于e2s在RA8上跑RTOS实现的方法
    瑞萨RA8系列教程 | 基于e2s实现RA8串口输出配置
    瑞萨RA8系列教程 | RA8单片机SysTick使用描述
    瑞萨RA8系列教程 | RA8输出PWM实现方法
    瑞萨RA8系列教程 | RA8基于e2s实现RTC实时时钟功能
    ······
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表