TI中文支持网
TI专业的中文技术问题搜集分享网站

咨询一个printf重定向的问题

发现好多单片机的例子里用printf,都是默认串口0,这是包含了stdio.h文件。

如果用串口1,就要用重定向这个概念,需要自己建立一个putchar()函数。那么问题来了,我发现如果不用重定向的话,编译后没法定向到系统自带的这个putchar

那么系统是怎么知道默认的这个串口0的呢。

另外自己定义了一个putchar函数后,系统是怎么知道要用我定义的这个呢,不清楚内部是怎么处理这个问题的。请明白的大神给介绍一下啊。

gaoyang9992006:

MDK中通常使用以下两种方法:
方法1.使用微库,因为使用微库的话,不会使用半主机模式.
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);USART1->DR = (u8) ch;
return ch;
}
方法2.仍然使用标准库,在主程序添加下面代码:
​#pragma import(__use_no_semihosting)
​struct __FILE
{
int handle;
};
FILE __stdout;
_sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//Ñ»··¢ËÍ,Ö±µ½·¢ËÍÍê±ÏUSART1->DR = (u8) ch;
return ch;
}
关于 microlib
microlib 是缺省 C 库的备选库。 它用于必须在极少量内存环境下运行的深层嵌入式应用程序。 这些应用程序不在操作系统中运行。microlib 不会尝试成为符合标准的 ISO C 库。
microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。某些库函数的运行速度也比较慢,例如,memcpy()。
上面给出了正确的方法,我在测试的过程中发现方法二中注释掉#pragma import(__use_no_semihosting) 程序依然运行正确,这个很让人费解。
也有使用#pragma import(__use_no_semihosting_swi)的。这几个的区别我没弄懂。
—————————-
查了很多资料,大部分的实现都是重写fputc()实现的

Seven Han:

回复 gaoyang9992006:

processors.wiki.ti.com/…/Tips_for_using_printf

gaoyang9992006:

回复 Seven Han:

太感谢了,这个资料太全了,以前只是会实现这个功能,但是不太明白背后的机理,谢谢。

赞(0)
未经允许不得转载:TI中文支持网 » 咨询一个printf重定向的问题
分享到: 更多 (0)