2014-10-03 20 views
4

我在一个受约束的嵌入式系统上工作。printf的格式化缓冲区在哪里?

目前我们使用snprintf到缓冲区,然后用另一份声明中,打印缓冲区的串行端口:

char temp_buffer[256]; 
    int bytes_written = snprintf(temp_buffer, sizeof(temp_buffer), 
         "Solar system has %d planets\n", 
         10); 
    if (bytes_written > 0) 
    { 
    Serial_Port_Output(temp_buffer, bytes_written); 
    } 

我想切换到printf直接写入到串行端口。根据我们的编译器的文档,我截获了输出数据以使用串口的函数调用。 (该接口使用块写入:地址和字符数)。

printf函数可能使用字符缓冲区进行格式化,如整数或浮点到文本。

问题:

  1. 哪里缓冲区printf使用格式化? (其他 查询头脑想知道,在我做出更改之前)。
  2. 这是编译器(平台)相关的问题吗?

平台:Arm7tdmi处理器,片上系统(SOC),IAR EW编译器。

+2

这是一个C库的东西比编译器的东西。你有libc的源代码吗?它可能是没有缓冲区,如果它通过字符输出char,但取决于libc实现。 – 2014-10-03 16:01:36

回答

1

它是库而不是编译器相关的,你应该查阅库的文档和可能的源代码。这(也许是出于过期)IAR C Library documentation说:

由于一个完整的格式需要一个很大的空间有几种不同的 格式化之间做出选择。有关更多信息,请参阅 ,请参阅“IAR C编译器参考指南”。

current IAR compiler reference讨论格式的选择,但在大多数情况下,连接器可以自动选择最合适的格式。该文档甚至讨论了如果重建库(您大概需要源许可证)可用的进一步优化。

某些实现(不是专门用于IAR)使用显着的堆栈空间。如果你想完全控制,你可以考虑使用开源的实现,如Tiny printf。它不是一个完整的ISO实现,但适用于许多嵌入式应用程序。

13

这完全是实现特定的。 printf没有义务使用任何缓冲区。当然,它具有与FILEstdout,在printf的情况下)相关联的stdio缓冲区,但是如果程序关闭了缓冲区,则该缓冲区可以是零长度,其中setbuf/setvbufprintf也可能有一个内部缓冲区;对于一个合适的C实现,这将需要自动存储(“在堆栈上”),但没有线程的低质量嵌入式可能会使用静态缓冲区。在任何情况下,printf被指定为好像通过重复调用fputc一样工作,并且它肯定可以用这种方式实现而不需要任何缓冲区。