[牛人杂谈] 如何在单片机上使用printf函数

[复制链接]
 楼主| 598330983 发表于 2018-6-22 16:55 | 显示全部楼层 |阅读模式
查看例子你会发现,大部分都是用了printf打印消息。那么怎么实现的呢?
我们可以看到在工程里有个library文件夹,里面有几个文件,除了跟必须的有关,就有一个跟这个printf有关
255065b2cb957a29b4.png

这个文件就是retarget.c
重定向文件。
 楼主| 598330983 发表于 2018-6-22 16:58 | 显示全部楼层
我们看到该文件里 343565b2cb9dbbd908.png
91905b2cba189886b.png
编译后我们逐级追踪定义
 楼主| 598330983 发表于 2018-6-22 17:00 | 显示全部楼层
952985b2cba7d53515.png
不成想竟然追踪到了这里,哈哈,这就是实现发送给串口0一个字符的关键所在。

 楼主| 598330983 发表于 2018-6-22 17:01 | 显示全部楼层
而具体的stdio.h里面的printf已经封装起来了,这里你看不到具体实现了。
springvirus 发表于 2018-6-22 17:06 | 显示全部楼层
只要重定向fputc,就可以了
 楼主| 598330983 发表于 2018-6-22 17:17 | 显示全部楼层
springvirus 发表于 2018-6-22 17:06
只要重定向fputc,就可以了

不知道这个重定向文件是怎么规定的。如果不包含这个文件那么我是需要写哪个函数呢?
发现这个最终的在串口0发送字符的函数,是经过层层调用才使用的。那么printf是引用的哪个呢是fputc吗
小明的同学 发表于 2018-6-22 22:33 | 显示全部楼层
肯定是靠近上级的最好了,那就是fput,有的我看人家写的也可能是putchar
xujunyi3611 发表于 2018-6-24 11:54 | 显示全部楼层
半主机重定向了吗?还是用的是串口,只不过封装了一下。
 楼主| 598330983 发表于 2018-6-24 20:02 | 显示全部楼层
xujunyi3611 发表于 2018-6-24 11:54
半主机重定向了吗?还是用的是串口,只不过封装了一下。

主要是不清楚stdio.h里的print是先调用的哪个实现一个字符发送的,竟然也没法定位到。
springvirus 发表于 2018-6-25 08:20 | 显示全部楼层
598330983 发表于 2018-6-22 17:17
不知道这个重定向文件是怎么规定的。如果不包含这个文件那么我是需要写哪个函数呢?
发现这个最终的在串口 ...

printf最终调用fputc,应该可以这样理解吧,你再搜搜,看看官方的解释吧
heimaojingzhang 发表于 2018-6-25 14:44 | 显示全部楼层
官方例程里边会不会有
您需要登录后才可以回帖 登录 | 注册

本版积分规则

266

主题

5573

帖子

22

粉丝
快速回复 在线客服 返回列表 返回顶部

266

主题

5573

帖子

22

粉丝
快速回复 在线客服 返回列表 返回顶部