总结stm32的printf相关知识

来源:互联网 发布:讯龙数据恢复 免费 编辑:程序博客网 时间:2024/06/05 21:02

转载自http://bbs.csdn.net/topics/390342482


biyuntian1012

调试stm32,发现printf无法打印,貌似死在里面了
后来按照网上别人的方法,选上use microLIB选项,确实是可以了,但是为什么呢?


youzi722

因为printf虽然是C语言的标准函数,但是是针对有stdin, stdout设备的系统的,在嵌入式平台上是没有标准的stdin, stdout的,需要映射到串口后某个输出对象的,而嵌入式平台各不相同,如果又没有操作系统的支持,就只能靠自己实现了,因此STM32下的printf不在标准库里,而在定制的库里。
而且一般在嵌入式平台一般也不用printf,可以自己使用sprintf()函数先将数据格式化到缓冲里,然后数据想输出到哪里就输出到哪里。


ymm198606

1. C语言是没有I/O的语言 
    C语言本身就是没有I/O能力的语言(毕竟C语言是高级语言嘛),是依靠函数模块来完成的。如printf()就是一个I/O函数,在编译时,编译器并不编译printf()函数,而把他留在链接(link)阶段由链接器来处理。

    这样做的优点是: 提高了C编译器的可移植性。因为I/O与计算机的硬件关系密切,如果C语言本身具备I/O能力,那么在不同的计算机上,编译器就会因为I/O的差异而必须重新设计。如果把I/O功能从编译器中分离出来成为独立的函数,那么编译器就不必因为硬件的变化而修改,只需修改函数模块即可。并且I/O函数模块是单独存在的,因而修改工作大为简化。 


2. I/O转向的概念 
        在设计程序时,必须指定数据的输入来源(如键盘),以及数据处理完毕后的输出目的地(如文件,打印机),所以必须在程序中指定输入/输入设备后才能运行。可是指定了某个输入/输入设备后,如果再想换由其他设备输入/输出,则必须要修改源程序,重新进行编译、链接。为了避免这个缺点,C语言提供的I/O的重定向能力。 
         C语言将键盘与屏幕叫做标准I/O(Standard Input/Output, STDIO),凡是以标准I/O作为输入/输出的程序,均可重定向改由其他文件或设备做输入/输出。所以我们在编写程序时,可先用标准I/O作为输入/输出对象,等到真正运行时,再重定向到真正需要输入/输出的文件。这样就可避免在编写程序时设置输入/输出的文件名,当需要更改时又返回到程序进行修改的烦恼了。 
        大多数操作系统如Linux,Unix及MS DOS都具有I/O重定向的能力,在这些系统上运行程序(不仅限于C程序),都可以使用I/O重定向。许多操作系统把设备视为一个文件,所以I/O可以重定向到文件,也可以转向到一些接口设备。


biyuntian1012

多谢楼上各位
是不是这样啊
在没有选择microLIB时,默认printf输出的目的接口并不是串口,此时虽然在code中定义了fputc函数,但printf并没有调用fputc,所以无法从串口输出
    选择microLIB选项后,lib库中将printf的输出接口定向到了串口,也就是通过调用fputc函数来输出字符,此时printf就可以正常从串口输出了



youzi722:

差不多是这个意思吧,你也可以自己实现printf的功能,代码类似下面

#define    TPRINTF_BUF_SIZE    1024
char tprintf_buf[TPRINTF_BUF_SIZE];

int tprintf(const char *_format, ...)
{
    va_list ap;
    int len, i;
    char *pchars;
    
    va_start(ap, _format);
    len = vsnprintf(tprintf_buf, TRINTF_BUF_SIZE, _format, ap);
    va_end(ap);
    pchars = tprintf_buf;
    for(i=0; i<len; i++)
    {
        fputc(*pchars++);
    }
}

这样你就可以自己决定输出到哪里了,当然,如果需要的话,你也可以自己实现类似vsnprintf的功能,网上可以找到很多资料的。

0 0