打印

我想调用printf(),我需要完成那些底层函数?

[复制链接]
7198|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
feifan570|  楼主 | 2007-9-18 10:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用ADS1.2的开发环境,我想调用printf()(当然这只是一个示范,我还需要调用的是其他库函数),根据文档的说明,printf()会调用fputc();而fputc()会调用_sys_write(),那么我只要实现fputc()或_sys_write()的重定向就可以了,我就实现了fputc()函数,在编译时,我引入了#pragma import(__use_no_semihosting_swi),但是编译时还是出错,提示:
Error:L6200E:Symbol __semihosting_swi_guard multiply defined (by use_semi.o and use_no_semi.o);
是printf()还调用了其他的需要semihosting支持的函数吗?

相关帖子

沙发
lenglx| | 2007-9-18 19:11 | 只看该作者

那一定是其它C库函数用到了semihosting SWI

如果你的程序只是用到printf的话,重新实现了fputc就足够了

使用特权

评论回复
板凳
xieqin| | 2007-9-18 22:47 | 只看该作者

你要干什么哦?

如果你自己设计了一个printf()函数,哪怕是个空函数,只要系统编译链接到了,标准库的printf都不会被链接进来.

如果你的printf输出终端是串口:
对ARM而言,只要你实现了串口的字符串打印函数,设计个printf()是件很easy的事

如果你的printf输出终端是LCD:
自己写段程序,把它打印到屏幕上即可.

int printf( const char *fmt,...)
{  
    va_list ap; 
    static char string[ 256 ];
    va_start( ap, fmt );
    vsprintf( string , fmt, ap );    
    va_end( ap );    
        ...................
    //send string to UART or LCD
}

使用特权

评论回复
地板
LPC900| | 2007-9-18 23:03 | 只看该作者

最好的方法是用sprintf()函数

sprintf()函数与printf()函数功能类似,但是并不操作实际的I/O端口,而是把格式化的结果存放到指定的缓冲区里。sprintf()函数更适合于嵌入式编程,具有较好的可移植性。实例:
{
    char s[20];
    int x = 0x36A9;
    sprintf(s,"%d",x);
    UartSendString(s);    //利用你自己定义的I/O函数输出结果
    ...
}
显然,这比printf()函数方便多了。

使用特权

评论回复
5
feifan570|  楼主 | 2007-9-19 09:02 | 只看该作者

我并不是要问怎么实现一个printf

我想问的是:当调用一个标准库时,怎么把它定向到硬件。比如说我调用fopen(),怎样才能定向到我的SD卡。也许你们会说“为什么一定要调用fopen()来打开SD卡,自己实现一个直接对SD卡操作的函数不就行了吗”。那样是可以的,以前我一般也是那么做,一般都不敢调用标准库,特别是要和semihosting打交道的函数。但是我发现这样什么都自己实现的话相当累,而且移植性不好。所以我希望采用调用标准库的方式减轻一点负担。
也许是我表达得不清楚,但是不管怎样,谢谢大家的指教!

使用特权

评论回复
6
xieqin| | 2007-9-19 09:44 | 只看该作者

...

如果自己设计的函数和标准库的函数,在名称和参数都完全一致.移植性是不是一样好啊!!!!!



使用特权

评论回复
7
coolweedman| | 2012-12-26 23:29 | 只看该作者
blog.sina.com.cn/s/blog_6e22f4ce010136t9.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

92

主题

195

帖子

1

粉丝