查看: 5745|回复: 14

[提问] 高手请进!ARM嵌入式开发中GNU环境printf 重定向串口! [复制链接]

潜艇8421 (离线)
积分
6607
帖子
74
发表于 2009-6-27 18:10:38 |显示全部楼层
关键词: arm , GNU , printf , 串口 , 嵌入式
找了一下GOOGLE ,竟发现这个问题难倒不少人,网络上好象找不到答案,不知道社区的实力如何?即管发此问题贴,合大家之力,希望能够解决。
wangkj (离线)
积分
57309
帖子
3129
发表于 2009-6-27 18:39:51 |显示全部楼层
启动kernel时候指定终端是串口,就全定向到串口了。
qq:1248780
email:1248780@qq.com
VGA 显示卡 arm单片机 显卡 cortex-m0 fpga 烧写器 开发板

http://item.taobao.com/item.htm?id=7801503020
一朝成名 (离线)
积分
36914
帖子
1865
发表于 2009-6-27 20:17:27 |显示全部楼层
哈哈,同意ls,移植的时候不是要指定终端的吗?

指定串口不就可以了
网名招摇了点,人不招摇,大家都知道:)
潜艇8421 (离线)
积分
6607
帖子
74
发表于 2009-6-27 20:46:47 |显示全部楼层
那是带OS的用法,现在要剥去OS 直接用,也就是象以下这段的代码就必需打到串口去,
int main (void)
{
printf("Hello World\n");     //这样怎么重定位?默认输出是stdout.
}
一朝成名 (离线)
积分
36914
帖子
1865
发表于 2009-6-27 21:39:39 |显示全部楼层
我说不可能这么简单
原来是下个套

看来是有准备的
网名招摇了点,人不招摇,大家都知道:)
一朝成名 (离线)
积分
36914
帖子
1865
发表于 2009-6-27 21:50:41 |显示全部楼层
我没这么用过,但是想出来一个方法
那就是改printf函数,不用本来的glibc的函数原型,将printf函数写成一个简短的串口驱动形式
这样可以不?
网名招摇了点,人不招摇,大家都知道:)
潜艇8421 (离线)
积分
6607
帖子
74
发表于 2009-6-27 22:01:38 |显示全部楼层
俺查看了WINARM  中带有的所有例程,WINARM是用 GNU工具链的arm-elf-gcc 编译,用的是newlib 库(嵌入式专用库),WINARM中带有的所有例程,竟没有提到printf 重定向的例程,对于使用这个重定向,作者给人的感觉要么就说这个太简单!还用给例程吗?要么就真是有点难度?
潜艇8421 (离线)
积分
6607
帖子
74
发表于 2009-6-27 22:09:04 |显示全部楼层
RE:名人,为什么要花力气搞懂这个printf的定向? 搞通这个是为以后测试开源代码做准备,总不可能把别人写的printf 全改成自已的啊,这样会累坏人的,改一两个绝对可以,如果很多,人会疯的。

所以printf 的定向问题是必需摆平搞定的
宇宙飞船 (离线)
积分
35643
帖子
692
发表于 2009-6-27 22:31:09 |显示全部楼层
俺查了一个叫“都江的DIY OS for ARM” 的用的是arm-elf-gcc  一大堆的源码中竟同样没有用到printf 重定向串口的用法,国内研究这个问题的深度由此可见一斑!
人生得意须尽欢,莫使金樽空对月,
天生我材必有用,千金散尽还复来。
一朝成名 (离线)
积分
36914
帖子
1865
发表于 2009-6-27 22:59:02 |显示全部楼层
RE:名人,为什么要花力气搞懂这个printf的定向? 搞通这个是为以后测试开源代码做准备,总不可能把别人写的printf 全改成自已的啊,这样会累坏人的,改一两个绝对可以,如果很多,人会疯的。

所以printf 的定向问 ...
潜艇8421 发表于 2009-6-27 22:09


加一个宏定义,OK了…不用改
然后写自己的printf就不哦了?
宇宙飞船 (离线)
积分
35643
帖子
692
发表于 2009-6-27 23:34:46 |显示全部楼层
会产生冲突,编译不可能通过的,就算能通过编译,能正常工作吗?
人生得意须尽欢,莫使金樽空对月,
天生我材必有用,千金散尽还复来。
一朝成名 (离线)
积分
36914
帖子
1865
发表于 2009-6-27 23:40:03 |显示全部楼层
我看很多都用类似XX_printf函数调试,等os完毕了再使用printf函数
偶不太理解飞船要搞什么东东
网名招摇了点,人不招摇,大家都知道:)
宇宙飞船 (离线)
积分
35643
帖子
692
发表于 2009-6-27 23:53:41 |显示全部楼层
本帖最后由 宇宙飞船 于 2009-6-27 23:58 编辑

8位机WINAVR 中有一个专门打开设备的函数---fdevopen( 自定串口函数)。然后就把stdout重定向到串口了。 这样可以正常使用printf 的各种功能。用C无非就是看中丰富的库函数。printf是功能最强劲的一个,因此作为使用C语言的MCU开发者是很有必要搞懂printf的使用。
一朝成名 (离线)
积分
36914
帖子
1865
发表于 2009-6-27 23:59:51 |显示全部楼层
还有就是__FILE__,__LINE__选项

Linux下调试也就这个方法了,gdb应用有限
网名招摇了点,人不招摇,大家都知道:)
gfd (离线)
积分
59
帖子
26
发表于 2010-7-26 10:23:31 |显示全部楼层
太强了
您需要登录后才可以发表评论 登录 | 立即注册

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备11013910号 | 京公网安备11010502021702
回顶部