关注+星标公众号,不错过精彩内容
作者 | strongerHuang
微信公众号 | 嵌入式专栏
不管是学习单片机,还是用单片机做项目,都会经常用串口重定向到printf打印信息。
有网友问,他基于瑞萨RA单片机、e2 studio开发环境下,添加了 printf 打印代码,然后编译出错了,问是什么情况?
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
u4hiu3kkxzn64017392423.png
网上还有一种说法,由于 e2 studio开发环境是基于GCC编译,添加_write函数后,还必须添加gcc编译命令:--specs=nano.specs --specs=nosys.specs
这个方法,我在上面设置的位置找到了,测试发现还是可以使用,也就是勾选下面的【Do not use syscalls(--specs=nosys.specs)】,如下图:
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实时时钟功能
······ |