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

[复制链接]
 楼主| feifan570 发表于 2007-9-18 10:44 | 显示全部楼层 |阅读模式
我使用ADS1.2的开发环境,我想调用printf()(当然这只是一个示范,我还需要调用的是其他库函数),根据文档的说明,printf()会调用fputc();而fputc()会调用_sys_write(),那么我只要实现fputc()或_sys_write()的重定向就可以了,我就实现了fputc()函数,在编译时,我引入了#pragma&nbsp;import(__use_no_semihosting_swi),但是编译时还是出错,提示:<br />Error:L6200E:Symbol&nbsp;__semihosting_swi_guard&nbsp;multiply&nbsp;defined&nbsp;(by&nbsp;use_semi.o&nbsp;and&nbsp;use_no_semi.o);<br />是printf()还调用了其他的需要semihosting支持的函数吗?<br />
lenglx 发表于 2007-9-18 19:11 | 显示全部楼层

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

如果你的程序只是用到printf的话,重新实现了fputc就足够了
xieqin 发表于 2007-9-18 22:47 | 显示全部楼层

你要干什么哦?

如果你自己设计了一个printf()函数,哪怕是个空函数,只要系统编译链接到了,标准库的printf都不会被链接进来.<br /><br />如果你的printf输出终端是串口:<br />对ARM而言,只要你实现了串口的字符串打印函数,设计个printf()是件很easy的事<br /><br />如果你的printf输出终端是LCD:<br />自己写段程序,把它打印到屏幕上即可.<br /><br />int&nbsp;printf(&nbsp;const&nbsp;char&nbsp;*fmt,...)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;va_list&nbsp;ap;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;char&nbsp;string[&nbsp;256&nbsp;];<br />&nbsp;&nbsp;&nbsp;&nbsp;va_start(&nbsp;ap,&nbsp;fmt&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;vsprintf(&nbsp;string&nbsp;,&nbsp;fmt,&nbsp;ap&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;va_end(&nbsp;ap&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...................<br />&nbsp;&nbsp;&nbsp;&nbsp;//send&nbsp;string&nbsp;to&nbsp;UART&nbsp;or&nbsp;LCD<br />}
LPC900 发表于 2007-9-18 23:03 | 显示全部楼层

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

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

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

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

...

如果自己设计的函数和标准库的函数,在名称和参数都完全一致.移植性是不是一样好啊!!!!!<br /><br /><br /><br />
coolweedman 发表于 2012-12-26 23:29 | 显示全部楼层
blog.sina.com.cn/s/blog_6e22f4ce010136t9.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

92

主题

195

帖子

1

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

92

主题

195

帖子

1

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