This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

咨询一个printf重定向的问题

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

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

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

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

  • 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()实现的
  • 太感谢了,这个资料太全了,以前只是会实现这个功能,但是不太明白背后的机理,谢谢。